如何通过反汇编从C++函数中获取"lea"指令?

Blo*_*ood 4 c c++ x86 assembly

我正在努力学习逆向工程,而且我仍然坚持这个小东西.我有这样的代码:

.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
Run Code Online (Sandbox Code Playgroud)

我想知道,它在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
Run Code Online (Sandbox Code Playgroud)

这将在我的游戏控制台中绘制此文本.伙计们,你有什么想法吗?

qdi*_*dii 5

LEA只不过是算术运算:在这种情况下,ECX只是填充了EAX +偏移量(非常地址,而不是指向的内容).如果HWHandle指向(非常大)的结构,ECX将只是其成员之一.

这可能是一个相关的源代码:

extern A* HWHandle;                 // mov     eax, HWHandle
B* ECX = HWHandle->someStructure;   // lea     ecx, [eax+1829B8h]
Run Code Online (Sandbox Code Playgroud)

然后,B的一个成员被用作函数.

*(ECX->ptrFunction(someArg))        // mov     ecx, [eax+0A0h]
                                    // call    ecx
Run Code Online (Sandbox Code Playgroud)