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

时间:2018-12-22 06:27:36

标签: c reverse-engineering reverse elf

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

enter image description here

2 个答案:

答案 0 :(得分:4)

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

IDA称为call,是从sub_XXXX操作数中找到的这些函数。

答案 1 :(得分:1)

  

如何从编译的elf文件中提取所有功能,即使该功能没有符号

您没有为您定义什么功能(您确实应该)。

请注意,如果编译器具有inlined功能,即使它在源代码中当然存在,它也不会出现在ELF文件中(整个程序可以通过链接时优化来构建,例如g++ -flto -O2,同时在编译和链接时;那么您将具有许多内联函数,包括在源代码中被 not 标记为inline的多个内联函数。

原始源代码可能已经使用visibility技巧进行了编译。

该软件版本可能使用了一些code obfuscation技术。

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

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

因此,通常您无法实现目标(尤其是假设您的“对手”(软件编写者)使用聪明的技术来使该函数提取变得困难)。通常,decompilation是不可能的(如果您希望它精确且完整)。

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

最后,在某些法律体系中,禁止反编译或二进制reverse engineeringexecutable(即使在技术上可行);检查与您的二进制软件和您的情况有关的EULA或合同(或法律)。您确实应该验证您试图做的事是合法的(可能不合法,在某些情况下您可能会面临入狱的风险)。

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