如何生成二进制文件的调用图?

逆向工程 二元分析 小精灵 调用图
2021-06-14 02:33:54

我有一个未剥离的 ELF 二进制文件,我想为其创建一个调用图作为文件。有没有这样的工具可以生成调用图?

编辑:除了传统的调用图之外,是否还有基于可执行文件的库之间的调用图。例如,仅显示 from libcto的调用图pthread

4个回答

您可以使用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

要阅读有关radare2 的更多信息,建议阅读radare2 书


备择方案

  • gen-callgraph - gen-callgraph 是一个脚本,用于从 elf 二进制文件生成调用图

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

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

您可能想尝试一下angr

  • 加载二进制文件。假设p是 angr 项目实例。
  • 生成一个CFG: cfg = p.analyses.CFG(show_progressbar=True)
  • 访问/遍历调用图(这是一个networkx.DiGraph)在任何你想要的方式: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

在此处输入图片说明

查看CallgrindKCachegrind比任何其他选择都简单得多。