예제 #1
0
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)
예제 #2
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")