通过 ebp 调用函数

逆向工程 艾达 视窗 职能 登记
2021-06-12 04:22:43

当我用 Ida 查看 exe 文件时,我看到

call dword ptr [ebp -70p]

那是什么?为什么这个函数由 ebp 调用而不是call sub_0xabcd

我怎么知道哪个函数是进入这个函数的,看看那里会发生什么?

2个回答

造成这种情况的原因可能有很多,从无害的方法指针作为局部变量到混淆(您展示的程序集极不可能)。至于如何跟随它,您可以BP呼叫并跟随它或跟踪帧指针以查看它的设置。

call带有局部变量的指令表明它可能是函数指针但是函数指针可以在很多情况下使用。最简单的例子是原始 C 风格的函数指针。

  • 使用的 MSVC 命令: cl.exe /MDd file.c
  • 环境:Intel X86
  • 示例 C 代码:
#include <stdio.h>

void func(int a) {
    printf("%d\n", a);
}

int main(void) {
    void (*func_ptr)(int) = &func;
    (*func_ptr)(10);
}
  • 仅带有函数指针调用的 IDA 汇编视图:
mov     dword ptr [ebp-4], offset func  ; move function pointer to stack
push    10                              ; push 10 for first parameter
call    dword ptr [ebp-4]               ; call the function pointer
add     esp, 4
  • 其他情况:

    • 函数指针可以通过调用GetProcAddress() 获取导出函数地址的函数来返回
    • 函数指针可以是实例化对象的方法。
    • 它可能是一个可以在运行时解析虚拟方法
    • 它可能是一个真正的函数调用,但在解析函数导入之前,二进制文件从内存中转储(视频)。

怎么知道那里发生了什么?将其加载到调试器中。在该间接调用中设置断点并遵循其执行过程。也判断其他子程序。