MCPcopy Create free account
hub / github.com/Vector35/binaryninja-api / collect_call_params

Function collect_call_params

python/examples/args_render_layer.py:52–84  ·  view source on GitHub ↗
(call_site, dest, params)

Source from the content-addressed store, hash-verified

50
51 # As a function to handle call and tailcall identically
52 def collect_call_params(call_site, dest, params):
53 def_sites = []
54 for i, param in enumerate(params):
55 llil = param.llil
56 if llil is not None:
57 def_sites.append((param, llil))
58 continue
59
60 match param:
61 case MediumLevelILVarSsa(src=var_src):
62 def_site = mlil.get_ssa_var_definition(var_src)
63 if def_site is not None and def_site.llil is not None:
64 def_sites.append((i, def_site.llil))
65 continue
66 # Handle phis by just looking up the def sites of all their sources
67 match def_site:
68 case MediumLevelILVarPhi(src=phis):
69 for phi in phis:
70 phi_def = mlil.get_ssa_var_definition(phi)
71 if phi_def is not None and phi_def.llil is not None:
72 def_sites.append((i, phi_def.llil))
73 case MediumLevelILConstBase():
74 # This is wrong, but it works (sometimes)
75 # Oh god, have I just quoted php.net
76 def_site_idx = mlil.llil.get_instruction_start(param.address)
77 if def_site_idx is not None:
78 def_sites.append((i, mlil.llil[def_site_idx].ssa_form))
79 continue
80
81 if len(def_sites) == 0:
82 log_debug(f"Could not find def site for param {i} in call at {call_site.address:#x}")
83
84 call_sites[call_site] = def_sites
85
86 for instr in mlil.instructions:
87 match instr:

Callers 1

get_param_sitesFunction · 0.85

Calls 4

log_debugFunction · 0.85
appendMethod · 0.45
get_instruction_startMethod · 0.45

Tested by

no test coverage detected