用于在二进制可执行文件中定位感兴趣部分的可用工具和技术

逆向工程 拆卸 工具 可执行
2021-06-10 11:16:10

如果我想弄清楚程序如何完成某个任务或它如何处理未知的数据结构或格式,我可以使用哪些技术和工具来快速有效地定位感兴趣的二进制部分以开始回答这些问题?

作为一个具体的例子,假设我试图弄清楚游戏客户端如何计算和验证校验和。我在没有任何初始反汇编的情况下观察到以下属性:

  • 该校验和用于验证游戏内物品统计数据是否合法。
  • 校验和正在客户端执行。
  • 它是一个 2 字节的校验和。

我所做的是用我自己的校验和签名输入特定项目,以便在我拆卸它时可以在内存中识别它。一旦我获得了内存中的位置,我就会在它被访问时设置一个内存断点。从那里我只是回溯控制流的来源。

虽然经过大量反复试验花了很长时间,但我最终找到了负责此校验和计算的代码部分,并成功地重新创建了一个执行此操作的 C 程序。

我使用的方法的另一个问题是可能存在很多“误报”。我正在监视的内存位置可以被程序的各个部分访问,而这些部分与校验和计算无关——因此试错就在这里。

问这个问题的重点是,有没有更简单的方法来解决这个问题?如果我想确定程序使用的关键数据结构怎么办?如何识别“不易观察”的函数和计算?并非程序中使用的所有值都可以使用像作弊引擎这样的内存扫描器轻松隔离。

1个回答

IMO 识别校验和算法比通过白盒(即比较缓冲区及其校验和)确定它更容易和可靠,除非校验和是微不足道的,您可能会通过更改数据的最后一个字节很快发现。

任何一个:

  • 尽快在可能是校验和值的数据部分(结束?)设置内存读取断点,然后进一步执行
  • 滚动 IDA 中的每个函数以标记那些可能是校验和的函数 - 复杂的函数通常具有非常不同的 ASM。
    • 如果没有,也许校验和是内联的并且是一个简单的 - 您可能想要搜索 shift/xor/rol 序列