【问题标题】:How to extract all functions out of a compiled elf file,even the function has no symbol [closed]如何从编译的elf文件中提取所有函数,即使函数没有符号[关闭]
【发布时间】:2018-12-22 16:46:20
【问题描述】:

IDA 可以做到这一点:一些没有符号的函数将命名为 'sub_address'。 如何在运行时执行此操作。

enter image description here

【问题讨论】:

    标签: c reverse-engineering reverse elf


    【解决方案1】:

    简而言之,您反汇编所有导出的函数并查找call 指令。对于每条call 指令,您获取地址操作数并将其标记为另一个函数,然后将其反汇编。递归同上。

    call 操作数中找到的这些函数就是 IDA 所称的 sub_XXXX

    【讨论】:

      【解决方案2】:

      如何从编译好的elf文件中提取所有函数,即使函数没有符号

      你没有为你定义什么是函数(你确实应该)。

      注意,如果编译器有inlined一个函数,它不会出现在ELF文件中,即使它当然存在于源代码中(整个程序可以通过链接时优化构建,例如@ 987654338@ 在编译和链接时;然后你会有很多内联函数,包括几个在源代码中没有标记inline的函数。

      原来的源代码可以用visibility技巧编译。

      软件构建可能使用了一些code obfuscation 技术。

      如果某个函数间接调用(想想 C++ 中的虚拟方法,总是通过一些 vtable 调用;或者想想一些 static 函数,其地址被放入某个函数指针变量或struct 字段),那么您实际上无法检测到它,因为要在二进制可执行文件上可靠地执行此操作,需要对某个寄存器或内存位置的所有可能(函数指针)值进行精确分析(即undecidable,见Rice's theorem)。

      程序还可以在运行时加载plugin(例如使用dlopen)并调用其中的函数。它还可以在运行时生成一些机器代码(例如在 GNU lightningasmjitlibgccjit 等的帮助下)并调用这样一个生成的函数。

      所以总的来说你无法实现你的目标(特别是如果你假设你的“对手”,即软件作者,使用聪明的技术使函数提取变得困难)。一般来说,decompilation 是不可能的(如果您希望它准确和完整)。

      但是,arrowd's answer 提出了一些粗略和不完整的近似。您需要确定这是否足够(甚至 IDA 也给出了近似结果)。

      最后,在某些法律系统中,二进制executable 的反编译或reverse engineering 是被禁止的(即使在技术上可行);检查与您的二进制软件和您的情况相关的EULA 或合同(或法律)。您确实应该验证您正在尝试做的事情是否合法(可能不合法,在某些情况下您可能会面临坐牢的风险)。

      顺便说一句,所有这些原因就是为什么我更喜欢始终使用free software,其源代码已发布并且可以研究和改进。我愿意避开proprietary software

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-03-12
        • 1970-01-01
        • 1970-01-01
        • 2012-12-26
        • 1970-01-01
        • 1970-01-01
        • 2016-07-06
        • 1970-01-01
        相关资源
        最近更新 更多