从 Radare2 获取完整的二进制控制流程图

4 reverse-engineering control-flow-graph radare2

我想使用radare2 获得二进制文件(恶意软件)的完整控制流程图。
我从 SO 的另一个问题中关注了这篇文章。我想问是否ag有另一个命令可以提供整个二进制文件的控制流图,而不仅仅是一个函数的图。

Meg*_*ets 5

首先,确保从 git 存储库安装 Radare2 并使用最新版本:

$ git clone https://github.com/radare/radare2.git
$ cd radare2
$ ./sys/install.sh
Run Code Online (Sandbox Code Playgroud)

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

$ r2 /bin/ls
 -- We fix bugs while you sleep.
[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] Check for objc references
[x] Check for vtables
[x] Type matching analysis for all functions (aaft)
[x] Propagate noreturn information
[x] Use -AA or aaaa to perform additional experimental analysis.
Run Code Online (Sandbox Code Playgroud)

在radare 中的几乎每个命令后面添加?都会输出子命令。例如,您知道该ag命令及其子命令可以帮助您输出可视化图形,因此通过添加?可以ag发现它的子命令:

[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
... <truncated> ...

Output formats:
| <blank>                 Ascii art
| *                       r2 commands
| d                       Graphviz dot
| g                       Graph Modelling Language (gml)
| j                       json ('J' for formatted disassembly)
| k                       SDB key-value
| t                       Tiny ascii art
| v                       Interactive ascii art
| w [path]                Write to path or display graph image (see graph.gv.format     and graph.web)
Run Code Online (Sandbox Code Playgroud)

您正在搜索agCd将以格式输出程序的完整调用图的命令dot

[0x004049a0]> agCd > output.dot
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

  • 您可以使用 from_pydot 将点图转换为 networkx 格式:https://networkx.github.io/documentation/networkx-1.10/reference/ generated/networkx.drawing.nx_pydot.from_pydot.html#networkx.drawing.nx_pydot.from_pydot (3认同)
  • 使用 python r2pipe,这是从 python 使用 Radare 的最简单方法。将 `j` 附加到几乎每个命令以获取 Json 输出。查看存储库中的示例以了解更多信息:https://github.com/radare/radare2-r2pipe/blob/master/python/README.md (2认同)