编辑:除了传统的调用图以外,是否还有其他工具可以根据可执行文件在库之间查找调用图。例如,仅显示从
libc
到pthread
的调用图。#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来运行它
#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
评论
是否可以在库或文件之间获得调用图,而不是在函数之间获得调用图?
– 0x90
17年8月13日在19:44
您可以使用il获取二进制文件或rabin2 -l / bin / ls使用的库,它们相同
–巨型甜菜
17年8月15日在18:43
我不知道仅生成库调用图的命令,对不起
–巨型甜菜
17年8月15日在19:02