Files
2024-06-15 11:27:29 +08:00

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)