我试图了解 PE 文件中寻址的基础知识,我制作了一个简单的应用程序,其中包含几个调用 malloc
的函数,这些函数静态链接到 msvcr110 库。所以我把我生成的可执行文件在 ida pro 中打开它,找到未导入的 malloc
函数的偏移量,添加基地址并尝试像这样调用它:
HMODULE hCurrentModule = GetModuleHandle(NULL); // get current module base addres
DWORD_PTR hMallocAddr = (0x0048AD60 + (DWORD_PTR)hCurrentModule);
char *pointer;
__asm //calling malloc
{
push 80
mov eax,dword ptr[static_addr]
call eax
add esp,2
mov [pointer],eax
}
然后我检查了 IDA pro 中重新构建的程序,以确保 malloc 偏移量保持不变并且它仍然是 0x0048AD60
。所以问题是 offset+hCurrentModule 给了我不正确的地址,并且在我调用这个地址后崩溃了。例如,我的 hMallocAddr
的结果是 0x0186AD60
但在反汇编窗口的 MSVC 调试 session 中 malloc 地址是 0x0146AD60
。这里有什么问题?
最佳答案
0x0048AD60
不是 malloc 的偏移量,而是 EXE 加载到其默认加载地址 0x00400000 时函数的实际地址。减去该值以获得距图像开头的偏移量。
关于可移植可执行文件中虚拟地址的计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25189234/