我有一个未剥离的 ELF 二进制文件,我想为其创建一个调用图作为点文件。有没有这样的工具可以生成调用图?
编辑:除了传统的调用图之外,是否还有基于可执行文件的库之间的调用图。例如,仅显示 from libc
to的调用图pthread
。
我有一个未剥离的 ELF 二进制文件,我想为其创建一个调用图作为点文件。有没有这样的工具可以生成调用图?
编辑:除了传统的调用图之外,是否还有基于可执行文件的库之间的调用图。例如,仅显示 from libc
to的调用图pthread
。
您可以使用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
要阅读有关radare2 的更多信息,建议阅读radare2 书。
gen-callgraph - gen-callgraph 是一个脚本,用于从 elf 二进制文件生成调用图
IDA Pro - 使用 CTRL+F12 生成 GDL(图形描述文件)调用图,保存它,然后使用以下选项之一将其转换为点文件:
graph-easy - 在图形格式之间转换
这个来自 Multimedia Wiki 的perl 脚本
IDA的免费版本也可以生成调用图的 GDL,但它只能作为 exe 使用,请在 Linux 上使用 wine 来运行它
您可能想尝试一下angr。
p
是 angr 项目实例。cfg = p.analyses.CFG(show_progressbar=True)
。cfg.functions.callgraph
。例如仅显示特定地址范围或特定静态库的调用图
您可以通过将regions
参数传递给 来限制 CFG 生成的范围CFG()
。
您可以使用 angr-utils 从 angr 生成图形:https : //github.com/axt/angr-utils
有关更多信息,请参阅:
https://github.com/axt/angr-utils/blob/master/examples/plot_cg/README.md
查看Callgrind或KCachegrind。比任何其他选择都简单得多。