如何在二进制代码中找到函数边界

问题描述 投票:0回答:3

我发现二进制翻译通常是基于跟踪的。是因为看不到功能的边界吗?二进制代码中有函数标签吗?

c executable trace
3个回答
2
投票

这个问题没有简单的答案。您可以搜索

ret
指令,但它们不能保证它们是函数边界,因为您可以从函数中间返回。

搜索类似的东西

mov   ebp, esp 

在一定程度上会起作用,但同样,这并不能保证。

某些编译器(最著名的是英特尔编译器)会将分支块移动到函数结束后,然后跳回函数...


0
投票
基于痕迹是什么意思?你的问题的基本答案是否定的,机器代码中没有函数标签。您可能会寻找特定于每个编译器的模式,并且您还可以使用可执行格式来查找代码中公共函数的入口点。但现在编译器可以进行整个程序优化,从而在机器代码级别模糊函数的概念。


0
投票
查找 C 函数的开始和结束地址的常用方法是打印内存映射并扫描函数的开头。 许多编译器会在内存映射中指定函数长度。

一些编译器提供

#pragma

 或预处理关键字,以允许您将函数分配给特定地址。

抱歉,C语言只提供了函数的起始地址;不是它们的长度。

© www.soinside.com 2019 - 2024. All rights reserved.