diff options
| -rw-r--r-- | miasm2/analysis/binary.py | 2 | ||||
| -rw-r--r-- | miasm2/analysis/data_analysis.py | 3 | ||||
| -rw-r--r-- | miasm2/analysis/disasm_cb.py | 7 | ||||
| -rw-r--r-- | miasm2/ir/analysis.py | 3 | ||||
| -rw-r--r-- | miasm2/ir/ir2C.py | 51 | ||||
| -rw-r--r-- | miasm2/ir/symbexec.py | 101 | ||||
| -rw-r--r-- | miasm2/os_dep/common.py | 2 | ||||
| -rw-r--r-- | miasm2/os_dep/win_api_x86_32.py | 7 | ||||
| -rw-r--r-- | miasm2/os_dep/win_api_x86_32_seh.py | 9 |
9 files changed, 102 insertions, 83 deletions
diff --git a/miasm2/analysis/binary.py b/miasm2/analysis/binary.py index 17c87761..f5cecc87 100644 --- a/miasm2/analysis/binary.py +++ b/miasm2/analysis/binary.py @@ -1,6 +1,6 @@ import logging -from miasm2.core.bin_stream import * +from miasm2.core.bin_stream import bin_stream_str, bin_stream_elf, bin_stream_pe from miasm2.jitter.csts import PAGE_READ diff --git a/miasm2/analysis/data_analysis.py b/miasm2/analysis/data_analysis.py index 06d28351..8462f150 100644 --- a/miasm2/analysis/data_analysis.py +++ b/miasm2/analysis/data_analysis.py @@ -1,4 +1,5 @@ -from miasm2.expression.expression import * +from miasm2.expression.expression \ + import get_expr_mem, get_list_rw, ExprId, ExprInt from miasm2.ir.symbexec import symbexec diff --git a/miasm2/analysis/disasm_cb.py b/miasm2/analysis/disasm_cb.py index d205d4eb..bf1db108 100644 --- a/miasm2/analysis/disasm_cb.py +++ b/miasm2/analysis/disasm_cb.py @@ -1,10 +1,11 @@ #!/usr/bin/env python #-*- coding:utf-8 -*- -from miasm2.expression.expression import * +from miasm2.expression.expression import ExprInt, ExprId, ExprMem, MatchExpr from miasm2.expression.simplifications import expr_simp -from miasm2.core.asmbloc import * -from miasm2.core.utils import * +from miasm2.core.asmbloc \ + import asm_symbol_pool, asm_constraint_next, asm_constraint_to +from miasm2.core.utils import upck32 # from miasm2.core.graph import DiGraph diff --git a/miasm2/ir/analysis.py b/miasm2/ir/analysis.py index 790a790e..037d1f4b 100644 --- a/miasm2/ir/analysis.py +++ b/miasm2/ir/analysis.py @@ -5,7 +5,8 @@ import logging from miasm2.ir.symbexec import symbexec from miasm2.core.graph import DiGraph -from miasm2.expression.expression import * +from miasm2.expression.expression \ + import ExprAff, ExprCond, ExprId, ExprInt, ExprMem, ExprOp log = logging.getLogger("analysis") console_handler = logging.StreamHandler() diff --git a/miasm2/ir/ir2C.py b/miasm2/ir/ir2C.py index 33398474..71d1e1c4 100644 --- a/miasm2/ir/ir2C.py +++ b/miasm2/ir/ir2C.py @@ -1,4 +1,4 @@ -from miasm2.expression.expression import * +import miasm2.expression.expression as m2_expr from miasm2.expression.simplifications import expr_simp from miasm2.core import asmbloc from miasm2.ir.translators.C import TranslatorC @@ -18,7 +18,7 @@ for size in [8, 16, 32, 64]: prefetch_id_size[size] = [] for i in xrange(20): name = 'pfmem%.2d_%d' % (size, i) - c = ExprId(name, size) + c = m2_expr.ExprId(name, size) globals()[name] = c prefetch_id.append(c) prefetch_id_size[size].append(c) @@ -26,12 +26,12 @@ for size in [8, 16, 32, 64]: def init_arch_C(arch): arch.id2Cid = {} for x in arch.regs.all_regs_ids + prefetch_id: - arch.id2Cid[x] = ExprId('vmcpu->' + str(x), x.size) + arch.id2Cid[x] = m2_expr.ExprId('vmcpu->' + str(x), x.size) arch.id2newCid = {} for x in arch.regs.all_regs_ids + prefetch_id: - arch.id2newCid[x] = ExprId('vmcpu->%s_new' % x, x.size) + arch.id2newCid[x] = m2_expr.ExprId('vmcpu->%s_new' % x, x.size) def patch_c_id(arch, e): @@ -142,14 +142,14 @@ my_size_mask = {1: 1, 2: 3, 3: 7, 7: 0x7f, 32: 0xFFFFFFFF, 64: 0xFFFFFFFFFFFFFFFFL} -exception_flags = ExprId('exception_flags', 32) +exception_flags = m2_expr.ExprId('exception_flags', 32) def set_pc(ir_arch, src): dst = ir_arch.jit_pc - if not isinstance(src, Expr): - src = ExprInt_from(dst, src) - e = ExprAff(dst, src.zeroExtend(dst.size)) + if not isinstance(src, m2_expr.Expr): + src = m2_expr.ExprInt_from(dst, src) + e = m2_expr.ExprAff(dst, src.zeroExtend(dst.size)) return e @@ -173,13 +173,14 @@ def gen_resolve_other(ir_arch, e): return 'Resolve_dst(BlockDst, %s, 0)'%(TranslatorC.from_expr(patch_c_id(ir_arch.arch, e))) def gen_resolve_dst_simple(ir_arch, e): - if isinstance(e, ExprInt): + if isinstance(e, m2_expr.ExprInt): return gen_resolve_int(ir_arch, e) - elif isinstance(e, ExprId) and isinstance(e.name, asmbloc.asm_label): + elif isinstance(e, m2_expr.ExprId) and isinstance(e.name, + asmbloc.asm_label): return gen_resolve_id_lbl(ir_arch, e) - elif isinstance(e, ExprId): + elif isinstance(e, m2_expr.ExprId): return gen_resolve_id(ir_arch, e) - elif isinstance(e, ExprMem): + elif isinstance(e, m2_expr.ExprMem): return gen_resolve_mem(ir_arch, e) else: return gen_resolve_other(ir_arch, e) @@ -187,7 +188,7 @@ def gen_resolve_dst_simple(ir_arch, e): def gen_irdst(ir_arch, e): out = [] - if isinstance(e, ExprCond): + if isinstance(e, m2_expr.ExprCond): dst_cond_c = TranslatorC.from_expr(patch_c_id(ir_arch.arch, e.cond)) out.append("if (%s)"%dst_cond_c) out.append(' %s;'%(gen_resolve_dst_simple(ir_arch, e.src1))) @@ -215,16 +216,16 @@ def Expr2C(ir_arch, l, exprs, gen_exception_code=False): fetch_mem = False set_exception_flags = False for e in exprs: - assert(isinstance(e, ExprAff)) - assert(not isinstance(e.dst, ExprOp)) - if isinstance(e.dst, ExprId): + assert isinstance(e, m2_expr.ExprAff) + assert not isinstance(e.dst, m2_expr.ExprOp) + if isinstance(e.dst, m2_expr.ExprId): if not e.dst in dst_dict: dst_dict[e.dst] = [] dst_dict[e.dst].append(e) else: new_expr.append(e) # test exception flags - ops = get_expr_ops(e) + ops = m2_expr.get_expr_ops(e) if set(['umod', 'udiv']).intersection(ops): set_exception_flags = True if e.dst == exception_flags: @@ -234,7 +235,7 @@ def Expr2C(ir_arch, l, exprs, gen_exception_code=False): # search mem lookup for generate mem read prefetch rs = e.src.get_r(mem_read=True) for r in rs: - if (not isinstance(r, ExprMem)) or r in src_mem: + if (not isinstance(r, m2_expr.ExprMem)) or r in src_mem: continue fetch_mem = True index = prefect_index[r.size] @@ -277,7 +278,7 @@ def Expr2C(ir_arch, l, exprs, gen_exception_code=False): - if isinstance(dst, ExprId): + if isinstance(dst, m2_expr.ExprId): id_to_update.append(dst) str_dst = patch_c_new_id(ir_arch.arch, dst) if dst in ir_arch.arch.regs.regs_flt_expr: @@ -286,7 +287,7 @@ def Expr2C(ir_arch, l, exprs, gen_exception_code=False): else: out.append('%s = (%s)&0x%X;' % (str_dst, str_src, my_size_mask[src.size])) - elif isinstance(dst, ExprMem): + elif isinstance(dst, m2_expr.ExprMem): fetch_mem = True str_dst = str_dst.replace('MEM_LOOKUP', 'MEM_WRITE') out_mem.append('%s, %s);' % (str_dst[:-1], str_src)) @@ -352,15 +353,15 @@ def Expr2C(ir_arch, l, exprs, gen_exception_code=False): def label2offset(e): - if not isinstance(e, ExprId): + if not isinstance(e, m2_expr.ExprId): return e if not isinstance(e.name, asmbloc.asm_label): return e - return ExprInt_from(e, e.name.offset) + return m2_expr.ExprInt_from(e, e.name.offset) def expr2pyobj(arch, e): - if isinstance(e, ExprId): + if isinstance(e, m2_expr.ExprId): if isinstance(e.name, asmbloc.asm_label): src_c = 'PyString_FromStringAndSize("%s", %d)' % ( e.name.name, len(e.name.name)) @@ -378,7 +379,7 @@ def ir2C(ir_arch, irbloc, lbl_done, # print irbloc out.append(["%s:" % irbloc.label.name]) #out.append(['printf("%s:\n");' % irbloc.label.name]) - assert(len(irbloc.irs) == len(irbloc.lines)) + assert len(irbloc.irs) == len(irbloc.lines) for l, exprs in zip(irbloc.lines, irbloc.irs): if l.offset not in lbl_done: e = set_pc(ir_arch, l.offset & mask_int) @@ -425,7 +426,7 @@ def irblocs2C(ir_arch, resolvers, label, irblocs, out.append("goto %s;" % label.name) bloc_labels = [x.label for x in irblocs] - assert(label in bloc_labels) + assert label in bloc_labels lbl_done = set([None]) diff --git a/miasm2/ir/symbexec.py b/miasm2/ir/symbexec.py index 618c1ae4..f51baf9f 100644 --- a/miasm2/ir/symbexec.py +++ b/miasm2/ir/symbexec.py @@ -1,4 +1,5 @@ -from miasm2.expression.expression import * +import miasm2.expression.expression as m2_expr +from miasm2.expression.modint import int32 from miasm2.expression.simplifications import expr_simp from miasm2.core import asmbloc import logging @@ -22,14 +23,14 @@ class symbols(): self[k] = v def __contains__(self, a): - if not isinstance(a, ExprMem): + if not isinstance(a, m2_expr.ExprMem): return self.symbols_id.__contains__(a) if not self.symbols_mem.__contains__(a.arg): return False return self.symbols_mem[a.arg][0].size == a.size def __getitem__(self, a): - if not isinstance(a, ExprMem): + if not isinstance(a, m2_expr.ExprMem): return self.symbols_id.__getitem__(a) if not a.arg in self.symbols_mem: raise KeyError(a) @@ -39,7 +40,7 @@ class symbols(): return m[1] def __setitem__(self, a, v): - if not isinstance(a, ExprMem): + if not isinstance(a, m2_expr.ExprMem): self.symbols_id.__setitem__(a, v) return self.symbols_mem.__setitem__(a.arg, (a, v)) @@ -51,7 +52,7 @@ class symbols(): yield self.symbols_mem[a][0] def __delitem__(self, a): - if not isinstance(a, ExprMem): + if not isinstance(a, m2_expr.ExprMem): self.symbols_id.__delitem__(a) else: self.symbols_mem.__delitem__(a.arg) @@ -102,7 +103,7 @@ class symbexec(object): if eval_cache is None: eval_cache = {} if isinstance(e.name, asmbloc.asm_label) and e.name.offset is not None: - return ExprInt_from(e, e.name.offset) + return m2_expr.ExprInt_from(e, e.name.offset) if not e in self.symbols: # raise ValueError('unknown symbol %s'% e) return e @@ -116,7 +117,7 @@ class symbexec(object): eval_cache = {} a_val = self.expr_simp(self.eval_expr(e.arg, eval_cache)) if a_val != e.arg: - a = self.expr_simp(ExprMem(a_val, size=e.size)) + a = self.expr_simp(m2_expr.ExprMem(a_val, size=e.size)) else: a = e if a in self.symbols: @@ -139,13 +140,13 @@ class symbexec(object): # x_size = self.symbols[x].size if off >= 0: m = min(a.size - off * 8, x.size) - ee = ExprSlice(self.symbols[x], 0, m) + ee = m2_expr.ExprSlice(self.symbols[x], 0, m) ee = self.expr_simp(ee) out.append((ee, off_base, off_base + m)) off_base += m else: m = min(a.size - off * 8, x.size) - ee = ExprSlice(self.symbols[x], -off * 8, m) + ee = m2_expr.ExprSlice(self.symbols[x], -off * 8, m) ff = self.expr_simp(ee) new_off_base = off_base + m + off * 8 out.append((ff, off_base, new_off_base)) @@ -153,18 +154,20 @@ class symbexec(object): if out: missing_slice = self.rest_slice(out, 0, a.size) for sa, sb in missing_slice: - ptr = self.expr_simp(a_val + ExprInt_from(a_val, sa / 8)) - mm = ExprMem(ptr, size=sb - sa) + ptr = self.expr_simp( + a_val + m2_expr.ExprInt_from(a_val, sa / 8) + ) + mm = m2_expr.ExprMem(ptr, size=sb - sa) mm.is_term = True mm.is_simp = True out.append((mm, sa, sb)) out.sort(key=lambda x: x[1]) # for e, sa, sb in out: # print str(e), sa, sb - ee = ExprSlice(ExprCompose(out), 0, a.size) + ee = m2_expr.ExprSlice(m2_expr.ExprCompose(out), 0, a.size) ee = self.expr_simp(ee) return ee - if self.func_read and isinstance(a.arg, ExprInt): + if self.func_read and isinstance(a.arg, m2_expr.ExprInt): return self.func_read(a) else: # XXX hack test @@ -180,7 +183,7 @@ class symbexec(object): v = self.find_mem_by_addr(ptr) if v is None: # raise ValueError("cannot find %s in mem"%str(ptr)) - val = ExprMem(ptr, 8) + val = m2_expr.ExprMem(ptr, 8) v = val diff_size = 8 elif rest >= v.size: @@ -193,12 +196,16 @@ class symbexec(object): out.append(val) ptr_index += diff_size rest -= diff_size - ptr = self.expr_simp(self.eval_expr(ExprOp('+', ptr, - ExprInt_from(ptr, v.size / 8)), eval_cache)) - e = self.expr_simp(ExprCompose(out)) + ptr = self.expr_simp( + self.eval_expr( + m2_expr.ExprOp('+', ptr, + m2_expr.ExprInt_from(ptr, v.size / 8)), + eval_cache) + ) + e = self.expr_simp(m2_expr.ExprCompose(out)) return e # part lookup - tmp = self.expr_simp(ExprSlice(self.symbols[tmp], 0, a.size)) + tmp = self.expr_simp(m2_expr.ExprSlice(self.symbols[tmp], 0, a.size)) return tmp def eval_expr_visit(self, e, eval_cache=None): @@ -210,15 +217,16 @@ class symbexec(object): if e in eval_cache: return eval_cache[e] c = e.__class__ - deal_class = {ExprId: self.eval_ExprId, - ExprInt: self.eval_ExprInt, - ExprMem: self.eval_ExprMem, + deal_class = {m2_expr.ExprId: self.eval_ExprId, + m2_expr.ExprInt: self.eval_ExprInt, + m2_expr.ExprMem: self.eval_ExprMem, } # print 'eval', e if c in deal_class: e = deal_class[c](e, eval_cache) # print "ret", e - if not (isinstance(e, ExprId) or isinstance(e, ExprInt)): + if not (isinstance(e, m2_expr.ExprId) or isinstance(e, + m2_expr.ExprInt)): e.is_term = True return e @@ -284,7 +292,7 @@ class symbexec(object): def substract_mems(self, a, b): ex = b.arg - a.arg ex = self.expr_simp(self.eval_expr(ex, {})) - if not isinstance(ex, ExprInt): + if not isinstance(ex, m2_expr.ExprInt): return None ptr_diff = int(int32(ex.arg)) out = [] @@ -295,14 +303,15 @@ class symbexec(object): if sub_size >= a.size: pass else: - ex = ExprOp('+', a.arg, ExprInt_from(a.arg, sub_size / 8)) + ex = m2_expr.ExprOp('+', a.arg, + m2_expr.ExprInt_from(a.arg, sub_size / 8)) ex = self.expr_simp(self.eval_expr(ex, {})) rest_ptr = ex rest_size = a.size - sub_size val = self.symbols[a][sub_size:a.size] - out = [(ExprMem(rest_ptr, rest_size), val)] + out = [(m2_expr.ExprMem(rest_ptr, rest_size), val)] else: #[a ] # XXXX[b ]YY @@ -314,24 +323,25 @@ class symbexec(object): # part X if ptr_diff > 0: val = self.symbols[a][0:ptr_diff * 8] - out.append((ExprMem(a.arg, ptr_diff * 8), val)) + out.append((m2_expr.ExprMem(a.arg, ptr_diff * 8), val)) # part Y if ptr_diff * 8 + b.size < a.size: - ex = ExprOp('+', b.arg, ExprInt_from(b.arg, b.size / 8)) + ex = m2_expr.ExprOp('+', b.arg, + m2_expr.ExprInt_from(b.arg, b.size / 8)) ex = self.expr_simp(self.eval_expr(ex, {})) rest_ptr = ex rest_size = a.size - (ptr_diff * 8 + b.size) val = self.symbols[a][ptr_diff * 8 + b.size:a.size] - out.append((ExprMem(ex, val.size), val)) + out.append((m2_expr.ExprMem(ex, val.size), val)) return out # give mem stored overlapping requested mem ptr def get_mem_overlapping(self, e, eval_cache=None): if eval_cache is None: eval_cache = {} - if not isinstance(e, ExprMem): + if not isinstance(e, m2_expr.ExprMem): raise ValueError('mem overlap bad arg') ov = [] # suppose max mem size is 64 bytes, compute all reachable addresses @@ -339,14 +349,15 @@ class symbexec(object): base_ptr = self.expr_simp(e.arg) for i in xrange(-7, e.size / 8): ex = self.expr_simp( - self.eval_expr(base_ptr + ExprInt_from(e.arg, i), eval_cache)) + self.eval_expr(base_ptr + m2_expr.ExprInt_from(e.arg, i), + eval_cache)) to_test.append((i, ex)) for i, x in to_test: if not x in self.symbols.symbols_mem: continue ex = self.expr_simp(self.eval_expr(e.arg - x, eval_cache)) - if not isinstance(ex, ExprInt): + if not isinstance(ex, m2_expr.ExprInt): raise ValueError('ex is not ExprInt') ptr_diff = int32(ex.arg) if ptr_diff >= self.symbols.symbols_mem[x][1].size / 8: @@ -361,24 +372,24 @@ class symbexec(object): eval_cache = dict(self.symbols.items()) for e in exprs: - if not isinstance(e, ExprAff): + if not isinstance(e, m2_expr.ExprAff): raise TypeError('not affect', str(e)) src = self.eval_expr(e.src, eval_cache) - if isinstance(e.dst, ExprMem): + if isinstance(e.dst, m2_expr.ExprMem): a = self.eval_expr(e.dst.arg, eval_cache) a = self.expr_simp(a) # search already present mem tmp = None # test if mem lookup is known - tmp = ExprMem(a, e.dst.size) + tmp = m2_expr.ExprMem(a, e.dst.size) dst = tmp - if self.func_write and isinstance(dst.arg, ExprInt): + if self.func_write and isinstance(dst.arg, m2_expr.ExprInt): self.func_write(self, dst, src, pool_out) else: pool_out[dst] = src - elif isinstance(e.dst, ExprId): + elif isinstance(e.dst, m2_expr.ExprId): pool_out[e.dst] = src else: raise ValueError("affected zarb", str(e.dst)) @@ -391,11 +402,11 @@ class symbexec(object): src_dst = self.eval_ir_expr(ir) eval_cache = dict(self.symbols.items()) for dst, src in src_dst: - if isinstance(dst, ExprMem): + if isinstance(dst, m2_expr.ExprMem): mem_overlap = self.get_mem_overlapping(dst, eval_cache) for _, base in mem_overlap: diff_mem = self.substract_mems(base, dst) - del(self.symbols[base]) + del self.symbols[base] for new_mem, new_val in diff_mem: new_val.is_term = True self.symbols[new_mem] = new_val @@ -403,7 +414,7 @@ class symbexec(object): # print 'SRCo', src_o # src_o.is_term = True self.symbols[dst] = src_o - if isinstance(dst, ExprMem): + if isinstance(dst, m2_expr.ExprMem): mem_dst.append(dst) return mem_dst @@ -416,20 +427,20 @@ class symbexec(object): eval_cache = dict(self.symbols.items()) return self.eval_expr(self.ir_arch.IRDst, eval_cache) - def emul_ir_bloc(self, myir, ad, step = False): + def emul_ir_bloc(self, myir, ad, step=False): b = myir.get_bloc(ad) if b is not None: - ad = self.emulbloc(b, step = step) + ad = self.emulbloc(b, step=step) return ad - def emul_ir_blocs(self, myir, ad, lbl_stop=None, step = False): + def emul_ir_blocs(self, myir, ad, lbl_stop=None, step=False): while True: b = myir.get_bloc(ad) if b is None: break if b.label == lbl_stop: break - ad = self.emulbloc(b, step = step) + ad = self.emulbloc(b, step=step) return ad def del_mem_above_stack(self, sp): @@ -438,9 +449,9 @@ class symbexec(object): # print mem_ad, sp_val diff = self.eval_expr(mem_ad - sp_val, {}) diff = expr_simp(diff) - if not isinstance(diff, ExprInt): + if not isinstance(diff, m2_expr.ExprInt): continue m = expr_simp(diff.msb()) if m.arg == 1: - del(self.symbols[mem]) + del self.symbols[mem] diff --git a/miasm2/os_dep/common.py b/miasm2/os_dep/common.py index 83b00ae6..41d24405 100644 --- a/miasm2/os_dep/common.py +++ b/miasm2/os_dep/common.py @@ -1,4 +1,4 @@ -from miasm2.jitter.csts import * +from miasm2.jitter.csts import PAGE_READ, PAGE_WRITE def get_str_ansi(jitter, ad_str, max_char=None): l = 0 diff --git a/miasm2/os_dep/win_api_x86_32.py b/miasm2/os_dep/win_api_x86_32.py index 5a673265..e47c6024 100644 --- a/miasm2/os_dep/win_api_x86_32.py +++ b/miasm2/os_dep/win_api_x86_32.py @@ -29,9 +29,10 @@ try: except ImportError: print "cannot find crypto, skipping" -from miasm2.jitter.csts import * -from miasm2.core.utils import * -from miasm2.os_dep.common import * +from miasm2.jitter.csts import PAGE_READ, PAGE_WRITE, PAGE_EXEC +from miasm2.core.utils import pck16, pck32, upck32, hexdump +from miasm2.os_dep.common \ + import heap, set_str_ansi, set_str_unic, get_str_ansi, get_str_unic from miasm2.os_dep.win_api_x86_32_seh import FS_0_AD log = logging.getLogger("win_api_x86_32") diff --git a/miasm2/os_dep/win_api_x86_32_seh.py b/miasm2/os_dep/win_api_x86_32_seh.py index e77e30d9..7b10c88c 100644 --- a/miasm2/os_dep/win_api_x86_32_seh.py +++ b/miasm2/os_dep/win_api_x86_32_seh.py @@ -19,11 +19,14 @@ # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. # import logging +import os +import struct + from elfesteem import pe_init -from miasm2.jitter.csts import * -from miasm2.core.utils import * + +from miasm2.jitter.csts import PAGE_READ, PAGE_WRITE +from miasm2.core.utils import pck32, upck32 import miasm2.arch.x86.regs as x86_regs -import os # Constants Windows EXCEPTION_BREAKPOINT = 0x80000003 |