From eca476334f93f023e57048453eb9ec4ee4fab9d2 Mon Sep 17 00:00:00 2001 From: Fabrice Desclaux Date: Thu, 8 Feb 2018 17:02:35 +0100 Subject: IRBlock: replace irs by assignblks --- example/expression/access_c.py | 8 ++++---- example/expression/get_read_write.py | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) (limited to 'example/expression') diff --git a/example/expression/access_c.py b/example/expression/access_c.py index f285eb55..45f911ab 100644 --- a/example/expression/access_c.py +++ b/example/expression/access_c.py @@ -60,15 +60,15 @@ def find_call(ira): for irb in ira.blocks.values(): out = set() - if len(irb.irs) < 2: + if len(irb.assignblks) < 2: continue - assignblk = irb.irs[-2] + assignblk = irb.assignblks[-2] for src in assignblk.itervalues(): if not isinstance(src, ExprOp): continue if not src.op.startswith('call_func'): continue - out.add((irb, len(irb.irs) - 2)) + out.add((irb, len(irb.assignblks) - 2)) if len(out) != 1: continue irb, index = out.pop() @@ -98,7 +98,7 @@ def get_funcs_arg0(ctx, ira, lbl_head): element = ira.arch.regs.RSI for irb, index in find_call(ira): - instr = irb.irs[index].instr + instr = irb.assignblks[index].instr print 'Analysing references from:', hex(instr.offset), instr g_list = g_dep.get(irb.label, set([element]), index, set([lbl_head])) for dep in g_list: diff --git a/example/expression/get_read_write.py b/example/expression/get_read_write.py index f4dde4b5..a31105b2 100644 --- a/example/expression/get_read_write.py +++ b/example/expression/get_read_write.py @@ -18,7 +18,7 @@ ir_arch.add_instr(l) print '*' * 80 for lbl, b in ir_arch.blocks.items(): print b - for irs in b.irs: + for irs in b.assignblks: o_r, o_w = get_rw(irs) print 'read: ', [str(x) for x in o_r] print 'written:', [str(x) for x in o_w] -- cgit 1.4.1 From 4b257d2d82c6323c6bc521017d0649b8cc7b3747 Mon Sep 17 00:00:00 2001 From: Fabrice Desclaux Date: Fri, 9 Feb 2018 10:01:53 +0100 Subject: IRBlock: irblock iterates on its assignblks --- example/expression/get_read_write.py | 8 ++--- example/ida/ctype_propagation.py | 2 +- example/ida/depgraph.py | 4 +-- example/ida/graph_ir.py | 4 +-- example/symbol_exec/depgraph.py | 6 ++-- miasm2/analysis/cst_propag.py | 2 +- miasm2/analysis/data_analysis.py | 2 +- miasm2/analysis/data_flow.py | 58 ++++++++++++++++++------------------ miasm2/analysis/disasm_cb.py | 4 +-- miasm2/arch/aarch64/sem.py | 4 +-- miasm2/arch/mips32/ira.py | 2 +- miasm2/arch/mips32/jit.py | 4 +-- miasm2/arch/x86/sem.py | 2 +- miasm2/ir/ir.py | 37 +++++++++++++---------- miasm2/ir/symbexec.py | 2 +- miasm2/jitter/codegen.py | 4 +-- miasm2/jitter/jitcore_python.py | 2 +- miasm2/jitter/llvmconvert.py | 2 +- test/analysis/depgraph.py | 2 +- test/core/sembuilder.py | 4 +-- 20 files changed, 80 insertions(+), 75 deletions(-) (limited to 'example/expression') diff --git a/example/expression/get_read_write.py b/example/expression/get_read_write.py index a31105b2..b4a0773b 100644 --- a/example/expression/get_read_write.py +++ b/example/expression/get_read_write.py @@ -16,10 +16,10 @@ l.offset, l.l = 0, 15 ir_arch.add_instr(l) print '*' * 80 -for lbl, b in ir_arch.blocks.items(): - print b - for irs in b.assignblks: - o_r, o_w = get_rw(irs) +for lbl, irblock in ir_arch.blocks.items(): + print irblock + for assignblk in irblock: + o_r, o_w = get_rw(assignblk) print 'read: ', [str(x) for x in o_r] print 'written:', [str(x) for x in o_w] print diff --git a/example/ida/ctype_propagation.py b/example/ida/ctype_propagation.py index 88036bcb..54b23516 100644 --- a/example/ida/ctype_propagation.py +++ b/example/ida/ctype_propagation.py @@ -114,7 +114,7 @@ class SymbExecCTypeFix(SymbExecCType): """ offset2cmt = {} - for index, assignblk in enumerate(irb.assignblks): + for index, assignblk in enumerate(irb): if set(assignblk) == set([self.ir_arch.IRDst, self.ir_arch.pc]): # Don't display on jxx continue diff --git a/example/ida/depgraph.py b/example/ida/depgraph.py index aee0697e..a946706c 100644 --- a/example/ida/depgraph.py +++ b/example/ida/depgraph.py @@ -34,7 +34,7 @@ class depGraphSettingsForm(ida_kernwin.Form): cur_block = block assert cur_block is not None line_nb = None - for line_nb, assignblk in enumerate(cur_block.assignblks): + for line_nb, assignblk in enumerate(cur_block): if assignblk.instr.offset == self.address: break assert line_nb is not None @@ -229,7 +229,7 @@ def launch_depgraph(): for irb in ir_arch.blocks.values(): irs = [] fix_stack = irb.label.offset is not None and settings.unalias_stack - for assignblk in irb.assignblks: + for assignblk in irb: if fix_stack: stk_high = m2_expr.ExprInt(idc.GetSpd(assignblk.instr.offset), ir_arch.sp.size) fix_dct = {ir_arch.sp: mn.regs.regs_init[ir_arch.sp] + stk_high} diff --git a/example/ida/graph_ir.py b/example/ida/graph_ir.py index ca4ad55c..7e303aac 100644 --- a/example/ida/graph_ir.py +++ b/example/ida/graph_ir.py @@ -40,7 +40,7 @@ def color_irblock(irblock, ir_arch): out = [] lbl = idaapi.COLSTR(str(irblock.label), idaapi.SCOLOR_INSN) out.append(lbl) - for assignblk in irblock.assignblks: + for assignblk in irblock: for dst, src in sorted(assignblk.iteritems()): dst_f = expr2colorstr(ir_arch.arch.regs.all_regs_ids, dst) src_f = expr2colorstr(ir_arch.arch.regs.all_regs_ids, src) @@ -148,7 +148,7 @@ def build_graph(verbose=False, simplify=False): for irb in ir_arch.blocks.itervalues(): irs = [] - for assignblk in irb.assignblks: + for assignblk in irb: new_assignblk = { expr_simp(dst): expr_simp(src) for dst, src in assignblk.iteritems() diff --git a/example/symbol_exec/depgraph.py b/example/symbol_exec/depgraph.py index ae66fbaa..e24f7f9b 100644 --- a/example/symbol_exec/depgraph.py +++ b/example/symbol_exec/depgraph.py @@ -74,14 +74,14 @@ dg = DependencyGraph(ir_arch, implicit=args.implicit, # Build information target_addr = int(args.target_addr, 0) current_block = list(ir_arch.getby_offset(target_addr))[0] -line_nb = 0 -for line_nb, assignblk in enumerate(current_block.assignblks): +assignblk_index = 0 +for assignblk_index, assignblk in enumerate(current_block): if assignblk.instr.offset == target_addr: break # Enumerate solutions json_solutions = [] -for sol_nb, sol in enumerate(dg.get(current_block.label, elements, line_nb, set())): +for sol_nb, sol in enumerate(dg.get(current_block.label, elements, assignblk_index, set())): fname = "sol_%d.dot" % sol_nb with open(fname, "w") as fdesc: fdesc.write(sol.graph.dot()) diff --git a/miasm2/analysis/cst_propag.py b/miasm2/analysis/cst_propag.py index f1326c3e..402418de 100644 --- a/miasm2/analysis/cst_propag.py +++ b/miasm2/analysis/cst_propag.py @@ -93,7 +93,7 @@ class SymbExecStateFix(SymbolicExecutionEngine): @step: display intermediate steps """ assignblks = [] - for index, assignblk in enumerate(irb.assignblks): + for index, assignblk in enumerate(irb): new_assignblk = {} links = {} for dst, src in assignblk.iteritems(): diff --git a/miasm2/analysis/data_analysis.py b/miasm2/analysis/data_analysis.py index ed4e735c..fd50c855 100644 --- a/miasm2/analysis/data_analysis.py +++ b/miasm2/analysis/data_analysis.py @@ -14,7 +14,7 @@ def intra_block_flow_raw(ir_arch, flow_graph, irb, in_nodes, out_nodes): Create data flow for an irbloc using raw IR expressions """ current_nodes = {} - for i, assignblk in enumerate(irb.assignblks): + for i, assignblk in enumerate(irb): dict_rw = assignblk.get_rw(cst_read=True) if irb.label.offset == 0x13: print irb.label diff --git a/miasm2/analysis/data_flow.py b/miasm2/analysis/data_flow.py index 746c19cb..da79cf75 100644 --- a/miasm2/analysis/data_flow.py +++ b/miasm2/analysis/data_flow.py @@ -26,7 +26,7 @@ class ReachingDefinitions(dict): IBM Thomas J. Watson Research Division, Algorithm MK This class is usable as a dictionnary whose struture is - { (block, instr_index): { lvalue: set((block, instr_index)) } } + { (block, index): { lvalue: set((block, index)) } } """ ir_a = None @@ -36,12 +36,12 @@ class ReachingDefinitions(dict): self.ir_a = ir_a self.compute() - def get_definitions(self, block_lbl, instruction): - """Returns the dict { lvalue: set((def_block_lbl, def_instr_index)) } - associated with self.ir_a.@block.assignblks[@instruction] + def get_definitions(self, block_lbl, assignblk_index): + """Returns the dict { lvalue: set((def_block_lbl, def_index)) } + associated with self.ir_a.@block.assignblks[@assignblk_index] or {} if it is not yet computed """ - return self.get((block_lbl, instruction), {}) + return self.get((block_lbl, assignblk_index), {}) def compute(self): """This is the main fixpoint""" @@ -54,7 +54,7 @@ class ReachingDefinitions(dict): def process_block(self, block): """ Fetch reach definitions from predecessors and propagate it to - the instruction in block @block. + the assignblk in block @block. """ predecessor_state = {} for pred_lbl in self.ir_a.graph.predecessors(block.label): @@ -67,26 +67,26 @@ class ReachingDefinitions(dict): return False self[(block.label, 0)] = predecessor_state - for instr_index in xrange(len(block.assignblks)): - modified |= self.process_instruction(block, instr_index) + for index in xrange(len(block.assignblks)): + modified |= self.process_instruction(block, index) return modified - def process_instruction(self, block, instr_index): + def process_instruction(self, block, assignblk_index): """ Updates the reach definitions with values defined at - instruction @instr_index in block @block. - NB: the effect of instruction @instr_index in stored at index - (@block, @instr_index + 1). + instruction @assignblk_index in block @block. + NB: the effect of instruction @assignblk_index in stored at index + (@block, @assignblk_index + 1). """ - instr = block.assignblks[instr_index] - defs = self.get_definitions(block.label, instr_index).copy() + instr = block.assignblks[assignblk_index] + defs = self.get_definitions(block.label, assignblk_index).copy() for lval in instr: - defs.update({lval: set([(block.label, instr_index)])}) + defs.update({lval: set([(block.label, assignblk_index)])}) - modified = self.get((block.label, instr_index + 1)) != defs + modified = self.get((block.label, assignblk_index + 1)) != defs if modified: - self[(block.label, instr_index + 1)] = defs + self[(block.label, assignblk_index + 1)] = defs return modified @@ -148,10 +148,10 @@ class DiGraphDefUse(DiGraph): deref_mem=deref_mem) def _compute_def_use_block(self, block, reaching_defs, deref_mem=False): - for ind, instr in enumerate(block.assignblks): - instruction_reaching_defs = reaching_defs.get_definitions(block.label, ind) - for lval, expr in instr.iteritems(): - self.add_node(InstrNode(block.label, ind, lval)) + for index, assignblk in enumerate(block): + instruction_reaching_defs = reaching_defs.get_definitions(block.label, index) + for lval, expr in assignblk.iteritems(): + self.add_node(InstrNode(block.label, index, lval)) read_vars = expr.get_r(mem_read=deref_mem) if deref_mem and lval.is_mem(): @@ -159,7 +159,7 @@ class DiGraphDefUse(DiGraph): for read_var in read_vars: for reach in instruction_reaching_defs.get(read_var, set()): self.add_data_edge(InstrNode(reach[0], reach[1], read_var), - InstrNode(block.label, ind, lval)) + InstrNode(block.label, index, lval)) def del_edge(self, src, dst): super(DiGraphDefUse, self).del_edge(src, dst) @@ -178,12 +178,12 @@ class DiGraphDefUse(DiGraph): self.add_uniq_labeled_edge(src, dst, ATTR_DEP) def node2lines(self, node): - lbl, ind, reg = node - yield self.DotCellDescription(text="%s (%s)" % (lbl, ind), + lbl, index, reg = node + yield self.DotCellDescription(text="%s (%s)" % (lbl, index), attr={'align': 'center', 'colspan': 2, 'bgcolor': 'grey'}) - src = self._blocks[lbl].assignblks[ind][reg] + src = self._blocks[lbl].assignblks[index][reg] line = "%s = %s" % (reg, src) yield self.DotCellDescription(text=line, attr={}) yield self.DotCellDescription(text="", attr={}) @@ -223,12 +223,12 @@ def dead_simp_useful_instrs(defuse, reaching_defs): useful.add(InstrNode(definition[0], definition[1], lval)) # Force keeping of specific cases - for instr_index, instr in enumerate(block.assignblks): - for lval, rval in instr.iteritems(): + for index, assignblk in enumerate(block): + for lval, rval in assignblk.iteritems(): if (lval.is_mem() or ir_a.IRDst == lval or rval.is_function_call()): - useful.add(InstrNode(block_lbl, instr_index, lval)) + useful.add(InstrNode(block_lbl, index, lval)) # Useful nodes dependencies for node in useful: @@ -249,7 +249,7 @@ def dead_simp(ir_a): useful = set(dead_simp_useful_instrs(defuse, reaching_defs)) for block in ir_a.blocks.itervalues(): irs = [] - for idx, assignblk in enumerate(block.assignblks): + for idx, assignblk in enumerate(block): new_assignblk = dict(assignblk) for lval in assignblk: if InstrNode(block.label, idx, lval) not in useful: diff --git a/miasm2/analysis/disasm_cb.py b/miasm2/analysis/disasm_cb.py index 09c0b2b4..e759e313 100644 --- a/miasm2/analysis/disasm_cb.py +++ b/miasm2/analysis/disasm_cb.py @@ -39,7 +39,7 @@ def arm_guess_subcall( # print irblock pc_val = None lr_val = None - for exprs in irblock.assignblks: + for exprs in irblock: for e in exprs: if e.dst == ir_arch.pc: pc_val = e.src @@ -84,7 +84,7 @@ def arm_guess_jump_table( # print irblock pc_val = None # lr_val = None - for exprs in irblock.assignblks: + for exprs in irblock: for e in exprs: if e.dst == ir_arch.pc: pc_val = e.src diff --git a/miasm2/arch/aarch64/sem.py b/miasm2/arch/aarch64/sem.py index 62a3c21c..a575c819 100644 --- a/miasm2/arch/aarch64/sem.py +++ b/miasm2/arch/aarch64/sem.py @@ -827,7 +827,7 @@ class ir_aarch64l(IntermediateRepresentation): def irbloc_fix_regs_for_mode(self, irblock, mode=64): irs = [] - for assignblk in irblock.assignblks: + for assignblk in irblock: new_assignblk = dict(assignblk) for dst, src in assignblk.iteritems(): del(new_assignblk[dst]) @@ -870,7 +870,7 @@ class ir_aarch64l(IntermediateRepresentation): new_irblocks = [] for irblock in extra_ir: irs = [] - for assignblk in irblock.assignblks: + for assignblk in irblock: new_dsts = {dst:src for dst, src in assignblk.iteritems() if dst not in regs_to_fix} irs.append(AssignBlock(new_dsts, assignblk.instr)) diff --git a/miasm2/arch/mips32/ira.py b/miasm2/arch/mips32/ira.py index ab242815..7aefad32 100644 --- a/miasm2/arch/mips32/ira.py +++ b/miasm2/arch/mips32/ira.py @@ -21,7 +21,7 @@ class ir_a_mips32l(ir_mips32l, ira): for irb in ir_blocks: pc_val = None lr_val = None - for assignblk in irb.assignblks: + for assignblk in irb: pc_val = assignblk.get(self.arch.regs.PC, pc_val) lr_val = assignblk.get(self.arch.regs.RA, lr_val) diff --git a/miasm2/arch/mips32/jit.py b/miasm2/arch/mips32/jit.py index 767393bc..f3e54a7d 100644 --- a/miasm2/arch/mips32/jit.py +++ b/miasm2/arch/mips32/jit.py @@ -42,12 +42,12 @@ class mipsCGen(CGen): irblocks_list = super(mipsCGen, self).block2assignblks(block) for irblocks in irblocks_list: for blk_idx, irblock in enumerate(irblocks): - has_breakflow = any(assignblock.instr.breakflow() for assignblock in irblock.assignblks) + has_breakflow = any(assignblock.instr.breakflow() for assignblock in irblock) if not has_breakflow: continue irs = [] - for assignblock in irblock.assignblks: + for assignblock in irblock: if self.ir_arch.pc not in assignblock: irs.append(AssignBlock(assignments, assignblock.instr)) continue diff --git a/miasm2/arch/x86/sem.py b/miasm2/arch/x86/sem.py index cb2f6a87..3cbf5526 100644 --- a/miasm2/arch/x86/sem.py +++ b/miasm2/arch/x86/sem.py @@ -4793,7 +4793,7 @@ class ir_x86_16(IntermediateRepresentation): def irbloc_fix_regs_for_mode(self, irblock, mode=64): irs = [] - for assignblk in irblock.assignblks: + for assignblk in irblock: new_assignblk = dict(assignblk) for dst, src in assignblk.iteritems(): del new_assignblk[dst] diff --git a/miasm2/ir/ir.py b/miasm2/ir/ir.py index 4f21c91d..8b1a1033 100644 --- a/miasm2/ir/ir.py +++ b/miasm2/ir/ir.py @@ -284,13 +284,17 @@ class IRBlock(object): warnings.warn('DEPRECATION WARNING: use "irblock.assignblks" instead of "irblock.irs"') return self._assignblks + def __iter__(self): + """Iterate on assignblks""" + return self._assignblks.__iter__() + def is_dst_set(self): return self._dst is not None def cache_dst(self): final_dst = None final_linenb = None - for linenb, assignblk in enumerate(self.assignblks): + for linenb, assignblk in enumerate(self): for dst, src in assignblk.iteritems(): if dst.is_id("IRDst"): if final_dst is not None: @@ -312,7 +316,7 @@ class IRBlock(object): """Generate a new IRBlock with a dst (IRBlock) fixed to @value""" irs = [] dst_found = False - for assignblk in self.assignblks: + for assignblk in self: new_assignblk = {} for dst, src in assignblk.iteritems(): if dst.is_id("IRDst"): @@ -334,7 +338,7 @@ class IRBlock(object): def __str__(self): out = [] out.append('%s' % self.label) - for assignblk in self.assignblks: + for assignblk in self: for dst, src in assignblk.iteritems(): out.append('\t%s = %s' % (dst, src)) out.append("") @@ -355,7 +359,7 @@ class IRBlock(object): mod_src = lambda expr:expr assignblks = [] - for assignblk in self.assignblks: + for assignblk in self: new_assignblk = {} for dst, src in assignblk.iteritems(): new_assignblk[mod_dst(dst)] = mod_src(src) @@ -393,7 +397,7 @@ class DiGraphIR(DiGraph): if node not in self._blocks: yield [self.DotCellDescription(text="NOT PRESENT", attr={})] raise StopIteration - for i, assignblk in enumerate(self._blocks[node].assignblks): + for i, assignblk in enumerate(self._blocks[node]): for dst, src in assignblk.iteritems(): line = "%s = %s" % (dst, src) if self._dot_offset: @@ -462,7 +466,7 @@ class IntermediateRepresentation(object): ir_bloc_cur, extra_irblocks = self.get_ir(instr) for index, irb in enumerate(extra_irblocks): irs = [] - for assignblk in irb.assignblks: + for assignblk in irb: irs.append(AssignBlock(assignblk, instr)) extra_irblocks[index] = IRBlock(irb.label, irs) assignblk = AssignBlock(ir_bloc_cur, instr) @@ -508,7 +512,7 @@ class IntermediateRepresentation(object): def getby_offset(self, offset): out = set() for irb in self.blocks.values(): - for assignblk in irb.assignblks: + for assignblk in irb: instr = assignblk.instr if instr.offset <= offset < instr.offset + instr.l: out.add(irb) @@ -613,11 +617,12 @@ class IntermediateRepresentation(object): return irblock def is_pc_written(self, block): + """Return the first Assignblk of the @blockin which PC is written + @block: IRBlock instance""" all_pc = self.arch.pc.values() - for irs in block.assignblks: - for assignblk in irs: - if assignblk.dst in all_pc: - return assignblk + for assignblk in block: + if assignblk.dst in all_pc: + return assignblk return None def set_empty_dst_to_next(self, block, ir_blocks): @@ -676,13 +681,13 @@ class IntermediateRepresentation(object): """ for label, block in self.blocks.iteritems(): assignblks = [] - for assignblk in block.assignblks: + for assignblk in block: new_assignblk = assignblk.simplify(simplifier) assignblks.append(new_assignblk) self.blocks[label] = IRBlock(label, assignblks) def replace_expr_in_ir(self, bloc, rep): - for assignblk in bloc.assignblks: + for assignblk in bloc: for dst, src in assignblk.items(): del assignblk[dst] assignblk[dst.replace_expr(rep)] = src.replace_expr(rep) @@ -726,7 +731,7 @@ class IntermediateRepresentation(object): todo = set([irb.dst]) done = set() - for assignblk in reversed(irb.assignblks): + for assignblk in reversed(irb): if not todo: break out = self._extract_dst(todo, done) @@ -768,7 +773,7 @@ class IntermediateRepresentation(object): modified = False for label, block in self.blocks.iteritems(): irs = [] - for assignblk in block.assignblks: + for assignblk in block: if len(assignblk): irs.append(assignblk) else: @@ -866,7 +871,7 @@ class IntermediateRepresentation(object): continue # Block has one son, son has one parent => merge assignblks =[] - for assignblk in self.blocks[block].assignblks: + for assignblk in self.blocks[block]: if self.IRDst not in assignblk: assignblks.append(assignblk) continue diff --git a/miasm2/ir/symbexec.py b/miasm2/ir/symbexec.py index 64851542..8ecde21c 100644 --- a/miasm2/ir/symbexec.py +++ b/miasm2/ir/symbexec.py @@ -524,7 +524,7 @@ class SymbolicExecutionEngine(object): @irb: irbloc instance @step: display intermediate steps """ - for assignblk in irb.assignblks: + for assignblk in irb: if step: print 'Instr', assignblk.instr print 'Assignblk:' diff --git a/miasm2/jitter/codegen.py b/miasm2/jitter/codegen.py index 0f31bc59..9ed55f37 100644 --- a/miasm2/jitter/codegen.py +++ b/miasm2/jitter/codegen.py @@ -489,7 +489,7 @@ class CGen(object): for irblock in irblocks: attributes = [] irblocks_attributes.append(attributes) - for assignblk in irblock.assignblks: + for assignblk in irblock: attrib = Attributes(log_mn, log_regs) attributes.append(attrib) self.get_caracteristics(assignblk, attrib) @@ -534,7 +534,7 @@ class CGen(object): out = [] dst2index = None - for index, assignblk in enumerate(irblock.assignblks): + for index, assignblk in enumerate(irblock): if index == irblock.dst_linenb: c_dst, dst2index = self.gen_assignblk_dst(irblock.dst) else: diff --git a/miasm2/jitter/jitcore_python.py b/miasm2/jitter/jitcore_python.py index 6f0f029b..a74ef7e6 100644 --- a/miasm2/jitter/jitcore_python.py +++ b/miasm2/jitter/jitcore_python.py @@ -72,7 +72,7 @@ class JitCore_Python(jitcore.JitCore): exec_engine.update_engine_from_cpu() # Execute current ir bloc - for assignblk in irb.assignblks: + for assignblk in irb: instr = assignblk.instr # For each new instruction (in assembly) if instr.offset not in offsets_jitted: diff --git a/miasm2/jitter/llvmconvert.py b/miasm2/jitter/llvmconvert.py index c5e009a0..5fa749a5 100644 --- a/miasm2/jitter/llvmconvert.py +++ b/miasm2/jitter/llvmconvert.py @@ -1138,7 +1138,7 @@ class LLVMFunction(): case_value = None instr = instr_attrib.instr - for index, assignblk in enumerate(irblock.assignblks): + for index, assignblk in enumerate(irblock): # Enable cache self.main_stream = True self.expr_cache = {} diff --git a/test/analysis/depgraph.py b/test/analysis/depgraph.py index bc7494e2..20d558e2 100644 --- a/test/analysis/depgraph.py +++ b/test/analysis/depgraph.py @@ -132,7 +132,7 @@ def bloc2graph(irgraph, label=False, lines=True): label_attr, label_name) block_html_lines = [] if lines and irblock is not None: - for assignblk in irblock.assignblks: + for assignblk in irblock: for dst, src in assignblk.iteritems(): if False: out_render = "%.8X " % (0, td_attr) diff --git a/test/core/sembuilder.py b/test/core/sembuilder.py index 56e41c90..70d6d5ec 100644 --- a/test/core/sembuilder.py +++ b/test/core/sembuilder.py @@ -59,7 +59,7 @@ for statement in res[0]: print "[+] Blocks:" for irb in res[1]: print irb.label - for exprs in irb.assignblks: - for expr in exprs: + for assignblk in irb: + for expr in assignblk: print expr print -- cgit 1.4.1 From c63ae8e10af699f2cd7bacd14a39112f28cf71ab Mon Sep 17 00:00:00 2001 From: Fabrice Desclaux Date: Fri, 9 Feb 2018 10:16:58 +0100 Subject: IRBlock: getitem/len on assignblks --- example/expression/access_c.py | 8 ++++---- example/ida/depgraph.py | 6 +++--- miasm2/analysis/data_analysis.py | 4 ++-- miasm2/analysis/data_flow.py | 10 +++++----- miasm2/analysis/depgraph.py | 8 ++++---- miasm2/ir/ir.py | 14 +++++++++++--- test/analysis/data_flow.py | 2 +- test/analysis/depgraph.py | 24 ++++++++++++------------ 8 files changed, 42 insertions(+), 34 deletions(-) (limited to 'example/expression') diff --git a/example/expression/access_c.py b/example/expression/access_c.py index 45f911ab..de158730 100644 --- a/example/expression/access_c.py +++ b/example/expression/access_c.py @@ -60,15 +60,15 @@ def find_call(ira): for irb in ira.blocks.values(): out = set() - if len(irb.assignblks) < 2: + if len(irb) < 2: continue - assignblk = irb.assignblks[-2] + assignblk = irb[-2] for src in assignblk.itervalues(): if not isinstance(src, ExprOp): continue if not src.op.startswith('call_func'): continue - out.add((irb, len(irb.assignblks) - 2)) + out.add((irb, len(irb) - 2)) if len(out) != 1: continue irb, index = out.pop() @@ -98,7 +98,7 @@ def get_funcs_arg0(ctx, ira, lbl_head): element = ira.arch.regs.RSI for irb, index in find_call(ira): - instr = irb.assignblks[index].instr + instr = irb[index].instr print 'Analysing references from:', hex(instr.offset), instr g_list = g_dep.get(irb.label, set([element]), index, set([lbl_head])) for dep in g_list: diff --git a/example/ida/depgraph.py b/example/ida/depgraph.py index a946706c..5342313a 100644 --- a/example/ida/depgraph.py +++ b/example/ida/depgraph.py @@ -110,13 +110,13 @@ Method to use: elif mode == 1: return value + 1 else: - return len(self.ira.blocks[self.label].assignblks) + return len(self.ira.blocks[self.label]) @property def elements(self): value = self.cbReg.value if value in self.stk_args: - line = self.ira.blocks[self.label].assignblks[self.line_nb].instr + line = self.ira.blocks[self.label][self.line_nb].instr arg_num = self.stk_args[value] stk_high = m2_expr.ExprInt(idc.GetSpd(line.offset), ir_arch.sp.size) stk_off = m2_expr.ExprInt(self.ira.sp.size/8 * arg_num, ir_arch.sp.size) @@ -174,7 +174,7 @@ def treat_element(): for node in graph.relevant_nodes: try: - offset = ir_arch.blocks[node.label].assignblks[node.line_nb].instr.offset + offset = ir_arch.blocks[node.label][node.line_nb].instr.offset except IndexError: print "Unable to highlight %s" % node continue diff --git a/miasm2/analysis/data_analysis.py b/miasm2/analysis/data_analysis.py index fd50c855..130d45a4 100644 --- a/miasm2/analysis/data_analysis.py +++ b/miasm2/analysis/data_analysis.py @@ -85,7 +85,7 @@ def intra_block_flow_symbexec(ir_arch, flow_graph, irb, in_nodes, out_nodes): continue read_values = v.get_r(cst_read=True) # print n_w, v, [str(x) for x in read_values] - node_n_w = get_node_name(irb.label, len(irb.assignblks), n_w) + node_n_w = get_node_name(irb.label, len(irb), n_w) for n_r in read_values: if n_r in current_nodes: @@ -171,7 +171,7 @@ def create_implicit_flow(ir_arch, flow_graph, irb_in_nodes, irb_out_ndes): # print "###", irb_son # print "###", 'IN', [str(x) for x in irb_son.in_nodes] - node_n_w = irb.label, len(irb.assignblks), n_r + node_n_w = irb.label, len(irb), n_r irb_out_nodes[irb.label][n_r] = node_n_w if not n_r in irb_in_nodes[irb.label]: irb_in_nodes[irb.label][n_r] = irb.label, 0, n_r diff --git a/miasm2/analysis/data_flow.py b/miasm2/analysis/data_flow.py index da79cf75..3a789cc3 100644 --- a/miasm2/analysis/data_flow.py +++ b/miasm2/analysis/data_flow.py @@ -59,7 +59,7 @@ class ReachingDefinitions(dict): predecessor_state = {} for pred_lbl in self.ir_a.graph.predecessors(block.label): pred = self.ir_a.blocks[pred_lbl] - for lval, definitions in self.get_definitions(pred_lbl, len(pred.assignblks)).iteritems(): + for lval, definitions in self.get_definitions(pred_lbl, len(pred)).iteritems(): predecessor_state.setdefault(lval, set()).update(definitions) modified = self.get((block.label, 0)) != predecessor_state @@ -67,7 +67,7 @@ class ReachingDefinitions(dict): return False self[(block.label, 0)] = predecessor_state - for index in xrange(len(block.assignblks)): + for index in xrange(len(block)): modified |= self.process_instruction(block, index) return modified @@ -79,7 +79,7 @@ class ReachingDefinitions(dict): (@block, @assignblk_index + 1). """ - instr = block.assignblks[assignblk_index] + instr = block[assignblk_index] defs = self.get_definitions(block.label, assignblk_index).copy() for lval in instr: defs.update({lval: set([(block.label, assignblk_index)])}) @@ -183,7 +183,7 @@ class DiGraphDefUse(DiGraph): attr={'align': 'center', 'colspan': 2, 'bgcolor': 'grey'}) - src = self._blocks[lbl].assignblks[index][reg] + src = self._blocks[lbl][index][reg] line = "%s = %s" % (reg, src) yield self.DotCellDescription(text=line, attr={}) yield self.DotCellDescription(text="", attr={}) @@ -215,7 +215,7 @@ def dead_simp_useful_instrs(defuse, reaching_defs): # Block has a nonexistant successor or is a leaf if keep_all_definitions or (len(successors) == 0): valid_definitions = reaching_defs.get_definitions(block_lbl, - len(block.assignblks)) + len(block)) for lval, definitions in valid_definitions.iteritems(): if (lval in ir_a.get_out_regs(block) or keep_all_definitions): diff --git a/miasm2/analysis/depgraph.py b/miasm2/analysis/depgraph.py index 50eea948..bd4bfa7e 100644 --- a/miasm2/analysis/depgraph.py +++ b/miasm2/analysis/depgraph.py @@ -265,9 +265,9 @@ class DependencyResult(DependencyState): break assignmnts = {} for element in elements: - if element in irb.assignblks[line_nb]: + if element in irb[line_nb]: # constants, label, ... are not in destination - assignmnts[element] = irb.assignblks[line_nb][element] + assignmnts[element] = irb[line_nb][element] assignblks.append(AssignBlock(assignmnts)) return IRBlock(irb.label, assignblks) @@ -581,9 +581,9 @@ class DependencyGraph(object): @state: instance of DependencyState""" irb = self._ira.blocks[state.label] - line_nb = len(irb.assignblks) if state.line_nb is None else state.line_nb + line_nb = len(irb) if state.line_nb is None else state.line_nb - for cur_line_nb, assignblk in reversed(list(enumerate(irb.assignblks[:line_nb]))): + for cur_line_nb, assignblk in reversed(list(enumerate(irb[:line_nb]))): self._track_exprs(state, assignblk, cur_line_nb) def get(self, label, elements, line_nb, heads): diff --git a/miasm2/ir/ir.py b/miasm2/ir/ir.py index 8b1a1033..f31db76b 100644 --- a/miasm2/ir/ir.py +++ b/miasm2/ir/ir.py @@ -288,6 +288,14 @@ class IRBlock(object): """Iterate on assignblks""" return self._assignblks.__iter__() + def __getitem__(self, index): + """Getitem on assignblks""" + return self._assignblks.__getitem__(index) + + def __len__(self): + """Length of assignblks""" + return self._assignblks.__len__() + def is_dst_set(self): return self._dst is not None @@ -636,7 +644,7 @@ class IntermediateRepresentation(object): else: dst = m2_expr.ExprId(next_lbl, self.pc.size) - assignblk = AssignBlock({self.IRDst: dst}, irblock.assignblks[-1].instr) + assignblk = AssignBlock({self.IRDst: dst}, irblock[-1].instr) ir_blocks[index] = IRBlock(irblock.label, list(irblock.assignblks) + [assignblk]) def post_add_block(self, block, ir_blocks): @@ -790,9 +798,9 @@ class IntermediateRepresentation(object): # Find candidates jmp_blocks = set() for block in self.blocks.itervalues(): - if len(block.assignblks) != 1: + if len(block) != 1: continue - assignblk = block.assignblks[0] + assignblk = block[0] if len(assignblk) > 1: continue assert set(assignblk.keys()) == set([self.IRDst]) diff --git a/test/analysis/data_flow.py b/test/analysis/data_flow.py index 207e13ff..f2e30172 100644 --- a/test/analysis/data_flow.py +++ b/test/analysis/data_flow.py @@ -635,7 +635,7 @@ G17_EXP_IRB0 = gen_irblock(LBL0, [[], ExprAff(b, a), ExprAff(c, b)], - G17_IRB0.assignblks[14] + G17_IRB0[14] # Trick because a+b+c != ((a+b)+c) ]) diff --git a/test/analysis/depgraph.py b/test/analysis/depgraph.py index 20d558e2..290547fe 100644 --- a/test/analysis/depgraph.py +++ b/test/analysis/depgraph.py @@ -510,72 +510,72 @@ G17_IRA.blocks = dict([(irb.label, irb) for irb in [G17_IRB0, G17_IRB1, # Test graph 1 G1_TEST1_DN1 = DependencyNode( - G1_IRB2.label, A, len(G1_IRB2.assignblks)) + G1_IRB2.label, A, len(G1_IRB2)) G1_INPUT = (set([G1_TEST1_DN1]), set([G1_IRB0.label])) # Test graph 2 G2_TEST1_DN1 = DependencyNode( - G2_IRB2.label, A, len(G2_IRB2.assignblks)) + G2_IRB2.label, A, len(G2_IRB2)) G2_INPUT = (set([G2_TEST1_DN1]), set([G2_IRB0.label])) # Test graph 3 G3_TEST1_0_DN1 = DependencyNode( - G3_IRB3.label, A, len(G3_IRB3.assignblks)) + G3_IRB3.label, A, len(G3_IRB3)) G3_INPUT = (set([G3_TEST1_0_DN1]), set([G3_IRB0.label])) # Test graph 4 G4_TEST1_DN1 = DependencyNode( - G4_IRB2.label, A, len(G2_IRB0.assignblks)) + G4_IRB2.label, A, len(G2_IRB0)) G4_INPUT = (set([G4_TEST1_DN1]), set([G4_IRB0.label])) # Test graph 5 G5_TEST1_0_DN1 = DependencyNode( - G5_IRB2.label, A, len(G5_IRB2.assignblks)) + G5_IRB2.label, A, len(G5_IRB2)) G5_INPUT = (set([G5_TEST1_0_DN1]), set([G5_IRB0.label])) # Test graph 6 G6_TEST1_0_DN1 = DependencyNode( - G6_IRB1.label, A, len(G6_IRB1.assignblks)) + G6_IRB1.label, A, len(G6_IRB1)) G6_INPUT = (set([G6_TEST1_0_DN1]), set([G6_IRB0.label])) # Test graph 7 G7_TEST1_0_DN1 = DependencyNode( - G7_IRB2.label, D, len(G7_IRB2.assignblks)) + G7_IRB2.label, D, len(G7_IRB2)) G7_INPUT = (set([G7_TEST1_0_DN1]), set([G7_IRB0.label])) # Test graph 8 G8_TEST1_0_DN1 = DependencyNode( - G8_IRB2.label, A, len(G8_IRB2.assignblks)) + G8_IRB2.label, A, len(G8_IRB2)) G8_INPUT = (set([G8_TEST1_0_DN1]), set([G3_IRB0.label])) # Test 9: Multi elements G9_TEST1_0_DN1 = DependencyNode( - G8_IRB2.label, A, len(G8_IRB2.assignblks)) + G8_IRB2.label, A, len(G8_IRB2)) G9_TEST1_0_DN5 = DependencyNode( - G8_IRB2.label, C, len(G8_IRB2.assignblks)) + G8_IRB2.label, C, len(G8_IRB2)) G9_INPUT = (set([G9_TEST1_0_DN1, G9_TEST1_0_DN5]), set([G8_IRB0.label])) # Test 10: loop at beginning G10_TEST1_0_DN1 = DependencyNode( - G10_IRB2.label, A, len(G10_IRB2.assignblks)) + G10_IRB2.label, A, len(G10_IRB2)) G10_INPUT = (set([G10_TEST1_0_DN1]), set([G10_IRB1.label])) @@ -583,7 +583,7 @@ G10_INPUT = (set([G10_TEST1_0_DN1]), set([G10_IRB1.label])) # Test 11: no dual bloc emulation G11_TEST1_DN1 = DependencyNode( - G11_IRB2.label, A, len(G11_IRB2.assignblks)) + G11_IRB2.label, A, len(G11_IRB2)) G11_INPUT = (set([G11_TEST1_DN1]), set([G11_IRB0.label])) -- cgit 1.4.1