diff options
Diffstat (limited to 'miasm/analysis/disasm_cb.py')
| -rw-r--r-- | miasm/analysis/disasm_cb.py | 47 |
1 files changed, 23 insertions, 24 deletions
diff --git a/miasm/analysis/disasm_cb.py b/miasm/analysis/disasm_cb.py index f3480598..af47603b 100644 --- a/miasm/analysis/disasm_cb.py +++ b/miasm/analysis/disasm_cb.py @@ -11,8 +11,8 @@ from miasm.core.locationdb import LocationDB from miasm.core.utils import upck32 -def get_ira(mnemo, attrib): - arch = mnemo.name, attrib +def get_ira(arch, attrib): + arch = arch.name, attrib if arch == ("arm", "arm"): from miasm.arch.arm.ira import ir_a_arm_base as ira elif arch == ("x86", 32): @@ -20,20 +20,20 @@ def get_ira(mnemo, attrib): elif arch == ("x86", 64): from miasm.arch.x86.ira import ir_a_x86_64 as ira else: - raise ValueError('unknown architecture: %s' % mnemo.name) + raise ValueError('unknown architecture: %s' % arch.name) return ira -def arm_guess_subcall( - mnemo, attrib, pool_bin, cur_bloc, offsets_to_dis, loc_db): - ira = get_ira(mnemo, attrib) +def arm_guess_subcall(dis_engine, cur_block, offsets_to_dis): + arch = dis_engine.arch + loc_db = dis_engine.loc_db + ira = get_ira(arch, dis_engine.attrib) - sp = LocationDB() - ir_arch = ira(sp) + ir_arch = ira(loc_db) ircfg = ira.new_ircfg() print('###') - print(cur_bloc) - ir_arch.add_asmblock_to_ircfg(cur_bloc, ircfg) + print(cur_block) + ir_arch.add_asmblock_to_ircfg(cur_block, ircfg) to_add = set() for irblock in viewvalues(ircfg.blocks): @@ -43,14 +43,14 @@ def arm_guess_subcall( for e in exprs: if e.dst == ir_arch.pc: pc_val = e.src - if e.dst == mnemo.regs.LR: + if e.dst == arch.regs.LR: lr_val = e.src if pc_val is None or lr_val is None: continue if not isinstance(lr_val, ExprInt): continue - l = cur_bloc.lines[-1] + l = cur_block.lines[-1] if lr_val.arg != l.offset + l.l: continue l = loc_db.get_or_create_offset_location(int(lr_val)) @@ -60,20 +60,20 @@ def arm_guess_subcall( offsets_to_dis.add(int(lr_val)) for c in to_add: - cur_bloc.addto(c) + cur_block.addto(c) -def arm_guess_jump_table( - mnemo, attrib, pool_bin, cur_bloc, offsets_to_dis, loc_db): - ira = get_ira(mnemo, attrib) +def arm_guess_jump_table(dis_engine, cur_block, offsets_to_dis): + arch = dis_engine.arch + loc_db = dis_engine.loc_db + ira = get_ira(arch, dis_engine.attrib) jra = ExprId('jra') jrb = ExprId('jrb') - sp = LocationDB() - ir_arch = ira(sp) + ir_arch = ira(loc_db) ircfg = ira.new_ircfg() - ir_arch.add_asmblock_to_ircfg(cur_bloc, ircfg) + ir_arch.add_asmblock_to_ircfg(cur_block, ircfg) for irblock in viewvalues(ircfg.blocks): pc_val = None @@ -105,7 +105,7 @@ def arm_guess_jump_table( while i < max_table_entry: i += 1 try: - ad = upck32(pool_bin.getbytes(base_ad + 4 * i, 4)) + ad = upck32(dis_engine.bin_stream.getbytes(base_ad + 4 * i, 4)) except: break if abs(ad - base_ad) > max_diff_addr: @@ -117,12 +117,11 @@ def arm_guess_jump_table( offsets_to_dis.add(ad) l = loc_db.get_or_create_offset_location(ad) c = AsmConstraintTo(l) - cur_bloc.addto(c) + cur_block.addto(c) guess_funcs = [] -def guess_multi_cb( - mnemo, attrib, pool_bin, cur_bloc, offsets_to_dis, loc_db): +def guess_multi_cb(dis_engine, cur_block, offsets_to_dis): for f in guess_funcs: - f(mnemo, attrib, pool_bin, cur_bloc, offsets_to_dis, loc_db) + f(dis_engine, cur_block, offsets_to_dis) |