回溯寄存器被初始化的地方

逆向工程 艾达 CRC 作弊引擎
2021-06-24 05:25:29

我目前正在尝试绕过 CRC 检查,该检查存在于应用程序的许多地方,以检查 .text 部分中的内存页面是否已被修改。

CRC计算例程crc32指令的 简短说明

从第一个操作数(目标操作数)中的初始值开始,为第二个操作数(源操作数)累加一个 CRC32(多项式 11EDC6F41H)值并将结果存储在目标操作数中。

好的:rsi包含下一个被扫描的内存页的指针,它rax是偏移量/计数器。rdx通常为 200(200 个循环)。

我的目标:找到哪里 rsi设置。必须有一些指令,如mov rsi, next_memory_page_to_be_scanned

在代码中更上一层楼: 循环变量的初始化

所以这里是初始化的循环变量 ( rdx,rax)。

更上一层楼:crc的第一条黄色指令

所以这是我被卡住的一件事:黄色标记的部分似乎是我可以在 CRC_CHECK 之前执行的第一个指令。我的意思是其他某个地方显然是这样称呼它的,但我不知道如何找到那个地方。

我试图跟随返回指针: 返回 bs

但返回指针基本上没有指向任何东西。断点上面的一条指令 ( and [rcx], al) 不会触发 bp(似乎与 CRC 检查没有任何关系)。我如何进一步追溯?

rsi当我 bp CRC 时,的值也不在堆栈上。

谢谢!

2个回答

从 Igor 的跟踪建议中跳出来,您是否尝试过通过 Cheat Engine 进行中断和跟踪?如果没有,请考虑以下事项:

  1. 无论是通过字节数组(首先需要 AOB 扫描;确保选择读/写内存)、模块 + 偏移量或符号名称(如果适用),请找到crc32 edi, qword ptr [rsi+rax*8]Cheat Engine 反汇编程序中指令(内存的上半部分)观众)。
  2. 右键单击指令并选择Break and trace instructions
  3. 在随后出现的窗口中,选中Save stack snapshotsStep over instead of single step,然后单击OK
  4. 一旦 Tracer 窗口填充了您的跟踪,请在其中右键单击并选择Expand all
  5. 滚动到树的最远分支,其中最顶部的指令应该是您的crc32 edi, qword ptr [rsi+rax*8]指令。
  6. 单击该Stack按钮并保持打开的窗口(堆栈视图)在 Tracer 窗口旁边。

现在按照记录的指令列表工作(这将带您通过每个分支的呼叫者进行备份)。您可以通过堆栈视图窗口查看右侧的寄存器以及堆栈。您可以双击 Tracer 中的任何指令,将您带到反汇编程序中的该指令,然后您可以在那里阅读来自调用者的子例程。

如果没有足够的分支供您使用,则再次运行跟踪并将跟踪的初始指令数从 1000 更改为您想要的任何数量。此外,如果您找到进入调用者子例程的方法,并且您想深入了解其中的其他调用,只需在调用前的某个时间点运行另一个中断/跟踪,然后不要选择(或取消选择,如果它已经被选中)Step over instead of single step

最后作为另一个提示,在内存查看器中,如果运行Tools -> Dissect Code,则可以选择基本模块和任何其他依赖项来运行一系列自动化任务,例如查找所有引用的字符串和函数,以及查找所有例程的所有外部参照!

外部参照非常适合能够前往任何给定函数的序言(右键单击任何指令并选择Select current function,然后滚动到顶部)并快速查看有多少调用者(其中您可以双击任何去他们那里)。

这使您可以快速查看某个函数是否被共享,从而可能充当补丁的枢轴点ret(或您更喜欢的补丁),或者允许您选择对该特定函数的特定调用指令我想单独打补丁。

听起来该程序正在使用某种混淆。您可能应该从头开始逐步执​​行它或记录指令跟踪以查看它如何最终执行这些指令。