我在VC ++中有以下代码
Func5(){ StackWalk(); }
Func4{ Func5();}
我是x86汇编语言的初学者。我试图找出Func5()的起始地址。我从堆栈帧中获取Func5()的返回地址。在此返回地址之前,应该有一个CALL语句。所以我在返回地址之前提取出字节。
有时它就像E8 ff ff ff d8
一样接近电话。因此,对于此语句,我从函数的返回地址中减去偏移量0x28,以获取Func5()的基址(它驻留在内存中)。
问题是我不知道如何计算间接NEAR呼叫。我一直试图找出如何做一段时间。所以我在返回地址之前提取了前5个字节,它们是ff 75 08 ff d2
我认为这代表CALL ECX (ff d2)
,但我不确定。
如果有人能告诉我这是什么类型的CALL声明以及如何通过这种调用计算函数的基地址,我将非常感激。
答案 0 :(得分:1)
告诉编译器和链接器生成详细的映射文件。我不知道最近的版本,但过去可以请求链接的汇编语言转储,包括操作码。
答案 1 :(得分:1)
对于拆卸事物,最简单的方法是使用反汇编程序。
假设32位80x86,NDISASM说“ff 75 08 ff d2”是:
00000000 FF7508 push dword [ebp+0x8]
00000003 FFD2 call edx
在这种情况下,函数的地址将在EDX寄存器中。