本文整理汇总了Python中Graph.search_node方法的典型用法代码示例。如果您正苦于以下问题:Python Graph.search_node方法的具体用法?Python Graph.search_node怎么用?Python Graph.search_node使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类Graph
的用法示例。
在下文中一共展示了Graph.search_node方法的1个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的Python代码示例。
示例1: generate_cfg
# 需要导入模块: import Graph [as 别名]
# 或者: from Graph import search_node [as 别名]
def generate_cfg(self, start_addr, ret_addr=None, start_clnum=0, end_clnum=0):
if start_clnum == 0:
start_clnum = self.t.get_minclnum() + 1
if end_clnum == 0:
end_clnum = self.t.get_maxclnum() - 1
traces = []
enter_call = 0
enter_sub_call = 0
for i in range(start_clnum, end_clnum + 1):
pc = self.get_pc(i)
asm = self.get_disasm(pc)
if enter_call == 0:
if pc == start_addr:
if ret_addr is None:
end_addr = self.get_ret_addr(i - 1)
print hex(end_addr)
else:
end_addr = ret_addr
enter_call = 1
trace = [(i, pc, asm)]
else:
if end_addr == pc:
print 'exit call'
enter_call = 0
traces.append(trace)
trace = []
if enter_sub_call == 0:
trace.append((i, pc, asm))
if asm.startswith('call'):
enter_sub_call = 1
sub_call_ret = self.get_ret_addr(i)
else:
if pc == sub_call_ret:
trace.append((i, pc, asm))
enter_sub_call = 0
graph = Graph()
pcs = []
for trace in traces:
print trace
for trace in traces:
exist_node = None
exist_index = 1
new_node = None
for ins in trace:
if ins[1] not in pcs:
pcs.append(ins[1])
if exist_node is None:
if new_node is None:
new_node = Node([Assemble(ins[1], ins[2])])
graph.add_node(new_node)
else:
new_node.add_asm(Assemble(ins[1], ins[2]))
else:
new_node = Node([Assemble(ins[1], ins[2])])
graph.add_node(new_node)
if len(exist_node.asm_seqs) == exist_index:
graph.add_edge(exist_node, new_node)
else:
node1, node2 = graph.split_node(exist_node, exist_index, count=exist_node.count - 1)
graph.add_edge(node1, new_node)
exist_node = None
exist_index = 0
else:
if exist_node is None:
if new_node is None:
exist_node = graph.search_and_split(ins[1])
exist_node.add_count()
exist_index = 1
else:
node, index = graph.search_node(ins[1])
if index == 0:
graph.add_edge(new_node, node)
node2 = node
else:
node1, node2 = graph.split_node(node, index)
if node == new_node:
graph.add_edge(node2, node2)
else:
graph.add_edge(new_node, node2)
new_node = None
exist_node = node2
node2.add_count()
exist_index = 1
else:
if new_node is None:
if len(exist_node.asm_seqs) == exist_index:
node3 = graph.search_and_split(ins[1])
graph.add_edge(exist_node, node3)
exist_node = node3
node3.add_count()
exist_index = 1
else:
if exist_node.asm_seqs[exist_index].addr == ins[1]:
exist_index += 1
#.........这里部分代码省略.........