如果我想弄清楚程序如何完成某个任务或它如何处理未知的数据结构或格式,我可以使用哪些技术和工具来快速有效地定位感兴趣的二进制部分以开始回答这些问题?
作为一个具体的例子,假设我试图弄清楚游戏客户端如何计算和验证校验和。我在没有任何初始反汇编的情况下观察到以下属性:
- 该校验和用于验证游戏内物品统计数据是否合法。
- 校验和正在客户端执行。
- 它是一个 2 字节的校验和。
我所做的是用我自己的校验和签名输入特定项目,以便在我拆卸它时可以在内存中识别它。一旦我获得了内存中的位置,我就会在它被访问时设置一个内存断点。从那里我只是回溯控制流的来源。
虽然经过大量反复试验花了很长时间,但我最终找到了负责此校验和计算的代码部分,并成功地重新创建了一个执行此操作的 C 程序。
我使用的方法的另一个问题是可能存在很多“误报”。我正在监视的内存位置可以被程序的各个部分访问,而这些部分与校验和计算无关——因此试错就在这里。
问这个问题的重点是,有没有更简单的方法来解决这个问题?如果我想确定程序使用的关键数据结构怎么办?如何识别“不易观察”的函数和计算?并非程序中使用的所有值都可以使用像作弊引擎这样的内存扫描器轻松隔离。