Ejemplo n.º 1
0
def init():
    VOID_TINFO = idaapi.tinfo_t(
        idaapi.BTF_VOID)  # make no sense lol `BT_VOID | 0`
    PVOID_TINFO.create_ptr(VOID_TINFO)

    CHAR_TINFO = idaapi.tinfo_t(idaapi.BTF_CHAR)
    PCHAR_TINFO.create_ptr(idaapi.tinfo_t(CHAR_TINFO))

    BYTE_TINFO = idaapi.tinfo_t(idaapi.BTF_BYTE)
    PBYTE_TINFO.create_ptr(BYTE_TINFO)

    WORD_TINFO = idaapi.get_unk_type(2)
    PWORD_TINFO.create_ptr(WORD_TINFO)

    DWORD_TINFO = idaapi.get_unk_type(4)
    PDWORD_TINFO.create_ptr(DWORD_TINFO)

    QWORD_TINFO = idaapi.get_unk_type(8)
    PQWORD_TINFO.create_ptr(QWORD_TINFO)

    XWORD_TINFO = idaapi.get_unk_type(util.get_bitness() >> 3)
    PXWORD_TINFO.create_ptr(XWORD_TINFO)

    func_data = idaapi.func_type_data_t()
    func_data.rettype = PVOID_TINFO
    func_data.cc = idaapi.CM_CC_UNKNOWN
    DUMMY_FUNC.create_func(func_data, idaapi.BT_FUNC)

    assert PVOID_TINFO.get_pointed_object() == VOID_TINFO
    assert PCHAR_TINFO.get_pointed_object() == CHAR_TINFO
    assert PBYTE_TINFO.get_pointed_object() == BYTE_TINFO
    assert PWORD_TINFO.get_pointed_object() == WORD_TINFO
    assert PDWORD_TINFO.get_pointed_object() == DWORD_TINFO
    assert PQWORD_TINFO.get_pointed_object() == QWORD_TINFO
    assert PXWORD_TINFO.get_pointed_object() == XWORD_TINFO
Ejemplo n.º 2
0
def get_fields_at_offset(tinfo, offset):
    """
    Given tinfo and offset of the structure or union, returns list of all tinfo at that offset.
    This function helps to find appropriate structures by type of the offset
    """
    result = []
    if offset == 0:
        result.append(tinfo)
    udt_data = idaapi.udt_type_data_t()
    tinfo.get_udt_details(udt_data)
    udt_member = idaapi.udt_member_t()
    udt_member.offset = offset * 8
    idx = tinfo.find_udt_member(idaapi.STRMEM_OFFSET, udt_member)
    if idx != -1:
        while idx < tinfo.get_udt_nmembers(
        ) and udt_data[idx].offset <= offset * 8:
            udt_member = udt_data[idx]
            if udt_member.offset == offset * 8:
                if udt_member.type.is_ptr():
                    result.append(idaapi.get_unk_type(Const.EA_SIZE))
                    result.append(udt_member.type)
                    result.append(idaapi.dummy_ptrtype(Const.EA_SIZE, False))
                elif not udt_member.type.is_udt():
                    result.append(udt_member.type)
            if udt_member.type.is_array():
                if (offset - udt_member.offset / 8
                    ) % udt_member.type.get_array_element().get_size() == 0:
                    result.append(udt_member.type.get_array_element())
            elif udt_member.type.is_udt():
                result.extend(
                    get_fields_at_offset(udt_member.type,
                                         offset - udt_member.offset / 8))
            idx += 1
    return result
