3

我试图了解 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. 这里有什么问题?

4

2 回答 2

2

0x0048AD60不是malloc的偏移量,而是当EXE在其默认加载地址0x00400000加载时函数的实际地址。减去此值以获得从图像开始的偏移量。

于 2014-08-07T18:21:35.053 回答
1

我看到一个我不明白的东西,第一条指令;你推送一个值,但永远不要弹出它。当您添加 2 时esp,您是否正在尝试修复堆栈?编译器可以“帮助”您将其优化为 8 位值吗?

不能保证,但这些是我第一眼看到的东西;但同样,我不在那里,也看不到调试屏幕

{
    push 80                           ;Where do you pop this ?
    mov eax,dword ptr[static_addr]
    call eax
    add esp,2                         ;Is this the "pop" ? Possible bug, is "80" a 16 bit value ?
    mov [pointer],eax
} 

沿着同一条线,我不完全确定您的应用程序是如何构建的,但是您可以安全地使用Eax而无需在之前推送和之后弹出的情况下使用吗?不知道这是否会有所不同,这只是粗略查看代码的结果。

于 2014-08-07T18:32:19.970 回答