【发布时间】:2018-12-22 16:46:20
【问题描述】:
【问题讨论】:
标签: c reverse-engineering reverse elf
【问题讨论】:
标签: c reverse-engineering reverse elf
简而言之,您反汇编所有导出的函数并查找call 指令。对于每条call 指令,您获取地址操作数并将其标记为另一个函数,然后将其反汇编。递归同上。
从 call 操作数中找到的这些函数就是 IDA 所称的 sub_XXXX。
【讨论】:
如何从编译好的elf文件中提取所有函数,即使函数没有符号
你没有为你定义什么是函数(你确实应该)。
注意,如果编译器有inlined一个函数,它不会出现在ELF文件中,即使它当然存在于源代码中(整个程序可以通过链接时优化构建,例如@ 987654338@ 在编译和链接时;然后你会有很多内联函数,包括几个在源代码中没有标记inline的函数。
原来的源代码可以用visibility技巧编译。
软件构建可能使用了一些code obfuscation 技术。
如果某个函数仅间接调用(想想 C++ 中的虚拟方法,总是通过一些 vtable 调用;或者想想一些 static 函数,其地址被放入某个函数指针变量或struct 字段),那么您实际上无法检测到它,因为要在二进制可执行文件上可靠地执行此操作,需要对某个寄存器或内存位置的所有可能(函数指针)值进行精确分析(即undecidable,见Rice's theorem)。
程序还可以在运行时加载plugin(例如使用dlopen)并调用其中的函数。它还可以在运行时生成一些机器代码(例如在 GNU lightning、asmjit、libgccjit 等的帮助下)并调用这样一个生成的函数。
所以总的来说你无法实现你的目标(特别是如果你假设你的“对手”,即软件作者,使用聪明的技术使函数提取变得困难)。一般来说,decompilation 是不可能的(如果您希望它准确和完整)。
但是,arrowd's answer 提出了一些粗略和不完整的近似。您需要确定这是否足够(甚至 IDA 也给出了近似结果)。
最后,在某些法律系统中,二进制executable 的反编译或reverse engineering 是被禁止的(即使在技术上可行);检查与您的二进制软件和您的情况相关的EULA 或合同(或法律)。您确实应该验证您正在尝试做的事情是否合法(可能不合法,在某些情况下您可能会面临坐牢的风险)。
顺便说一句,所有这些原因就是为什么我更喜欢始终使用free software,其源代码已发布并且可以研究和改进。我愿意避开proprietary software。
【讨论】: