def parse_func(pfn): try: hf = idaapi.hexrays_failure_t() cfunc = idaapi.decompile(pfn.start_ea, hf) mbr = idaapi.mba_ranges_t(pfn) mba = idaapi.gen_microcode( mbr, hf, None, idaapi.DECOMP_NO_WAIT | idaapi.DECOMP_NO_CACHE, idaapi.MMAT_GLBOPT3 ) except Exception: return if mba is None: return G = Graph() ctree_state, ctree_expr, ctree_int, ctree_str, micro_int = [], [], [], [], [] # node level for i in range(mba.qty): mb = mba.get_mblock(i) minsn = mb.head blk = [] while minsn: ins = parse_minsn(minsn, micro_int) blk.append(ins) minsn = minsn.next vp = idaapi.qstring_printer_t(None, True) mb._print(vp) G.add_node(mb.serial, feat=blk, raw_data=vp.s) for succ in mb.succset: G.add_edge(mb.serial, succ) G.remove_featempty_nodes() if not G.have_nodes(): return # add a fake edge if there is no edge if not G.have_edges(): G.add_edge(G.graph['nodes'][0]['id'], G.graph['nodes'][0]['id']) # graph level ctree_fea = CtreeFeature(ctree_state, ctree_expr, ctree_int, ctree_str) ctree_fea.apply_to(cfunc.body, None) G.graph['graph']['c_state'], G.graph['graph']['c_expr'], G.graph['graph']['c_int'], G.graph['graph'][ 'c_str'], G.graph['graph']['m_int'] = ctree_state, ctree_expr, ctree_int, ctree_str, micro_int G.graph['graph']['arg_num'] = len(cfunc.argidx) func_bytes = b'' for start, end in idautils.Chunks(pfn.start_ea): fb = idaapi.get_bytes(start, end-start) func_bytes += fb G.graph['graph']['hash'] = hashlib.md5(func_bytes).hexdigest() return G.graph
def func_name_to_fcl(func_name): fcl = func_call_line(func_name) for ref_ea in CodeRefsTo(getFunctionWithName(func_name),0): if eamap.has_key(ref_ea): insnvec = eamap[ref_ea] lines = [] for stmt in insnvec: qp = idaapi.qstring_printer_t(c.__deref__(), False) stmt._print(0, qp) ss = qp.s.split('\n') for line in ss: if func_name in line and 'android_log_print' not in line: lines.append(line) fcl.add(ref_ea, '\n'.join(lines)) else: #print 'reference %X in another function!' %ref_ea pass return fcl
def func_name_to_fcl(func_name): fcl = func_call_line(func_name) for ref_ea in CodeRefsTo(getFunctionWithName(func_name), 0): if eamap.has_key(ref_ea): insnvec = eamap[ref_ea] lines = [] for stmt in insnvec: qp = idaapi.qstring_printer_t(c.__deref__(), False) stmt._print(0, qp) ss = qp.s.split('\n') for line in ss: if func_name in line and 'android_log_print' not in line: lines.append(line) fcl.add(ref_ea, '\n'.join(lines)) else: #print 'reference %X in another function!' %ref_ea pass return fcl
def get_decompiled_line(self, cfunc, ea): print repr(ea) if ea not in cfunc.eamap: print 'strange, %x is not in %x eamap' % (ea, cfunc.entry_ea) return insnvec = cfunc.eamap[ea] lines = [] for stmt in insnvec: qp = idaapi.qstring_printer_t(cfunc.__deref__(), False) stmt._print(0, qp) s = qp.s.split('\n')[0] #~ s = idaapi.tag_remove(s) lines.append(s) return '\n'.join(lines)
def get_decompiled_line(self, cfunc, ea): print repr(ea) if ea not in cfunc.eamap: print 'strange, %x is not in %x eamap' % (ea, cfunc.entry_ea) return insnvec = cfunc.eamap[ea] lines = [] for stmt in insnvec: qp = idaapi.qstring_printer_t(cfunc.__deref__(), False) stmt._print(0, qp) s = qp.s.split('\n')[0] #~ s = idaapi.tag_remove(s) lines.append(s) return '\n'.join(lines)
def var_name_to_reg(var_name): print var_name for var in lvars: if var.name == var_name: print dir(var) print var.cmt print var.is_reg_var() print var.is_stk_var() defea = var.defea print format(defea, '04x') if eamap.has_key(defea): insnvec = eamap[defea] lines = [] for stmt in insnvec: qp = idaapi.qstring_printer_t(c.__deref__(), False) stmt._print(0, qp) ss = qp.s.split('\n') for line in ss: if var_name in line: lines.append(line) else: pass
def var_name_to_reg(var_name): print var_name for var in lvars: if var.name == var_name: print dir(var) print var.cmt print var.is_reg_var() print var.is_stk_var() defea = var.defea print format(defea, '04x') if eamap.has_key(defea): insnvec = eamap[defea] lines = [] for stmt in insnvec: qp = idaapi.qstring_printer_t(c.__deref__(), False) stmt._print(0, qp) ss = qp.s.split('\n') for line in ss: if var_name in line: lines.append(line) else: pass