从应用程序逆向工程校验和算法

逆向工程 艾达 ollydbg 德尔福
2021-07-10 17:05:56

我正在尝试直接从应用程序写入某种文件格式。虽然文件格式本身非常简单,但它包含一个32位校验和我不知道如何计算。

我可以访问一个 Win32 GUI 应用程序(很旧,用 Delphi 7 编码),它写入这些文件,包括校验和。我已经尝试过 Ollydbg 和 IDA Pro Free 来反汇编/调试,但我真的不知道如何开始。

有没有办法追踪数据?由于我知道输出文件,我知道校验和和输入,是否可以设置一个断点“每当值 0x12345678 出现在某处时”,然后我就可以退后一步找到算法?

任何想法我应该如何开始?这方面有什么好的教程吗?

编辑:感谢评论/答案,我能够找到一个设置校验和无效值的函数。我还能够找到两个调用 ReadFile 的函数。第一个似乎是读取文件头看文件是否正常,另一个是由在循环中设置校验和无效的函数调用,文件被分成小块读取然后处理。不幸的是,它没有直接调用函数,调用堆栈显示,从设置校验和无效的函数中,有 6 个函数被调用,直到 ReadFile 完成。是否有某种方法可以跟踪数据,例如每次访问包含文件内容的缓冲区时的断点?

编辑 2:自从第一个缓冲区被填满后,我开始遵循每个命令,但这太可怕了,我现在几个小时进入了​​大约 100 个函数,它只访问了前 6 个字节:有时它读取数据,计算一些东西,但是似乎没有使用该值,如果是 LF 或 CR,则比较单个字节……现在我知道为什么该程序在 Core i7 上加载 10KB 的文件需要几秒钟的时间。它似乎读取 128 字节的块并直接处理该数据,而不是先检查校验和。此外,似乎还涉及多线程。我试图设置一个内存断点,但随后程序崩溃了(OllyDbg 显示了可能发生这种情况的警告)。是否可以“离线”进行向后跟踪,我可以在它第一次读取文件时设置一个起点(我故意损坏了)并设置了一个终点,它设置了校验和不正确的变量。它记录了中间使用的所有寄存器/内存,我可以从它设置校验和不正确的地方退一步。任何的想法?

1个回答

以下是我提出的想法:

  1. 使用CheatEngine的高级内存分析来“每当值 0x12345678 出现在某处时就断点”。

  2. 使用任何合适的调试器(例如OllyDbg)添加条件断点NtWriteFile以在具有特定值的条件下中断。

  3. 使用合适的反汇编程序(例如IDA打开二进制文件,找到导入的文件写入 API 并按照交叉引用进行操作,直到识别出 CRC 计算代码。

  4. 使用签名扫描工具(例如findcryptSnD Reverser Tool)来识别任何广泛使用的 CRC 算法(你可能很幸运)。

如果任何方法不清楚,我可以详细说明。

编辑:现在更彻底地阅读它,我看到你的编辑实际上可以保证一个新问题,但基本上你正在处理的代码似乎小到可以手动跟踪。这意味着继续点击“进入”并遵循该代码和价值观。如果您很难跟踪跟踪,您可能想要多次这样做。否则,如果您确定一个缓冲区被多次写入,您可以对其进行内存断点。另一种方法可能是在 IDA 中打开文件并手动检查代码。IDA 使静态读取代码更容易,并且还允许具有一些调试功能。