diff options
Diffstat (limited to 'miasm2')
| -rw-r--r-- | miasm2/analysis/depgraph.py | 6 | ||||
| -rw-r--r-- | miasm2/arch/arm/sem.py | 4 | ||||
| -rw-r--r-- | miasm2/arch/mips32/ira.py | 4 | ||||
| -rw-r--r-- | miasm2/arch/mips32/sem.py | 4 | ||||
| -rw-r--r-- | miasm2/arch/x86/sem.py | 40 | ||||
| -rw-r--r-- | miasm2/core/sembuilder.py | 8 | ||||
| -rw-r--r-- | miasm2/ir/ir.py | 43 | ||||
| -rw-r--r-- | miasm2/jitter/codegen.py | 4 |
8 files changed, 68 insertions, 45 deletions
diff --git a/miasm2/analysis/depgraph.py b/miasm2/analysis/depgraph.py index 50e9dcf8..f2e87c41 100644 --- a/miasm2/analysis/depgraph.py +++ b/miasm2/analysis/depgraph.py @@ -5,7 +5,7 @@ from miasm2.core.graph import DiGraph from miasm2.core.asmbloc import asm_label, expr_is_int_or_label, expr_is_label from miasm2.expression.simplifications import expr_simp from miasm2.ir.symbexec import SymbolicExecutionEngine -from miasm2.ir.ir import irbloc, AssignBlock +from miasm2.ir.ir import IRBlock, AssignBlock from miasm2.ir.translators import Translator from miasm2.expression.expression_helper import possible_values @@ -270,7 +270,7 @@ class DependencyResult(DependencyState): assignblk[element] = irb.irs[line_nb][element] assignblks.append(assignblk) - return irbloc(irb.label, assignblks) + return IRBlock(irb.label, assignblks) def emul(self, ctx=None, step=False): """Symbolic execution of relevant nodes according to the history @@ -299,7 +299,7 @@ class DependencyResult(DependencyState): # Eval the block temp_label = asm_label("Temp") symb_exec = SymbolicExecutionEngine(self._ira, ctx_init) - symb_exec.emulbloc(irbloc(temp_label, assignblks), step=step) + symb_exec.emulbloc(IRBlock(temp_label, assignblks), step=step) # Return only inputs values (others could be wrongs) return {element: symb_exec.symbols[element] diff --git a/miasm2/arch/arm/sem.py b/miasm2/arch/arm/sem.py index 225b393c..742032e6 100644 --- a/miasm2/arch/arm/sem.py +++ b/miasm2/arch/arm/sem.py @@ -1,5 +1,5 @@ from miasm2.expression.expression import * -from miasm2.ir.ir import ir, irbloc +from miasm2.ir.ir import ir, IRBlock from miasm2.arch.arm.arch import mn_arm, mn_armt from miasm2.arch.arm.regs import * @@ -1055,7 +1055,7 @@ def add_condition_expr(ir, instr, cond, instr_ir): break if not has_irdst: instr_ir.append(ExprAff(ir.IRDst, lbl_next)) - e_do = irbloc(lbl_do.name, [instr_ir]) + e_do = IRBlock(lbl_do.name, [instr_ir]) e = [ExprAff(ir.IRDst, dst_cond)] return e, [e_do] diff --git a/miasm2/arch/mips32/ira.py b/miasm2/arch/mips32/ira.py index 8f7b2df3..6efbf8ae 100644 --- a/miasm2/arch/mips32/ira.py +++ b/miasm2/arch/mips32/ira.py @@ -1,7 +1,7 @@ #-*- coding:utf-8 -*- from miasm2.expression.expression import * -from miasm2.ir.ir import ir, irbloc, AssignBlock +from miasm2.ir.ir import ir, IRBlock, AssignBlock from miasm2.ir.analysis import ira from miasm2.arch.mips32.sem import ir_mips32l, ir_mips32b from miasm2.arch.mips32.regs import * @@ -47,7 +47,7 @@ class ir_a_mips32l(ir_mips32l, ira): irs = self.call_effects(pc_val, l) irs.append(AssignBlock([ExprAff(self.IRDst, ExprId(lbl, size=self.pc.size))])) - nbloc = irbloc(new_lbl, irs) + nbloc = IRBlock(new_lbl, irs) nbloc.lines = [l] * len(irs) self.blocs[new_lbl] = nbloc irb.dst = ExprId(new_lbl, size=self.pc.size) diff --git a/miasm2/arch/mips32/sem.py b/miasm2/arch/mips32/sem.py index b52b8401..74ad4f3e 100644 --- a/miasm2/arch/mips32/sem.py +++ b/miasm2/arch/mips32/sem.py @@ -1,5 +1,5 @@ import miasm2.expression.expression as m2_expr -from miasm2.ir.ir import ir, irbloc +from miasm2.ir.ir import ir, IRBlock from miasm2.arch.mips32.arch import mn_mips32 from miasm2.arch.mips32.regs import R_LO, R_HI, PC, RA from miasm2.core.sembuilder import SemBuilder @@ -468,7 +468,7 @@ class ir_mips32l(ir): if c is None: # print 'new c' label = self.get_label(l) - c = irbloc(label, [], []) + c = IRBlock(label, [], []) ir_blocs_all.append(c) bloc_dst = None # print 'Translate', l diff --git a/miasm2/arch/x86/sem.py b/miasm2/arch/x86/sem.py index 18a1421e..50faf557 100644 --- a/miasm2/arch/x86/sem.py +++ b/miasm2/arch/x86/sem.py @@ -21,7 +21,7 @@ from miasm2.expression.simplifications import expr_simp from miasm2.arch.x86.regs import * from miasm2.arch.x86.arch import mn_x86, repeat_mn, replace_regs from miasm2.expression.expression_helper import expr_cmps, expr_cmpu -from miasm2.ir.ir import ir, irbloc +from miasm2.ir.ir import ir, IRBlock from miasm2.core.sembuilder import SemBuilder import math import struct @@ -277,7 +277,7 @@ def gen_fcmov(ir, instr, cond, arg1, arg2, mov_if): e_do, extra_irs = [m2_expr.ExprAff(arg1, arg2)], [] e_do.append(m2_expr.ExprAff(ir.IRDst, lbl_skip)) e.append(m2_expr.ExprAff(ir.IRDst, m2_expr.ExprCond(cond, dstA, dstB))) - return e, [irbloc(lbl_do.name, [e_do])] + return e, [IRBlock(lbl_do.name, [e_do])] def gen_cmov(ir, instr, cond, dst, src, mov_if): @@ -297,7 +297,7 @@ def gen_cmov(ir, instr, cond, dst, src, mov_if): e_do, extra_irs = mov(ir, instr, dst, src) e_do.append(m2_expr.ExprAff(ir.IRDst, lbl_skip)) e.append(m2_expr.ExprAff(ir.IRDst, m2_expr.ExprCond(cond, dstA, dstB))) - return e, [irbloc(lbl_do.name, [e_do])] + return e, [IRBlock(lbl_do.name, [e_do])] def mov(_, instr, dst, src): @@ -518,7 +518,7 @@ def _rotate_tpl(ir, instr, dst, src, op, left=False, include_cf=False): e_do.append(m2_expr.ExprAff(ir.IRDst, lbl_skip)) e.append(m2_expr.ExprAff( ir.IRDst, m2_expr.ExprCond(shifter, lbl_do, lbl_skip))) - return (e, [irbloc(lbl_do.name, [e_do])]) + return (e, [IRBlock(lbl_do.name, [e_do])]) def l_rol(ir, instr, dst, src): @@ -615,7 +615,7 @@ def _shift_tpl(op, ir, instr, a, b, c=None, op_inv=None, left=False, e_do.append(m2_expr.ExprAff(ir.IRDst, lbl_skip)) e.append(m2_expr.ExprAff(ir.IRDst, m2_expr.ExprCond(shifter, lbl_do, lbl_skip))) - return e, [irbloc(lbl_do.name, [e_do])] + return e, [IRBlock(lbl_do.name, [e_do])] def sar(ir, instr, dst, src): @@ -963,7 +963,7 @@ def cmps(ir, instr, size): e0.append(m2_expr.ExprAff(b.arg, b.arg + m2_expr.ExprInt(size / 8, b.arg.size))) e0.append(m2_expr.ExprAff(ir.IRDst, lbl_next)) - e0 = irbloc(lbl_df_0.name, [e0]) + e0 = IRBlock(lbl_df_0.name, [e0]) e1 = [] e1.append(m2_expr.ExprAff(a.arg, @@ -971,7 +971,7 @@ def cmps(ir, instr, size): e1.append(m2_expr.ExprAff(b.arg, b.arg - m2_expr.ExprInt(size / 8, b.arg.size))) e1.append(m2_expr.ExprAff(ir.IRDst, lbl_next)) - e1 = irbloc(lbl_df_1.name, [e1]) + e1 = IRBlock(lbl_df_1.name, [e1]) e.append(m2_expr.ExprAff(ir.IRDst, m2_expr.ExprCond(df, lbl_df_1, lbl_df_0))) @@ -992,13 +992,13 @@ def scas(ir, instr, size): e0.append(m2_expr.ExprAff(a.arg, a.arg + m2_expr.ExprInt(size / 8, a.arg.size))) e0.append(m2_expr.ExprAff(ir.IRDst, lbl_next)) - e0 = irbloc(lbl_df_0.name, [e0]) + e0 = IRBlock(lbl_df_0.name, [e0]) e1 = [] e1.append(m2_expr.ExprAff(a.arg, a.arg - m2_expr.ExprInt(size / 8, a.arg.size))) e1.append(m2_expr.ExprAff(ir.IRDst, lbl_next)) - e1 = irbloc(lbl_df_1.name, [e1]) + e1 = IRBlock(lbl_df_1.name, [e1]) e.append(m2_expr.ExprAff(ir.IRDst, m2_expr.ExprCond(df, lbl_df_1, lbl_df_0))) @@ -1641,12 +1641,12 @@ def stos(ir, instr, size): e0 = [] e0.append(m2_expr.ExprAff(addr_o, addr_p)) e0.append(m2_expr.ExprAff(ir.IRDst, lbl_next)) - e0 = irbloc(lbl_df_0.name, [e0]) + e0 = IRBlock(lbl_df_0.name, [e0]) e1 = [] e1.append(m2_expr.ExprAff(addr_o, addr_m)) e1.append(m2_expr.ExprAff(ir.IRDst, lbl_next)) - e1 = irbloc(lbl_df_1.name, [e1]) + e1 = IRBlock(lbl_df_1.name, [e1]) e = [] e.append(m2_expr.ExprAff(ir.ExprMem(addr, size), b)) @@ -1676,12 +1676,12 @@ def lods(ir, instr, size): e0 = [] e0.append(m2_expr.ExprAff(addr_o, addr_p)) e0.append(m2_expr.ExprAff(ir.IRDst, lbl_next)) - e0 = irbloc(lbl_df_0.name, [e0]) + e0 = IRBlock(lbl_df_0.name, [e0]) e1 = [] e1.append(m2_expr.ExprAff(addr_o, addr_m)) e1.append(m2_expr.ExprAff(ir.IRDst, lbl_next)) - e1 = irbloc(lbl_df_1.name, [e1]) + e1 = IRBlock(lbl_df_1.name, [e1]) e = [] if instr.mode == 64 and b.size == 32: @@ -1718,13 +1718,13 @@ def movs(ir, instr, size): e0.append(m2_expr.ExprAff(a, a + m2_expr.ExprInt(size / 8, a.size))) e0.append(m2_expr.ExprAff(b, b + m2_expr.ExprInt(size / 8, b.size))) e0.append(m2_expr.ExprAff(ir.IRDst, lbl_next)) - e0 = irbloc(lbl_df_0.name, [e0]) + e0 = IRBlock(lbl_df_0.name, [e0]) e1 = [] e1.append(m2_expr.ExprAff(a, a - m2_expr.ExprInt(size / 8, a.size))) e1.append(m2_expr.ExprAff(b, b - m2_expr.ExprInt(size / 8, b.size))) e1.append(m2_expr.ExprAff(ir.IRDst, lbl_next)) - e1 = irbloc(lbl_df_1.name, [e1]) + e1 = IRBlock(lbl_df_1.name, [e1]) e.append(m2_expr.ExprAff(ir.IRDst, m2_expr.ExprCond(df, lbl_df_1, lbl_df_0))) @@ -2758,8 +2758,8 @@ def bsr_bsf(ir, instr, dst, src, op_name): e_src_not_null.append(m2_expr.ExprAff(dst, m2_expr.ExprOp(op_name, src))) e_src_not_null.append(aff_dst) - return e, [irbloc(lbl_src_null.name, [e_src_null]), - irbloc(lbl_src_not_null.name, [e_src_not_null])] + return e, [IRBlock(lbl_src_null.name, [e_src_null]), + IRBlock(lbl_src_not_null.name, [e_src_not_null])] def bsf(ir, instr, dst, src): @@ -3655,7 +3655,7 @@ def ps_rl_ll(ir, instr, dst, src, op, size): e_do = [] e.append(m2_expr.ExprAff(dst[0:dst.size], m2_expr.ExprCompose(*slices))) e_do.append(m2_expr.ExprAff(ir.IRDst, lbl_next)) - return e, [irbloc(lbl_do.name, [e_do]), irbloc(lbl_zero.name, [e_zero])] + return e, [IRBlock(lbl_do.name, [e_do]), IRBlock(lbl_zero.name, [e_zero])] def psrlw(ir, instr, dst, src): @@ -4583,10 +4583,10 @@ class ir_x86_16(ir): cond_bloc.append(m2_expr.ExprAff(self.IRDst, m2_expr.ExprCond(c_cond, lbl_skip, lbl_do))) - cond_bloc = irbloc(lbl_end.name, [cond_bloc]) + cond_bloc = IRBlock(lbl_end.name, [cond_bloc]) e_do = instr_ir - c = irbloc(lbl_do.name, [e_do]) + c = IRBlock(lbl_do.name, [e_do]) c.except_automod = False e_n = [m2_expr.ExprAff(self.IRDst, m2_expr.ExprCond(c_reg, lbl_do, lbl_skip))] diff --git a/miasm2/core/sembuilder.py b/miasm2/core/sembuilder.py index 6ff390bb..f101d94c 100644 --- a/miasm2/core/sembuilder.py +++ b/miasm2/core/sembuilder.py @@ -5,7 +5,7 @@ import ast import re import miasm2.expression.expression as m2_expr -from miasm2.ir.ir import irbloc +from miasm2.ir.ir import IRBlock class MiasmTransformer(ast.NodeTransformer): @@ -125,7 +125,7 @@ class SemBuilder(object): # Init self.transformer = MiasmTransformer() self._ctx = dict(m2_expr.__dict__) - self._ctx["irbloc"] = irbloc + self._ctx["IRBlock"] = IRBlock self._functions = {} # Update context @@ -250,12 +250,12 @@ class SemBuilder(object): sub_blocks[-1] = ast.List(elts=sub_blocks[-1], ctx=ast.Load()) - ## Replace the block with a call to 'irbloc' + ## Replace the block with a call to 'IRBlock' lbl_if_name = ast.Attribute(value=ast.Name(id=lbl_name, ctx=ast.Load()), attr='name', ctx=ast.Load()) - sub_blocks[-1] = ast.Call(func=ast.Name(id='irbloc', + sub_blocks[-1] = ast.Call(func=ast.Name(id='IRBlock', ctx=ast.Load()), args=[lbl_if_name, sub_blocks[-1]], diff --git a/miasm2/ir/ir.py b/miasm2/ir/ir.py index 0a7d68ce..b06a8136 100644 --- a/miasm2/ir/ir.py +++ b/miasm2/ir/ir.py @@ -17,6 +17,8 @@ # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. # +import warnings + from itertools import chain import miasm2.expression.expression as m2_expr @@ -95,7 +97,7 @@ class AssignBlock(dict): # Build the merging expression args = list(e_colision.union(remaining)) - args.sort(key=lambda x:x[1]) + args.sort(key=lambda x: x[1]) starts = [start for (_, start, _) in args] assert len(set(starts)) == len(starts) args = [expr for (expr, _, _) in args] @@ -108,7 +110,7 @@ class AssignBlock(dict): """Return an Expr list of extra expressions needed during the object instanciation""" if not isinstance(src, m2_expr.ExprCompose): - raise ValueError("Get mod slice not on expraff slice", str(self)) + raise ValueError("Get mod slice not on expraff slice", str(src)) modified_s = [] for index, arg in src.iter_args(): if not (isinstance(arg, m2_expr.ExprSlice) and @@ -160,10 +162,20 @@ class AssignBlock(dict): return m2_expr.ExprAff(dst, self[dst]) -class irbloc(object): +class IRBlock(object): + """Intermediate representation block object. + + Stand for an intermediate representation basic block. + """ def __init__(self, label, irs, lines=None): - assert(isinstance(label, asm_label)) + """ + @label: asm_label of the IR basic block + @irs: list of AssignBlock + @lines: list of native instructions + """ + + assert isinstance(label, asm_label) if lines is None: lines = [] self.label = label @@ -196,7 +208,7 @@ class irbloc(object): assignblk = self.irs[self._dst_linenb] for dst in assignblk: if isinstance(dst, m2_expr.ExprId) and dst.name == "IRDst": - del(assignblk[dst]) + del assignblk[dst] assignblk[dst] = value # Sanity check is already done in _get_dst break @@ -240,6 +252,17 @@ class irbloc(object): return "\n".join(out) +class irbloc(IRBlock): + """ + DEPRECATED object + Use IRBlock instead of irbloc + """ + + def __init__(self, label, irs, lines=None): + warnings.warn('DEPRECATION WARNING: use "IRBlock" instead of "irblock"') + super(irbloc, self).__init__(label, irs, lines) + + class DiGraphIR(DiGraph): """DiGraph for IR instances""" @@ -330,7 +353,7 @@ class ir(object): ad = ad.name if isinstance(ad, m2_expr.ExprInt): ad = int(ad) - if type(ad) in [int, long]: + if isinstance(ad, (int, long)): ad = self.symbol_pool.getby_offset_create(ad) elif isinstance(ad, asm_label): ad = self.symbol_pool.getby_name_create(ad.name) @@ -360,7 +383,7 @@ class ir(object): c.irs.append(AssignBlock([m2_expr.ExprAff(self.pc, m2_expr.ExprInt(l.offset, self.pc.size) - )])) + )])) c.lines.append(l) def pre_add_instr(self, block, instr, irb_cur, ir_blocks_all, gen_pc_updt): @@ -413,7 +436,7 @@ class ir(object): irb_cur = None return irb_cur - def add_bloc(self, block, gen_pc_updt = False): + def add_bloc(self, block, gen_pc_updt=False): """ Add a native block to the current IR @block: native assembly block @@ -425,7 +448,7 @@ class ir(object): for instr in block.lines: if irb_cur is None: label = self.get_instr_label(instr) - irb_cur = irbloc(label, [], []) + irb_cur = IRBlock(label, [], []) ir_blocks_all.append(irb_cur) irb_cur = self.add_instr_to_irblock(block, instr, irb_cur, ir_blocks_all, gen_pc_updt) @@ -522,7 +545,7 @@ class ir(object): dst = todo.pop() if expr_is_label(dst): done.add(dst) - elif isinstance(dst, m2_expr.ExprMem) or isinstance(dst, m2_expr.ExprInt): + elif isinstance(dst, (m2_expr.ExprMem, m2_expr.ExprInt)): done.add(dst) elif isinstance(dst, m2_expr.ExprCond): todo.add(dst.src1) diff --git a/miasm2/jitter/codegen.py b/miasm2/jitter/codegen.py index 2503e104..d5d8204f 100644 --- a/miasm2/jitter/codegen.py +++ b/miasm2/jitter/codegen.py @@ -1,5 +1,5 @@ import miasm2.expression.expression as m2_expr -from miasm2.ir.ir import irbloc +from miasm2.ir.ir import IRBlock from miasm2.ir.translators import Translator from miasm2.core.asmbloc import expr_is_label, asm_block_bad, asm_label @@ -134,7 +134,7 @@ class CGen(object): instr.offset + instr.l, self.ir_arch.IRDst.size) - return irbloc(self.ir_arch.get_instr_label(instr), [assignblk]) + return IRBlock(self.ir_arch.get_instr_label(instr), [assignblk]) def block2assignblks(self, block): irblocks_list = [] |