我试图了解 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 调试会话中,malloc 地址位于0x0146AD60
. 这里有什么问题?