为什么 ida 中的函数比我的源代码多这么多?

逆向工程 艾达 拆卸 C++ C
2021-07-01 23:41:43

我正在尝试学习如何使用 IDA Pro 6.8 来分析二进制文件。但是,ida 函数列表中的函数比我的代码多得多。比如源码中有一个函数,调用了一个类的四个被调用函数、两个全局函数和两个公共函数。但是,在 ida 中,如果我打印line.points.size(). 它被认为是 ida 中的一个函数。line 是我的班级,points 是 line 的向量变量。ida 中的函数名为std::vector<std::vector<Point *,std::allocator<Point *>>,std::allocator<std::vector<Point *,std::allocator<Point *>>>>::size(void). 因此导致被调用者的数量与源中的数量不相等。为什么在我的源代码中有更多没有定义为函数的函数?如何识别ida中哪个函数是我定义的函数,哪个是ida添加的?

2个回答

您刚刚发现为什么模板会被指责为代码膨胀。

该函数不是由 IDA 添加的,而是由编译器在扩展模板化类std::vector<std::vector<Point*>>并生成其所有成员函数时添加的。每个具有不同模板参数的 std::vector 都被视为单独的类型。因此 std::vector<int>::size()std::vector<float>::size()是单独的函数,但是具有足够高优化设置的足够智能的编译器/链接器将看到两者的代码完全相同并能够将它们组合起来。

编译器必须将您知道的语言(C++)翻译成计算机知道的语言。然后链接器将您的代码与引用的库链接在一起并创建一个可执行文件。为了把它变回你可以阅读的形式,IDA 读取计算机的语言并将其翻译成反汇编。编译和反汇编都是复杂的过程。 反汇编本身就是一个难题,包括函数识别和边界检测。除了反汇编过程中的不准确之外,可执行构建过程还做了几件事。

首先,你的源代码被翻译成机器代码,所有现代编译器都有各种启发式和规则来优化代码。查看gcc文档和 Visual Studio文档有时这意味着减少函数的数量(例如,内联),有时意味着增加(例如,thunk)。

其次,无论是隐式还是显式,您的源代码都引用了许多其他源代码,包括包含和包含在这些包含的文件中,以及包含在这些包含的文件中......其中一些导致链接器动态链接(添加对) 库,其中一些会导致链接器静态链接(复制并附加到您的代码)这些库。