【发布时间】:2025-12-25 23:55:11
【问题描述】:
我正在尝试了解 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。这里有什么问题?
【问题讨论】:
-
您是在逐个跟踪汇编语言指令吗?更重要的是,您可以使用调试器在
call eax之前停止执行吗?如果是这样,在你call eax之后执行的下一个 instruction 是什么?我的直接问题是:就在崩溃发生之前要执行的指令是什么? -
@User.1 在我计算的地址上,调试器中没有反汇编指令,就像,问题遍布窗口
0186AD60 ??等,所以我认为地址不正确. -
应用崩溃前执行的指令是什么?
-
@User.1 我真的看不到这一点,但如果我进入,我会在地址
0x0146AD60的第一行收到错误Unable to step, Operation not supported. Unknown error 0x92330010 -
"...but if i do step into..."变成什么?当您尝试介入时,您的调试器在哪里?哪条指令?
标签: c assembly memory-address virtual-address-space