Ejemplo n.º 3
0
def init():
    """ All tinfo should be reinitialized between session. Otherwise they could have wrong type """
    global VOID_TINFO, PVOID_TINFO, CONST_PVOID_TINFO, BYTE_TINFO, PBYTE_TINFO, LEGAL_TYPES, X_WORD_TINFO, \
        PX_WORD_TINFO, DUMMY_FUNC, CONST_PCHAR_TINFO, CHAR_TINFO, PCHAR_TINFO, CONST_VOID_TINFO, \
        WORD_TINFO, PWORD_TINFO, EA64, EA_SIZE

    EA64 = idaapi.get_inf_structure().is_64bit()
    EA_SIZE = 8 if EA64 else 4

    VOID_TINFO = idaapi.tinfo_t(idaapi.BT_VOID)
    PVOID_TINFO.create_ptr(VOID_TINFO)
    CONST_VOID_TINFO = idaapi.tinfo_t(idaapi.BT_VOID | idaapi.BTM_CONST)
    CONST_PVOID_TINFO.create_ptr(
        idaapi.tinfo_t(idaapi.BT_VOID | idaapi.BTM_CONST))
    CONST_PCHAR_TINFO.create_ptr(
        idaapi.tinfo_t(idaapi.BTF_CHAR | idaapi.BTM_CONST))
    CHAR_TINFO = idaapi.tinfo_t(idaapi.BTF_CHAR)
    PCHAR_TINFO.create_ptr(idaapi.tinfo_t(idaapi.BTF_CHAR))
    BYTE_TINFO = idaapi.tinfo_t(idaapi.BTF_BYTE)
    PBYTE_TINFO = idaapi.dummy_ptrtype(1, False)
    X_WORD_TINFO = idaapi.get_unk_type(EA_SIZE)
    PX_WORD_TINFO = idaapi.dummy_ptrtype(EA_SIZE, False)

    WORD_TINFO = idaapi.tinfo_t(idaapi.BT_UNK_WORD)
    PWORD_TINFO.create_ptr(idaapi.tinfo_t(idaapi.BT_UNK_WORD))

    func_data = idaapi.func_type_data_t()
    func_data.rettype = PVOID_TINFO
    func_data.cc = idaapi.CM_CC_UNKNOWN
    DUMMY_FUNC = idaapi.tinfo_t()
    DUMMY_FUNC.create_func(func_data, idaapi.BT_FUNC)

    LEGAL_TYPES = [
        PVOID_TINFO, PX_WORD_TINFO, PWORD_TINFO, PBYTE_TINFO, X_WORD_TINFO
    ]
Ejemplo n.º 4
0
def init():
    global VOID_TINFO, PVOID_TINFO, CONST_PVOID_TINFO, BYTE_TINFO, PBYTE_TINFO, LEGAL_TYPES, X_WORD_TINFO, PX_WORD_TINFO

    VOID_TINFO = idaapi.tinfo_t(idaapi.BT_VOID)
    PVOID_TINFO.create_ptr(VOID_TINFO)
    CONST_PVOID_TINFO.create_ptr(
        idaapi.tinfo_t(idaapi.BT_VOID | idaapi.BTM_CONST))
    BYTE_TINFO = idaapi.tinfo_t(idaapi.BTF_BYTE)
    PBYTE_TINFO = idaapi.dummy_ptrtype(1, False)
    X_WORD_TINFO = idaapi.get_unk_type(EA_SIZE)
    PX_WORD_TINFO = idaapi.dummy_ptrtype(EA_SIZE, False)

    LEGAL_TYPES = [PVOID_TINFO, PX_WORD_TINFO, X_WORD_TINFO, PBYTE_TINFO]
Ejemplo n.º 5
0
def make_call_helper_expr(name, *args, retval=None):
	if retval is None:
		retval = idaapi.get_unk_type(8)

	arglist = idaapi.carglist_t()
	for arg in args:
		if arg is None:
			print("[!] Warning: argument is None, skipping")
			continue

		if isinstance(arg, idaapi.carg_t):
			arglist.push_back(arg)
		else:
			narg = idaapi.carg_t()
			narg.assign(arg)
			arglist.push_back(narg)

	return idaapi.call_helper(retval, arglist, name)
Ejemplo n.º 6
0
def init():
    global VOID_TINFO, PVOID_TINFO, CONST_PVOID_TINFO, BYTE_TINFO, PBYTE_TINFO, LEGAL_TYPES, X_WORD_TINFO, \
        PX_WORD_TINFO, DUMMY_FUNC

    VOID_TINFO = idaapi.tinfo_t(idaapi.BT_VOID)
    PVOID_TINFO.create_ptr(VOID_TINFO)
    CONST_PVOID_TINFO.create_ptr(idaapi.tinfo_t(idaapi.BT_VOID | idaapi.BTM_CONST))
    BYTE_TINFO = idaapi.tinfo_t(idaapi.BTF_BYTE)
    PBYTE_TINFO = idaapi.dummy_ptrtype(1, False)
    X_WORD_TINFO = idaapi.get_unk_type(EA_SIZE)
    PX_WORD_TINFO = idaapi.dummy_ptrtype(EA_SIZE, False)

    func_data = idaapi.func_type_data_t()
    func_data.rettype = PVOID_TINFO
    func_data.cc = idaapi.CM_CC_UNKNOWN
    DUMMY_FUNC = idaapi.tinfo_t()
    DUMMY_FUNC.create_func(func_data, idaapi.BT_FUNC)

    LEGAL_TYPES = [PVOID_TINFO, PX_WORD_TINFO, X_WORD_TINFO, PBYTE_TINFO]