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
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
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 ]
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]
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)
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]