我有一个非剥离的ELF二进制文件,我想为其创建调用图作为点文件。是否有生成调用图的工具?

编辑:除了传统的调用图以外,是否还有其他工具可以根据可执行文件在库之间查找调用图。例如,仅显示从libcpthread的调用图。

#1 楼

您可以使用radare2或以下替代方法之一以点格式生成完整的调用图。

radare2安装

首先,从git仓库安装radare2:

$ git clone https://github.com/radare/radare2.git
$ cd radare2
$ ./sys/install.sh


分析

下载并安装radare2之后,打开您的二进制文件并使用aaa命令对其进行分析:

$ r2 /bin/ls
[0x004049a0]> aaa
[x] Analyze all flags starting with sym. and entry0 (aa)
[x] Analyze function calls (aac)
[x] Analyze len bytes of instructions for references (aar)
[x] Constructing a function name for fcn.* and sym.func.* functions (aan)
[x] Type matching analysis for all functions (afta)
[x] Use -AA or aaaa to perform additional experimental analysis.


输出可视图

ag命令和子命令可以帮助您将可视图形输出为Graphviz格式。

[0x00000000]> ag?
Usage: ag<graphtype><format> [addr]
Graph commands:
| aga[format]             Data references graph
| agA[format]             Global data references graph
| agc[format]             Function callgraph
| agC[format]             Global callgraph
| agd[format] [fcn addr]  Diff graph
| agf[format]             Basic blocks function graph
| agi[format]             Imports graph
| agr[format]             References graph
| agR[format]             Global references graph
| agx[format]             Cross references graph
| agg[format]             Custom graph
| ag-                     Clear the custom graph
| agn[?] title body       Add a node to the custom graph
| age[?] title1 title2    Add an edge to the custom graph

Output formats:
| <blank>                 Ascii art
| *                       r2 commands
| d                       Graphviz dot
... <truncated> ...
| w [path]                Write to path or display graph image (see graph.gv.format and graph.web)


您正在搜索agCd命令。 C指定输出程序的完整(“全局”)调用图。 d指定以Graphviz点格式输出。

[0x004049a0]> agCd > output.dot


dot实用程序是Graphviz软件的一部分,可以使用sudo apt-get install graphviz安装。
您可以查看您可以在任何脱机点查看器中将输出粘贴到在线Graphviz查看器中,甚至可以将点文件转换为PNG:

$ r2 /bin/ls
[0x004049a0]> aa
[x] Analyze all flags starting with sym. and entry0 (aa)
[0x004049a0]> agCd > output.dot
[0x004049a0]> !!dot -Tpng -o callgraph.png output.dot


要了解有关radee2的更多信息,建议

替代品


gen-callgraph-gen-callgraph是从elf二进制文件生成调用图的脚本

IDA Pro-使用CTRL + F12生成GDL(图形描述文件)调用图,将其保存,然后使用以下选项之一将其转换为点文件:


graph-easy-在图形格式之间转换
来自Multimedia Wiki的此perl脚本



IDA的免费版本也能够生成调用图的GDL,但它仅可作为exe使用,请在Linux上使用wine来运行它

评论


是否可以在库或文件之间获得调用图,而不是在函数之间获得调用图?

– 0x90
17年8月13日在19:44

您可以使用il获取二进制文件或rabin2 -l / bin / ls使用的库,它们相同

–巨型甜菜
17年8月15日在18:43

我不知道仅生成库调用图的命令,对不起

–巨型甜菜
17年8月15日在19:02

#2 楼

您可能需要尝试一下。


加载二进制文件。假设p是angr Project实例。
生成CFG:cfg = p.analyses.CFG(show_progressbar=True)
以任意方式访问/遍历调用图(它是networkx.DiGraph):cfg.functions.callgraph


例如仅显示特定地址范围或特定静态库的调用图


您可以通过将regions参数传递给CFG()来限制CFG生成的范围。 br />

#3 楼

签出Callgrind或KCachegrind。比任何其他替代方案都简单得多。

评论


这些是静态分析仪吗?或仅报告某些典型运行中的内容?

–rfabbri
19年7月23日在23:38



Callgrind基于Valgrind(序列化动态分析框架)。

– Yaspr
1月4日9:53

#4 楼

您可以使用angr-utils以便从angr生成图形:https://github.com/axt/angr-utils

评论


您应该详细说明一下...

–恐怖
2月16日23:14