diff options
| author | Fabrice Desclaux <fabrice.desclaux@cea.fr> | 2019-02-25 11:09:54 +0100 |
|---|---|---|
| committer | Fabrice Desclaux <fabrice.desclaux@cea.fr> | 2019-03-05 16:52:49 +0100 |
| commit | 02bbb30efea4980c9d133947cbbf69fb599071ad (patch) | |
| tree | 3fea6826fcc5354840a27cb1dc99ff31eef81896 /example/ida | |
| parent | eab809932871f91d6f4aa770fc321af9e156e0f5 (diff) | |
| download | miasm-02bbb30efea4980c9d133947cbbf69fb599071ad.tar.gz miasm-02bbb30efea4980c9d133947cbbf69fb599071ad.zip | |
Support python2/python3
Diffstat (limited to 'example/ida')
| -rw-r--r-- | example/ida/ctype_propagation.py | 20 | ||||
| -rw-r--r-- | example/ida/depgraph.py | 41 | ||||
| -rw-r--r-- | example/ida/graph_ir.py | 39 | ||||
| -rw-r--r-- | example/ida/rpyc_ida.py | 3 | ||||
| -rw-r--r-- | example/ida/symbol_exec.py | 23 | ||||
| -rw-r--r-- | example/ida/utils.py | 6 |
6 files changed, 79 insertions, 53 deletions
diff --git a/example/ida/ctype_propagation.py b/example/ida/ctype_propagation.py index 61bc747f..a043b9c9 100644 --- a/example/ida/ctype_propagation.py +++ b/example/ida/ctype_propagation.py @@ -1,7 +1,10 @@ +from __future__ import print_function import ida_kernwin import idc import ida_funcs +from future.utils import viewitems + from miasm2.core.bin_stream_ida import bin_stream_ida from miasm2.expression import expression as m2_expr from miasm2.expression.simplifications import expr_simp @@ -198,11 +201,12 @@ class SymbExecCTypeFix(SymbExecCType): for c_str, c_type in self.chandler.expr_to_c_and_types(expr, self.symbols): expr = self.cst_propag_link.get((irb.loc_key, index), {}).get(expr, expr) offset2cmt.setdefault(instr.offset, set()).add( - "\n%s: %s\n%s" % (expr, c_str, c_type)) + "\n%s: %s\n%s" % (expr, c_str, c_type) + ) self.eval_updt_assignblk(assignblk) - for offset, value in offset2cmt.iteritems(): + for offset, value in viewitems(offset2cmt): idc.MakeComm(offset, '\n'.join(value)) - print "%x\n" % offset, '\n'.join(value) + print("%x\n" % offset, '\n'.join(value)) return self.eval_expr(self.ir_arch.IRDst) @@ -222,11 +226,11 @@ def get_ira_call_fixer(ira): class iraCallStackFixer(ira): def call_effects(self, ad, instr): - print hex(instr.offset), instr + print(hex(instr.offset), instr) stk_before = idc.GetSpd(instr.offset) stk_after = idc.GetSpd(instr.offset + instr.l) stk_diff = stk_after - stk_before - print hex(stk_diff) + print(hex(stk_diff)) call_assignblk = AssignBlock( [ ExprAssign(self.ret_reg, ExprOp('call_func_ret', ad)), @@ -299,8 +303,8 @@ def analyse_function(): ) ctype = mychandler.types_mngr.types_ast.ast_parse_declaration(ast.ext[0]) objc = types_mngr.get_objc(ctype) - print '=' * 20 - print expr, objc + print('=' * 20) + print(expr, objc) infos_types[expr] = set([objc]) # Add fake head @@ -344,7 +348,7 @@ def analyse_function(): symbexec_engine.get_state() ) - for lbl, state in states.iteritems(): + for lbl, state in viewitems(states): if lbl not in ircfg.blocks: continue symbexec_engine = CTypeEngineFixer(ir_arch, types_mngr, state, cst_propag_link) diff --git a/example/ida/depgraph.py b/example/ida/depgraph.py index 2c79c05d..3de19cbc 100644 --- a/example/ida/depgraph.py +++ b/example/ida/depgraph.py @@ -1,11 +1,17 @@ +from __future__ import print_function +from builtins import map +from builtins import range import os import tempfile +from future.utils import viewitems, viewvalues + import idautils import idc import ida_funcs import ida_kernwin + from miasm2.core.bin_stream_ida import bin_stream_ida from miasm2.core.asmblock import * from miasm2.expression import expression as m2_expr @@ -23,12 +29,13 @@ class depGraphSettingsForm(ida_kernwin.Form): self.ira = ira self.ircfg = ircfg - self.stk_args = {'ARG%d' % i:i for i in xrange(10)} + self.stk_args = {'ARG%d' % i:i for i in range(10)} self.stk_unalias_force = False self.address = idc.ScreenEA() cur_block = None - for block in ircfg.getby_offset(self.address): + for loc_key in ircfg.getby_offset(self.address): + block = ircfg.get_block(loc_key) offset = self.ircfg.loc_db.get_location_offset(block.loc_key) if offset is not None: # Only one block non-generated @@ -41,11 +48,11 @@ class depGraphSettingsForm(ida_kernwin.Form): break assert line_nb is not None cur_loc_key = str(cur_block.loc_key) - loc_keys = sorted(map(str, ircfg.blocks.keys())) - regs = sorted(ira.arch.regs.all_regs_ids_byname.keys()) - regs += self.stk_args.keys() + loc_keys = sorted(map(str, ircfg.blocks)) + regs = sorted(ira.arch.regs.all_regs_ids_byname) + regs += list(self.stk_args) reg_default = regs[0] - for i in xrange(10): + for i in range(10): opnd = idc.GetOpnd(self.address, i).upper() if opnd in regs: reg_default = opnd @@ -121,7 +128,7 @@ Method to use: line = self.ircfg.blocks[self.loc_key][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) + stk_off = m2_expr.ExprInt(self.ira.sp.size // 8 * arg_num, ir_arch.sp.size) element = m2_expr.ExprMem(mn.regs.regs_init[ir_arch.sp] + stk_high + stk_off, self.ira.sp.size) element = expr_simp(element) # Force stack unaliasing @@ -162,33 +169,33 @@ def treat_element(): global graphs, comments, sol_nb, settings, addr, ir_arch, ircfg try: - graph = graphs.next() + graph = next(graphs) except StopIteration: comments = {} - print "Done: %d solutions" % (sol_nb) + print("Done: %d solutions" % (sol_nb)) return sol_nb += 1 - print "Get graph number %02d" % sol_nb + print("Get graph number %02d" % sol_nb) filename = os.path.join(tempfile.gettempdir(), "solution_0x%08x_%02d.dot" % (addr, sol_nb)) - print "Dump the graph to %s" % filename + print("Dump the graph to %s" % filename) open(filename, "w").write(graph.graph.dot()) for node in graph.relevant_nodes: try: offset = ircfg.blocks[node.loc_key][node.line_nb].instr.offset except IndexError: - print "Unable to highlight %s" % node + print("Unable to highlight %s" % node) continue comments[offset] = comments.get(offset, []) + [node.element] idc.SetColor(offset, idc.CIC_ITEM, settings.color) if graph.has_loop: - print 'Graph has dependency loop: symbolic execution is inexact' + print('Graph has dependency loop: symbolic execution is inexact') else: - print "Possible value: %s" % graph.emul(ir_arch).values()[0] + print("Possible value: %s" % next(iter(viewvalues(graph.emul(ir_arch))))) - for offset, elements in comments.iteritems(): + for offset, elements in viewitems(comments): idc.MakeComm(offset, ", ".join(map(str, elements))) def next_element(): @@ -228,7 +235,7 @@ def launch_depgraph(): loc_key, elements, line_nb = settings.loc_key, settings.elements, settings.line_nb # Simplify assignments - for irb in ircfg.blocks.values(): + for irb in list(viewvalues(ircfg.blocks)): irs = [] offset = ir_arch.loc_db.get_location_offset(irb.loc_key) fix_stack = offset is not None and settings.unalias_stack @@ -238,7 +245,7 @@ def launch_depgraph(): fix_dct = {ir_arch.sp: mn.regs.regs_init[ir_arch.sp] + stk_high} new_assignblk = {} - for dst, src in assignblk.iteritems(): + for dst, src in viewitems(assignblk): if fix_stack: src = src.replace_expr(fix_dct) if dst != ir_arch.sp: diff --git a/example/ida/graph_ir.py b/example/ida/graph_ir.py index 8026174d..de46c22d 100644 --- a/example/ida/graph_ir.py +++ b/example/ida/graph_ir.py @@ -1,11 +1,16 @@ +from __future__ import print_function import os import tempfile +from builtins import int as int_types + +from future.utils import viewitems, viewvalues import idaapi import ida_kernwin import idc import ida_funcs import idautils + from miasm2.core.asmblock import is_int from miasm2.core.bin_stream_ida import bin_stream_ida from miasm2.expression.simplifications import expr_simp @@ -89,9 +94,9 @@ def label_init(self, name="", offset=None): def label_str(self): - if isinstance(self.offset, (int, long)): + if isinstance(self.offset, int_types): return "%s:0x%x" % (self.name, self.offset) - return "%s:%s" % (self.name, str(self.offset)) + return "%s:%s" % (self.name, self.offset) def color_irblock(irblock, ir_arch): @@ -99,7 +104,7 @@ def color_irblock(irblock, ir_arch): lbl = idaapi.COLSTR("%s:" % ir_arch.loc_db.pretty_str(irblock.loc_key), idaapi.SCOLOR_INSN) out.append(lbl) for assignblk in irblock: - for dst, src in sorted(assignblk.iteritems()): + for dst, src in sorted(viewitems(assignblk)): dst_f = expr2colorstr(dst, loc_db=ir_arch.loc_db) src_f = expr2colorstr(src, loc_db=ir_arch.loc_db) line = idaapi.COLSTR("%s = %s" % (dst_f, src_f), idaapi.SCOLOR_INSN) @@ -120,11 +125,11 @@ class GraphMiasmIR(idaapi.GraphViewer): def OnRefresh(self): self.Clear() addr_id = {} - for irblock in self.ircfg.blocks.values(): + for irblock in viewvalues(self.ircfg.blocks): id_irblock = self.AddNode(color_irblock(irblock, self.ircfg)) addr_id[irblock] = id_irblock - for irblock in self.ircfg.blocks.values(): + for irblock in viewvalues(self.ircfg.blocks): if not irblock: continue all_dst = self.ircfg.dst_trackback(irblock) @@ -164,7 +169,7 @@ def is_addr_ro_variable(bs, addr, size): """ try: - _ = bs.getbytes(addr, size/8) + _ = bs.getbytes(addr, size // 8) except IOError: return False return True @@ -183,18 +188,18 @@ def build_graph(start_addr, type_graph, simplify=False, dontmodstack=True, loadi for assignblk in assignblks: dct = dict(assignblk) dct = { - dst:src for (dst, src) in dct.iteritems() if dst != self.sp + dst:src for (dst, src) in viewitems(dct) if dst != self.sp } out.append(AssignBlock(dct, assignblk.instr)) return out, extra if verbose: - print "Arch", dis_engine + print("Arch", dis_engine) fname = idc.GetInputFile() if verbose: - print fname + print(fname) bs = bin_stream_ida() mdis = dis_engine(bs) @@ -212,28 +217,28 @@ def build_graph(start_addr, type_graph, simplify=False, dontmodstack=True, loadi mdis.loc_db.add_location(name, addr) if verbose: - print "start disasm" + print("start disasm") if verbose: - print hex(start_addr) + print(hex(start_addr)) asmcfg = mdis.dis_multiblock(start_addr) entry_points = set([mdis.loc_db.get_offset_location(start_addr)]) if verbose: - print "generating graph" + print("generating graph") open('asm_flow.dot', 'w').write(asmcfg.dot()) - print "generating IR... %x" % start_addr + print("generating IR... %x" % start_addr) ircfg = ir_arch.new_ircfg_from_asmcfg(asmcfg) if verbose: - print "IR ok... %x" % start_addr + print("IR ok... %x" % start_addr) - for irb in ircfg.blocks.itervalues(): + for irb in list(viewvalues(ircfg.blocks)): irs = [] for assignblk in irb: new_assignblk = { expr_simp(dst): expr_simp(src) - for dst, src in assignblk.iteritems() + for dst, src in viewitems(assignblk) } irs.append(AssignBlock(new_assignblk, instr=assignblk.instr)) ircfg.blocks[irb.loc_key] = IRBlock(irb.loc_key, irs) @@ -268,7 +273,7 @@ def build_graph(start_addr, type_graph, simplify=False, dontmodstack=True, loadi continue if reg in regs_todo: out[reg] = dst - return set(out.values()) + return set(viewvalues(out)) diff --git a/example/ida/rpyc_ida.py b/example/ida/rpyc_ida.py index 21faf43a..6c18fb7a 100644 --- a/example/ida/rpyc_ida.py +++ b/example/ida/rpyc_ida.py @@ -1,4 +1,5 @@ """rpyc IDA server""" +from __future__ import print_function from rpyc.utils.server import OneShotServer from rpyc.core import SlaveService @@ -11,7 +12,7 @@ def serve_threaded(hostname="localhost", port=4455): WARNING: IDA will be locked until the client script terminates. """ - print 'Running server' + print('Running server') server = OneShotServer(SlaveService, hostname=hostname, port=port, reuse_addr=True, ipv6=False, authenticator=None, diff --git a/example/ida/symbol_exec.py b/example/ida/symbol_exec.py index e004b1b6..aa1d57fe 100644 --- a/example/ida/symbol_exec.py +++ b/example/ida/symbol_exec.py @@ -1,7 +1,12 @@ +from __future__ import print_function import operator +from future.utils import viewitems + import idaapi import idc + + from miasm2.expression.expression_helper import Variables_Identifier from miasm2.expression.expression import ExprAssign @@ -49,10 +54,12 @@ class symbolicexec_t(idaapi.simplecustviewer_t): element = self.line2eq[linenum] expanded = Variables_Identifier(element[1], var_prefix="%s_v" % element[0]) - self.line2eq = self.line2eq[0:linenum] + \ - expanded.vars.items() + \ - [(element[0], expanded.equation)] + \ + self.line2eq = ( + self.line2eq[0:linenum] + + list(viewitems(expanded.vars)) + + [(element[0], expanded.equation)] + self.line2eq[linenum + 1:] + ) def print_lines(self): self.ClearLines() @@ -75,7 +82,7 @@ class symbolicexec_t(idaapi.simplecustviewer_t): self.machine = machine self.loc_db = loc_db - self.line2eq = sorted(equations.items(), key=operator.itemgetter(0)) + self.line2eq = sorted(viewitems(equations), key=operator.itemgetter(0)) self.lines_expanded = set() self.print_lines() @@ -144,7 +151,7 @@ def symbolic_exec(): ira = machine.ira(loc_db=mdis.loc_db) ircfg = ira.new_ircfg_from_asmcfg(asmcfg) - print "Run symbolic execution..." + print("Run symbolic execution...") sb = SymbolicExecutionEngine(ira, machine.mn.regs.regs_init) sb.run_at(ircfg, start) modified = {} @@ -192,7 +199,7 @@ if __name__ == '__main__': idaapi.CompileLine('static key_F3() { RunPythonStatement("symbolic_exec()"); }') idc.AddHotkey("F3", "key_F3") - print "=" * 50 - print """Available commands: + print("=" * 50) + print("""Available commands: symbolic_exec() - F3: Symbolic execution of current selection - """ + """) diff --git a/example/ida/utils.py b/example/ida/utils.py index a64973f1..b6d5dac4 100644 --- a/example/ida/utils.py +++ b/example/ida/utils.py @@ -1,3 +1,5 @@ +from __future__ import print_function +from builtins import map import idaapi from idc import * @@ -67,7 +69,7 @@ def guess_machine(addr=None): elif processor_name == "PPC": machine = Machine("ppc32b") else: - print repr(processor_name) + print(repr(processor_name)) raise NotImplementedError('not fully functional') return machine @@ -204,7 +206,7 @@ Python Expression dest_lang = self.languages[self.GetControlValue(self.cbLanguage)] try: text = Translator.to_language(dest_lang).from_expr(self.expr) - except Exception, error: + except Exception as error: self.ShowField(self.result, False) return -1 |