我无法设置断点,因为在您单击提交时会发送分数并且游戏时间仍在运行。
关于使用Ollydbg查找散列发生位置的任何建议?
如果游戏仍在运行,您将如何设置断点?
#1 楼
以下是找到哈希算法(以及从那里调用它的调用者)的几种不同方法,所有这些方法都可以静态完成(因为您说过在运行时设置断点很麻烦):搜索反汇编中的MD5常量,例如
67452301
,d76aa478
等。搜索反汇编中的字符串
"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()
的调用应清晰可见。
评论
它不能被散列,因为服务器将如何知道分数值?我认为您的意思是加密的。如何在Winsock发送API上设置断点?正在散列:它发送未散列值和散列值。服务器也知道秘密。当服务器接收到未哈希值时,它将对其进行哈希处理,并检查所得哈希与发送的哈希是否相同...
您可以使用findcrypt for IDA查找哈希函数并在此处中断。从那里开始,堆栈一直跟踪直到找到具有秘密的调用方。
@AcidShout:我已经下载了IDA免费版,并在plugins文件夹中包含了findfin插件(来自IDA的官方网站)。我收到一个错误:过程条目point_callui不能位于动态链接库IDA.WLL中,我正在使用Win7 64位
@Komiblanka,因为该插件与IDA Free不兼容。也许您应该尝试最近的演示(我不确定它是否支持插件),或获取IDA Pro的副本,IDA Pro的价格昂贵,但它是倒车的必备工具。