如何从未剥离的 x86 Linux ELF 生成调用图?

逆向工程 x86 linux 小精灵 可视化
2021-06-29 04:10:31

有一个软件,我只有二进制文件,没有源代码。它的:

  • 未混淆(因此,不是多态或任何东西。不过它已优化了一点)
  • 未剥落的
  • x86 32 位
  • 值得信赖(不是可疑的恶意软件)
  • 从 C++ 编译(基于符号表的内容)
  • 可能使用 JNI(有几个原因;部分原因是它有相当数量的 UTF-16 字符串)

我不需要完整的调用图,只需要给定某些参数时的调用图/控制流。我所做的唯一逆向工程是使用 binutils + gdb + strace 的相对基本的东西。本质上,我只需要一个软件来匹配“call”和“ret”对,并将“call”指令目的地翻译成它们人类可读的符号名称。希望生成一个可读的 2D 图形图像,让我对应用程序执行有一种感觉。

所以,有些东西可以映射控制流。它只是一个单一的二进制文件(具有一些动态库依赖项),但它足够大,手动跟踪将非常耗费人力。

编辑:我不想支付任何费用或运行 Windows 来执行此操作。如果可能的话,我希望能够在 Linux 上本地运行一些东西。

4个回答

Radare2还能够仅基于其二进制文件收集程序的调用图

前段时间,我问了这个与您有某种关系的问题,Radare2 的一位作者回答说:

然而,如果你想要调用图的图形表示,这里是这样做的方法:

$> radare2 /usr/bin/md5sum
... start of radare2 ...
[0x00402427]> aa
[0x00402427]> afl
[0x00402427]> ag > b.dot
[0x00402427]> !xdot b.dot

aa命令收集有关已分析二进制文件的信息。然后,该afl命令收集有关所有函数调用站点的信息(地址、大小、bbs、名称)。最后,该ag命令输出所收集数据的 graphviz 表示。请注意,我们将数据转储到文件中b.dot,我xdot从 Radare2 提示符使用了该软件,但它可以在 Radare2 shell 之外完成(当然)。

在 2015 年 Andrew McDonnell 在奥克兰的一次演讲中发现了这种做法(幻灯片 26-27)。

所有(调用者,被调用者)元组,除了直接递归和重复:

objdump -d $BINARY_FILENAME \
| grep '<' \
| sed -e 's/^[^<]*//' \
| sed 's/<\([^+]*\)[^>]*>/\1/' \
| awk 'BEGIN { FS = ":" } \
       NF>1 { w=$1; } \
       NF==1 && w != $1 { print "(\"" w "\", \"" $0 "\")," }' \
| sort -u

您可以使用IDA Pro生成调用图:

调用图
(来源:hex-rays.com

您可以使用Ghidra为各种二进制文件生成调用图,包括 x86 Linux ELF 二进制文件。