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

标签 c++ c assembly x86

我正在尝试学习逆向工程,但我被这件小事困住了。我有这样的代码:

.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/

相关文章:

assembly - Yasm 与 64 位指令

c++ - 信号 11 可以在从一个寄存器到另一个寄存器的 mov 指令中产生吗?

c - llvm:如何生成避免基于 RIP 的寻址模式的 x64 代码?

c++ - 使用 std::search 搜索 std::string 中的子字符串

c - 排序数组和唯一数组

mysql - fatal error : 'mysql/mysql.h' file not found

c++ - Windows 程序员 (C/C++) 的 Linux 编程有什么技巧吗?

c++ - Qt 如何在连接到其 clicked() 信号的插槽运行时使按钮响应?

c++ - 将 UNIX makefile 测试参数转换为 msbuild for vs2010, C++

C++ 错误枚举和 CRTP