detect_rep/data_extract/angrutils/visualize.py

101 lines
4.3 KiB
Python
Raw Normal View History

2023-04-05 10:04:49 +08:00
import networkx
from collections import defaultdict
from bingraphvis import *
from bingraphvis.angr import *
from bingraphvis.angr.x86 import *
def set_plot_style(c):
set_style(c)
def plot_common(graph, fname, format="png", type=True):
vis = AngrVisFactory().default_common_graph_pipeline(type=type)
vis.set_output(DotOutput(fname, format=format))
vis.process(graph)
def plot_cfg(cfg, fname, format="png", state=None, asminst=False, vexinst=False, func_addr=None, remove_imports=True, remove_path_terminator=True, remove_simprocedures=False, debug_info=False, comments=True, color_depth=False):
vis = AngrVisFactory().default_cfg_pipeline(cfg, asminst=asminst, vexinst=vexinst, comments=comments)
if remove_imports:
vis.add_transformer(AngrRemoveImports(cfg.project))
if remove_simprocedures:
vis.add_transformer(AngrRemoveSimProcedures())
if func_addr:
vis.add_transformer(AngrFilterNodes(lambda node: node.obj.function_address in func_addr and func_addr[node.obj.function_address]))
if debug_info:
vis.add_content(AngrCFGDebugInfo())
if state:
vis.add_edge_annotator(AngrPathAnnotator(state))
vis.add_node_annotator(AngrPathAnnotator(state))
if color_depth:
vis.add_clusterer(AngrCallstackKeyClusterer())
vis.add_clusterer(ColorDepthClusterer(palette='greens'))
vis.set_output(DotOutput(fname, format=format))
vis.process(cfg.graph)
def plot_func_graph(project, graph, fname, format="png", asminst=True, ailinst=True, vexinst=False, structure=None, color_depth=False):
vis = AngrVisFactory().default_func_graph_pipeline(project, asminst=asminst, ailinst=ailinst, vexinst=vexinst)
if structure:
vis.add_clusterer(AngrStructuredClusterer(structure))
if color_depth:
vis.add_clusterer(ColorDepthClusterer(palette='greens'))
vis.set_output(DotOutput(fname, format=format))
vis.process(graph)
#Note: method signature may be changed in the future
def plot_structured_graph(project, structure, fname, format="png", asminst=True, ailinst=True, vexinst=False, color_depth=False):
vis = AngrVisFactory().default_structured_graph_pipeline(project, asminst=asminst, ailinst=ailinst, vexinst=vexinst)
if color_depth:
vis.add_clusterer(ColorDepthClusterer(palette='greens'))
vis.set_output(DotOutput(fname, format=format))
vis.process(structure)
def plot_cg(kb, fname, format="png", verbose=False, filter=None):
vis = AngrVisFactory().default_cg_pipeline(kb, verbose=verbose)
vis.set_output(DotOutput(fname, format=format))
vis.process(kb, filter)
def plot_cdg(cfg, cdg, fname, format="png", pd_edges=False, cg_edges=True, remove_fakeret=True):
vis = AngrVisFactory().default_cfg_pipeline(cfg, asminst=True, vexinst=False, color_edges=False)
if remove_fakeret:
vis.add_transformer(AngrRemoveFakeretEdges())
if pd_edges:
vis.add_transformer(AngrAddEdges(cdg.get_post_dominators(), color="green", reverse=True))
if cg_edges:
vis.add_transformer(AngrAddEdges(cdg.graph, color="purple", reverse=False))
vis.set_output(DotOutput(fname, format=format))
vis.process(cfg.graph)
def plot_dfg(dfg, fname, format="png"):
vis = AngrVisFactory().default_common_graph_pipeline(type=True)
vis.set_output(DotOutput(fname, format=format))
vis.process(dfg)
#Note: method signature may change in the future
def plot_ddg_stmt(ddg_stmt, fname, format="png", project=None):
vis = AngrVisFactory().default_common_graph_pipeline()
if project:
vis.add_content(AngrAsm(project))
vis.add_content(AngrVex(project))
vis.add_edge_annotator(AngrColorDDGStmtEdges(project))
vis.set_output(DotOutput(fname, format=format))
vis.process(ddg_stmt)
#Note: method signature may change in the future
def plot_ddg_data(ddg_data, fname, format="png", project=None, asminst=False, vexinst=True):
vis = Vis()
vis.set_source(AngrCommonSource())
vis.add_content(AngrDDGLocationHead())
vis.add_content(AngrDDGVariableHead(project=project))
if project:
if asminst:
vis.add_content(AngrAsm(project))
if vexinst:
vis.add_content(AngrVex(project))
acd = AngrColorDDGData(project, labels=True)
vis.add_edge_annotator(acd)
vis.add_node_annotator(acd)
vis.set_output(DotOutput(fname, format=format))
vis.process(ddg_data)