我正在尝试学习逆向工程,但我被这件小事困住了。我有这样的代码:
.text:10003478 mov eax, HWHandle
.text:1000347D lea ecx, [eax+1829B8h] <------
.text:10003483 mov dword_1000FA64, ecx
.text:10003489 lea esi, [eax+166A98h]<------
.text:1000348F lea edx, [eax+11FE320h]
.text:10003495 mov dword_1000FCA0, esi
我想知道,它在 C 或 C++ 中看起来如何?尤其是箭头所指的两条指令。 HWHandle
是一个变量,它保存从 GetModuleHandle()
函数返回的值。
更有趣的是,在这条指令下面的几行中,dword_1000FCA0
被用作一个函数:
.text:1000353C mov eax, dword_1000FCA0
.text:10003541 mov ecx, [eax+0A0h]
.text:10003547 push offset asc_1000C9E4 ; "\r\n========================\r\n"
.text:1000354C call ecx
这将在我的游戏控制台中绘制此文本。伙计们,你们有什么想法吗?
最佳答案
LEA 只不过是一个算术运算:在那种情况下,ECX 只是用 EAX+offset 填充(地址本身,而不是指向的内容)。如果 HWHandle 指向一个(非常大的)结构,ECX 将只是其成员之一。
这可能是关联的源代码:
extern A* HWHandle; // mov eax, HWHandle
B* ECX = HWHandle->someStructure; // lea ecx, [eax+1829B8h]
后来,B 的一个成员被用作函数。
*(ECX->ptrFunction(someArg)) // mov ecx, [eax+0A0h]
// call ecx
关于c++ - 如何通过反汇编从 C++ 函数中获取 "lea"指令?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9513852/