我正在尝试用Unity创建一个游戏。它会将您的高分发送到一个网站并发布到该网站。 >看一些在线教程(我也猜到了),哈希由以下内容组成:知道用户名和分数,但我不知道秘密。我正在尝试在Ollydbg中找到这些字符串,但在查找字符串时遇到了一些麻烦。

我无法设置断点,因为在您单击提交时会发送分数并且游戏时间仍在运行。

关于使用Ollydbg查找散列发生位置的任何建议?
如果游戏仍在运行,您将如何设置断点?

评论

它不能被散列,因为服务器将如何知道分数值?我认为您的意思是加密的。如何在Winsock发送API上设置断点?

正在散列:它发送未散列值和散列值。服务器也知道秘密。当服务器接收到未哈希值时,它将对其进行哈希处理,并检查所得哈希与发送的哈希是否相同...

您可以使用findcrypt for IDA查找哈希函数并在此处中断。从那里开始,堆栈一直跟踪直到找到具有秘密的调用方。

@AcidShout:我已经下载了IDA免费版,并在plugins文件夹中包含了findfin插件(来自IDA的官方网站)。我收到一个错误:过程条目point_callui不能位于动态链接库IDA.WLL中,我正在使用Win7 64位

@Komiblanka,因为该插件与IDA Free不兼容。也许您应该尝试最近的演示(我不确定它是否支持插件),或获取IDA Pro的副本,IDA Pro的价格昂贵,但它是倒车的必备工具。

#1 楼

以下是找到哈希算法(以及从那里调用它的调用者)的几种不同方法,所有这些方法都可以静态完成(因为您说过在运行时设置断点很麻烦):


搜索反汇编中的MD5常量,例如67452301d76aa478等。
搜索反汇编中的字符串"MD5"和对该字符串的引用。
搜索反汇编中出现在字符串中的所有字符串/常量。包含哈希的网络数据包数据。例如,如果网络数据包数据是<user>Komiblanka</user><highscore>1000</highscore><hash>8b1a9953c4611296a827abf8c47804d7</hash>,则搜索"highscore"。它发送包含分数哈希的缓冲区,查看调用堆栈以查找涉及的先前功能。

评论


我为此使用的一种快捷方式是使用peid中的kanal插件。我通常能够找到这些常量表,并从那里设置内存访问断点。

– Gandolf
2015年2月26日在13:51



#2 楼

正如您提到的OllyDbg一样,我假设您使用的是Windows。

快速搜索Unity脚本参考会弹出Windows.Crypto.ComputeMD5Hash()。
此功能需要由Unity Engine。

使用Windows Api-在CryptCreateHash()CryptHashData()上设置一个断点

,或者手动实现它。要发现您可以使用Jason Geffner的答案OR(可能会更快),请编写您自己的使用这个函数的小型unity脚本,并对其进行调试以查找地址。

// http://docs.unity3d.com/Manual/CreatingAndUsingScripts.html
using UnityEngine;
using System.Collections;

public class MainPlayer : MonoBehaviour {

    // Use this for initialization
    void Start () {
        byte[] buf = {1, 2, 3};
        ComputeMD5Hash(buf);
    }

    // Update is called once per frame
    void Update () {

    }
}


现在,当您查看CIL代码时,对ComputeMD5Hash()的调用应清晰可见。