如何在反汇编的 ELF 可执行文件中查找(区分)库代码?

Posted

技术标签:

【中文标题】如何在反汇编的 ELF 可执行文件中查找(区分)库代码?【英文标题】:How to find (distinguish) library code in disassembled ELF executable? 【发布时间】:2020-07-09 08:25:57 【问题描述】:

在反汇编的 ELF 文件中,我需要将我编写的代码与编译器插入的代码与外部库(如 capstone 或任何你想要的)区分开来。当我到达一个名为 .为了浏览 ELF 部分,我使用了 ghidra。

【问题讨论】:

动态库中的代码不在您的 ELF 文件中。 您是在谈论来自inline 头文件中定义的函数的代码吗? (在 C++ 中更常见,但在 C 中可能。)编译器可以选择发出一个独立的定义和call 它,而不是在每个调用点实际内联这些函数。但通常在头文件中定义的任何库函数都足够小,编译器会内联它们。 我需要找到一种方法来查看除了我写的代码之外还插入了哪些代码,这就是我所说的。对不起,如果我写了一些让你感到困惑的东西 【参考方案1】:

如果二进制文件没有被剥离,那么您应该能够仅通过函数名称来区分函数。例如,如果一个函数被称为main,那么它就是您编写的代码,如果它被称为malloc,那么它在libc 中。此外,如果二进制文件是动态链接的,那么外部调用应该在 GHIDRA 中显示。但是,如果二进制文件是静态链接并且被剥离的,那么你只需要猜测。

【讨论】:

是的,这是真的。在 Ghidra 中我可以识别它们。它创建了另一个称为外部的部分。我需要在 ghidra 之外找到一个模式,这样我就可以在任何精灵中识别这些调用,而无需调试信息。在 ghidra 中,我只能找到指向 .plt ->.got -> 的指针。我看不到被调用函数的代码,这就是我需要做的事情 可以反汇编外部库。你可以通过运行ldd filename查看外部库。 是的,但据我了解,编译器在我的 ELF 中插入了一些代码。这就是我要确定的,而不是反汇编外部库 如果你只是想反汇编你的代码,那么不要看外部调用。 我想看看除了我的代码之外在我的ELF中插入了哪些代码如果有

以上是关于如何在反汇编的 ELF 可执行文件中查找(区分)库代码?的主要内容,如果未能解决你的问题,请参考以下文章

6C_宏定义与预处理函数与函数库

ELF文件格式分析

Android 逆向使用 Python 解析 ELF 文件 ( Capstone 反汇编 ELF 文件中的机器码数据 | 完整代码示例 ) ★★★

ELF 可执行文件的起点?

如何将文本文件的内容添加为 ELF 文件中的一个部分?

ELF文件格式解析