Example #1
0
File: ida.py Project: w00kong/sdk
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
Example #2
0
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
Example #4
0
    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)
Example #5
0
    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)
Example #6
0
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