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


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

我不需要完整的调用图,只需要给定特定参数的调用图/控制流即可。我所做的唯一逆向工程是binutils + gdb + strace的相对基础的东西。本质上,我只需要一个软件就可以将“ call”和“ ret”对配对,并将“ call”指令的目标地址转换为人类可读的符号名称。希望生成一个可读的2D图形图像,以带给我应用程序执行的感觉。

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

编辑:我不想为任何事情付出代价或运行Windows来做到这一点。如果可能的话,我希望能够在Linux上本机运行。

#1 楼

Radare2还能够仅基于其二进制代码来收集程序的调用图。

前一段时间,我问了一个与您的问题相关的问题,并且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中,我使用了Radare2提示符下的xdot软件,但是可以在Radare2 shell之外进行(当然)。安德鲁·麦克唐纳(Andrew McDonnell)在2015年在奥克兰发表的演讲(幻灯片26-27)。

#2 楼

除直接递归和重复项外的所有(调用方,被调用方)元组:

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


#3 楼

您可以使用IDA Pro生成调用图:
(来源:hex-rays.com)

评论


我一直认为IDA是Windows特定的。每天学习新东西...编辑:我将保留我的意见,因为我没有指定“免费”,但IDA的免费版本是一个exe。

–Parthian Shot
2015年6月10日在21:12



根据WineHQ的说法,当在Wine上运行时,IDA的图形视图在IDA 5.0的免费版本中效果很好。

–詹森·格夫纳(Jason Geffner)
2015年6月10日在21:58

好点子。现在进行测试。 :)

–Parthian Shot
2015年6月10日22:39