52 lines
1.5 KiB
Python
52 lines
1.5 KiB
Python
import sys
|
|
|
|
from graphviz import Digraph
|
|
import src.tac_efg as tac_efg
|
|
import src.exporter as exporter
|
|
|
|
def block_k_depth(block):
|
|
return f"{block.evm_ops[0].call_depth}"
|
|
|
|
|
|
def block_k(block):
|
|
dividing_line = "⋮"
|
|
variable = "" if block.evm_ops[-1].value is None else block.evm_ops[-1].value
|
|
# return f"{block.evm_ops[0].call_depth}-{block.entry}({block.evm_ops[0].opcode.name})->{block.exit}({block.evm_ops[-1].opcode.name})"
|
|
return f"{block.evm_ops[0].call_depth}\n{block.entry};{block.evm_ops[0].opcode.name}; {block.evm_ops[0].value}\n{dividing_line}\n{block.exit}; {block.evm_ops[-1].opcode.name}; {variable}"
|
|
|
|
|
|
def draw_cfg(efg):
|
|
dot = Digraph(comment='CFG')
|
|
dot.format = "svg"
|
|
|
|
for block in efg.blocks:
|
|
dot.node(block_k(block), block_k(block), shape='box')
|
|
for edge in efg.edge_list():
|
|
dot.edge(block_k(edge[0]), block_k(edge[1]))
|
|
dot.render('cfg')
|
|
|
|
|
|
def draw_depth_cfg(efg):
|
|
dot = Digraph(comment='depth-CFG')
|
|
dot.format = "svg"
|
|
|
|
for block in efg.blocks:
|
|
dot.node(block_k_depth(block), block_k_depth(block), shape='box')
|
|
for edge in efg.edge_list():
|
|
dot.edge(block_k_depth(edge[0]), block_k_depth(edge[1]))
|
|
dot.render('depth-cfg')
|
|
|
|
|
|
if __name__ == '__main__':
|
|
with open(sys.argv[1], "r") as f:
|
|
efg = tac_efg.TACGraph.from_opcode(f)
|
|
print(efg)
|
|
|
|
exporter.EFGDotExporter(efg).export(out_filename="suicidal_ganache.html")
|
|
|
|
# draw_cfg(efg)
|
|
# draw_depth_cfg(efg)
|
|
|
|
|
|
|