高分作为散列发送

逆向工程 ollydbg 散列函数
2021-06-19 11:17:13

有一款游戏是用 Unity 创建的,我正试图击败它。它将您的高分发送到一个网站并在那里发布。

我已经嗅探出传出流量,游戏会发送您的用户名、您的分数以及 MD5 哈希值。

查看一些在线教程(我也猜这个),哈希由以下内容组成:

 MD5(user:USERNAME, score:SCORE, SALT)

你可以猜到,我知道用户名和分数,但我不知道秘密。我试图在 Ollydbg 中找到这些字符串,但我在找到它时遇到了一些麻烦。

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

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

2个回答

这里有几种不同的方法来查找散列算法(从那里,它的调用者),所有这些都可以静态完成(因为你说你在运行时设置断点有问题):

  1. 搜索拆装MD5常数,如67452301d76aa478等。
  2. 在反汇编中搜索字符串"MD5"对该字符串的引用。
  3. 在反汇编中搜索出现在包含哈希的网络数据包数据中的任何字符串/常量。例如,如果网络数据包数据为<user>Komiblanka</user><highscore>1000</highscore><hash>8b1a9953c4611296a827abf8c47804d7</hash>,则搜索"highscore"

如果这些没有提供富有成效的结果,您可以在ws2_32!send() 的OllyDbg 中设置一个断点,一旦您看到它发送包含分数哈希的缓冲区,请查看调用堆栈以找到之前涉及的函数。

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

快速搜索 Unity 脚本参考会显示Windows.Crypto.ComputeMD5Hash()
这个功能需要由Unity Engine来实现。

要么使用 Windows Api - 所以设置断点CryptCreateHash()CryptHashData()

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

// 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()应该很明显。