7 import asm_symbol_pool, asm_constraint_next, asm_constraint_to
13 arch = mnemo.name, attrib
14 if arch == (
"arm",
"arm"):
16 elif arch == (
"x86", 32):
18 elif arch == (
"x86", 64):
21 raise ValueError(
'unknown architecture: %s' % mnemo.name)
26 mnemo, attrib, pool_bin, cur_bloc, offsets_to_dis, symbol_pool):
29 sp = asm_symbol_pool()
33 ir_arch.add_bloc(cur_bloc)
35 ir_blocs = ir_arch.blocs.values()
45 if e.dst == ir_arch.pc:
47 if e.dst == mnemo.regs.LR:
49 if pc_val
is None or lr_val
is None:
51 if not isinstance(lr_val, ExprInt):
54 l = cur_bloc.lines[-1]
55 if lr_val.arg != l.offset + l.l:
58 l = symbol_pool.getby_offset_create(int(lr_val.arg))
59 c = asm_constraint_next(l)
62 offsets_to_dis.add(int(lr_val.arg))
72 mnemo, attrib, pool_bin, cur_bloc, offsets_to_dis, symbol_pool):
78 sp = asm_symbol_pool()
80 ir_arch.add_bloc(cur_bloc)
82 ir_blocs = ir_arch.blocs.values()
90 if e.dst == ir_arch.pc:
96 if not isinstance(pc_val, ExprMem):
98 assert(pc_val.size == 32)
103 res =
MatchExpr(ad, jra + jrb, set([jra, jrb]))
105 raise NotImplementedError(
'not fully functional')
107 if not isinstance(res[jrb], ExprInt):
108 raise NotImplementedError(
'not fully functional')
109 base_ad = int(res[jrb].arg)
113 max_table_entry = 10000
114 max_diff_addr = 0x100000
115 while i < max_table_entry:
118 ad =
upck32(pool_bin.getbytes(base_ad + 4 * i, 4))
121 if abs(ad - base_ad) > max_diff_addr:
124 print [hex(x)
for x
in addrs]
127 offsets_to_dis.add(ad)
128 l = symbol_pool.getby_offset_create(ad)
129 c = asm_constraint_to(l)
136 mnemo, attrib, pool_bin, cur_bloc, offsets_to_dis, symbol_pool):
137 for f
in guess_funcs:
138 f(mnemo, attrib, pool_bin, cur_bloc, offsets_to_dis, symbol_pool)