给定一个指令地址,可以确定包含它的函数的起始地址吗?

时间:2012-05-29 02:21:33

标签: compiler-construction x86 reverse-engineering decompiling disassembly

我在当前的项目中遇到了这个问题,这需要推理二进制级别的代码。

我认为我们可以通过查看CALL指令的操作数来确定程序中所有函数的起始位置。在我们有了这个列表后,我们可以通过简单地向后搜索直到找到起始地址来确定哪个函数包含一个地址吗? IE是包含指令的函数的起始地址,该指令的最大函数地址小于指令地址?

如果上述方法不正确,是否有其他方法可以找到包含指令的函数的起始地址?

编辑: 添加了对问题的澄清。

EDIT2: 我的方法可能是错的。编译器不保证将函数体放在机器代码的连续区域中。

2 个答案:

答案 0 :(得分:3)

您需要更多地约束您的问题空间。即使仅限于“编译语言的输出”,编译器现在也善于模糊功能之间的界限。内联意味着一个函数可以包含在另一个函数中。尾调用优化在没有CALL指令的情况下在两个函数之间传输控制。配置文件引导的优化可以创建不连续的功能。代码流分析和noreturn提示可能导致代码落入数据。跳转表意味着数据可以在没有CALL目标的情况下进入代码。唯一可靠的方法是让编译器明确告诉您指令到函数的映射,比如通过调试信息。你没有说你正在使用什么平台,所以很难提供更具体的信息。

答案 1 :(得分:0)

不,汇编代码可以做各种各样的时髦事情。一个调用可能完全跳过另一个函数,向后跳转,或跳转到另一个模块。