def load_til(path_to_til): if not ida_typeinf.load_til(path_to_til, os.path.dirname(path_to_til)): raise Exception("load_til('%s') has failed" % (path_to_til)) # Fix UINTN to be the actual word size if we can determine it idc.Til2Idb(-1, "UINTN") entry = idc.GetEntryPoint(idc.GetEntryOrdinal(0)) if entry != idc.BADADDR: typedef = "typedef UINT" + str(16 << idc.GetSegmentAttr(entry, idc.SEGATTR_BITNESS)) + " UINTN;" for i in range(0, idc.GetMaxLocalType()): if idc.GetLocalTypeName(i) == "UINTN": idc.SetLocalType(idc.SetLocalType(i, "", 0), typedef, 0)
def registersysctlstructs(): ''' registersysctlstructs: Registers the 'sysctl_req' and 'sysctl_oid' struct types in IDA. ''' strsysctl_req = """ struct sysctl_req { struct proc *p; int lock; void* oldptr; size_t oldlen; size_t oldidx; int (*oldfunc)(struct sysctl_req *, const void *, size_t); void* newptr; size_t newlen; size_t newidx; int (*newfunc)(struct sysctl_req *, void *, size_t); }; """ strsysctl_oid = """ struct sysctl_oid { void *oid_parent; void *oid_link; int oid_number; int oid_kind; void *oid_arg1; int oid_arg2; const char *oid_name; int (*oid_handler) (struct sysctl_oid *oidp, void *arg1, int arg2, struct sysctl_req *req); const char *oid_fmt; }; """ idc.SetLocalType(-1, strsysctl_req, 0) Til2Idb(-1, "sysctl_req") idc.SetLocalType(-1, strsysctl_oid, 0) Til2Idb(-1, "sysctl_oid")
def register_structs(): str_afu_header = """ struct afu_header { unsigned short magic; unsigned short unk_0x100; unsigned short fw_type; unsigned short fw_version; unsigned int fw_len; unsigned int fw_crc; unsigned short product_id; unsigned short hw_revision_id; }; """ str_afu_sig_header = """ struct afu_sig_header { unsigned int magic; unsigned short unk_0x100; unsigned short unk_0x120; unsigned short digest_type; // guess 1 sha256? unsigned short digest_len; unsigned int digest_offs; unsigned short sig_type; unsigned short sig_len; unsigned int sig_offs; }; """ str_afu_pers_header = """ struct afu_pers_header { unsigned int magic; unsigned short unk_0x100; unsigned char uniqueid[12]; unsigned char reserved[0x1c-0x12]; unsigned int flags; }; """ str_afu_full_header = """ struct afu_full_header { struct afu_header header; unsigned char reserved1[0x20-0x14]; struct afu_sig_header sig_header; unsigned char reserved2[0x40-0x38]; struct afu_pers_header pers_header; unsigned char reserved3[0x7c-0x60]; unsigned int header_crc; }; """ sid = idc.get_struc_id("afu_header") if sid != -1: idc.del_struc(sid) r = idc.SetLocalType(-1, str_afu_header, 0) r = idc.import_type(-1, "afu_header") sid = idc.get_struc_id("afu_sig_header") if sid != -1: idc.del_struc(sid) r = idc.SetLocalType(-1, str_afu_sig_header, 0) r = idc.import_type(-1, "afu_sig_header") sid = idc.get_struc_id("afu_pers_header") if sid != -1: idc.del_struc(sid) r = idc.SetLocalType(-1, str_afu_pers_header, 0) r = idc.import_type(-1, "afu_pers_header") sid = idc.get_struc_id("afu_full_header") if sid != -1: idc.del_struc(sid) r = idc.SetLocalType(-1, str_afu_full_header, 0) r = idc.import_type(-1, "afu_full_header")