IDA可以做到这一点:一些没有符号的函数将以'sub_address'命名。 如何在运行时执行此操作。
答案 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 lightning,asmjit,libgccjit等),它也可能会生成一些机器代码,并调用这种生成的函数。
因此,通常您无法实现目标(尤其是假设您的“对手”(软件编写者)使用聪明的技术来使该函数提取变得困难)。通常,decompilation是不可能的(如果您希望它精确且完整)。
但是,arrowd's answer提出了一些粗略和不完全的近似。您需要确定是否足够(甚至IDA都给出了近似结果)。
最后,在某些法律体系中,禁止反编译或二进制reverse engineering的executable(即使在技术上可行);检查与您的二进制软件和您的情况有关的EULA或合同(或法律)。您确实应该验证您试图做的事是合法的(可能不合法,在某些情况下您可能会面临入狱的风险)。
顺便说一句,所有这些原因就是为什么我更喜欢始终使用free software的原因,其源代码已发布并且可以研究和改进。我愿意避免使用proprietary software。