如何在二进制代码中查找函数边界
我看到二进制翻译通常是基于跟踪的。 是因为人们无法获得function的界限吗? 二进制代码中是否有函数标签?
对此没有什么微不足道的答案。 您可以搜索ret
指令,但它们不能保证它们是函数边界,因为您可以从函数中间返回。
正在寻找像这样的东西
mov ebp, esp
将在某种程度上起作用,但同样,这不是保证。
一些编译器(最值得注意的是英特尔编译器)将在函数结束后移动分支块,然后跳回到函数中……
基于跟踪的意思是什么? 你的问题的基本答案是否定的,机器码中没有function标签。 可能有一些特定于您可以查找的编译器的模式,您还可以使用可执行格式在代码中查找公共函数的入口点。 但是现在编译器可以进行整个程序优化,在机器代码级别模糊函数的概念。
查找C函数的开始和结束地址的常用方法是打印出内存映射并扫描函数的开头。 许多编译器将在内存映射中指定函数长度。
某些编译器提供#pragma
或预处理关键字,以允许您将函数分配给特定地址。
抱歉,C语言只提供函数的起始地址; 不是他们的长度。