agt [addr] find paths from current offset to given address
但是当我尝试运行命令时,在运行
aaaaa
分析之后,出现以下错误:[0x00430044]> agt 0x0042aa98 > agtoutput.dot
Unable to find source or destination basic block
我可以确认这两个地址是函数,并且可以分别绘制每个函数的图。同样,
0x00430044
确实导致0x0042aa98
。我可以从gdb跟踪中看到这一点。我查看了radare2 canal.c代码,发现它正在通过RAnalFunction->bbs
查找所提供的地址。我通过运行abb $s
abb [length] analyze N bytes and extract basic blocks
并将输出返回到r2来确保bbs被这些地址填充。我从各个位置运行了
abb $s
,以查看是否会将基本块添加到bbs列表中。各个位置分别是0x0
,0x00430044
和0x0042aa98
。但是没有任何效果,我总是收到“无法找到源或目标基本块”错误消息。我可能会走得很远,但“查找路径”功能将非常有用,我真的想让它正常工作吗?如文档所述,在使用agt
功能方面的任何帮助将不胜感激。#1 楼
似乎该功能尚未实现。如您在此功能中所看到的:...
if (root && dest) {
if (dest == root) {
eprintf ("Source and destination are the same\n");
return NULL;
}
eprintf ("ROOT BB 0x%08"PFMT64x"\n", root->addr);
eprintf ("DEST BB 0x%08"PFMT64x"\n", dest->addr);
list = r_list_new ();
printf ("=> 0x%08"PFMT64x"\n", root->jump);
} else {
eprintf ("Unable to find source or destination basic block\n");
}
return list;
...
随时在官方存储库中打开一个问题,或者更好-尝试自己实现以实现以下目的:我们所有人。
最后,不要使用
aaaaa
,它甚至不存在,并且aaa
之后的任何分析命令都是试验性的,可能会导致您遇到错误。无论如何,您不必如此深入地分析。 有关radare2中分析的更多信息,请参见此答案。
#2 楼
当我意识到此功能尚未实现时,我采取了一种变通方法来获得所需的功能。我输出完整的程序调用图,然后制作了一个非常简单的python脚本,该脚本使用networkx查找节点之间的路径。这不是很理想,但是可以完成工作。在radare2中,我将完整的程序调用图输出到一个.dot文件:
agC > agCfullProgramCallGraph.dot
然后,我有一个python脚本,可以获取该图并找到我感兴趣的连接节点的路径。
#!/usr/bin/env python
"""
Given a .dot graph, a source node, target node, this script prints out new graphs with all the paths between
"""
import networkx as nx
from pygraphviz import *
class DotGraphvizUtil(object):
def find_paths(self, dot_file_path, source, target):
agraph = AGraph(dot_file_path)
graphviz_graph = nx.nx_agraph.from_agraph(agraph)
paths = nx.all_simple_paths(graphviz_graph, source=source, target=target)
i = 0
for path in paths:
subgraph = nx.subgraph(graphviz_graph,path)
print(path)
nx.nx_agraph.write_dot(subgraph,"srcTargetGraph{}.dot".format(i))
i =+ 1
if i == 0:
print("No paths found from {} {}".format(source, target))
if __name__ == '__main__':
dot_file = "agCfullProgramCallGraph.dot"
dotGraph = DotGraphvizUtil()
dotGraph.find_paths(dot_file_path=dot_file, source='0x004669bc', target='0x00466828')
评论
您尝试使用官方支持选项吗?当您说官方支持选项时,您是说aaa而不是aaaaa吗?我只是在您发表评论后尝试过,但结果还是一样。也只是从最新的radare2 git重建而来。我以前一直使用大约一个月的构建。
什么是官方支持选项
我觉得该功能没有完全实现。我浏览了一下代码(canal.c),发现了一个“ bug”,它将使agt调用永远无效。我在本地修复了该错误,因此我克服了最初的错误,但是“ r_core_anal_graph_to”函数基本上不返回任何结果。太可悲了:-(,这将是一个很棒的功能。不确定该选项为何在帮助菜单中,因为它似乎根本无法工作。除非,我会丢失一些东西。
如果您知道这是一个错误,请在r2仓库中打开一个问题,或者如果有此修复程序,甚至更好,然后向他们发送请求请求。我假设您正在从git运行r2。