可移植可执行文件中虚拟地址的计算

标签 c assembly memory-address virtual-address-space

我试图了解 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/

相关文章:

c - 通过引用获取功能修改结构

c - “post”在sem_post中代表什么?

c - 在 C 中确定文件类型

c - 这两条指令在下面的函数中做了什么?

python - python 中重写 __str__ 方法后如何获取实例的地址

c - C 中指向无效位置错误的指针

C 数组初始化出现错误

c++ - 如何在 visual studio 2017 中使用 zlib 库?

c++ - 优化 Microsoft Visual Studio 编译器生成的程序集

java - JVM 上的汇编编程?