mirror of
https://github.com/idapython/src
synced 2026-06-08 14:47:00 +00:00
69 lines
2.3 KiB
Python
69 lines
2.3 KiB
Python
"""
|
|
summary: programmatically create & populate a structure
|
|
|
|
description:
|
|
Usage of the API to create & populate a structure with
|
|
members of different types.
|
|
|
|
author: Gergely Erdelyi (gergely.erdelyi@d-dome.net)
|
|
"""
|
|
|
|
from __future__ import print_function
|
|
#---------------------------------------------------------------------
|
|
# Structure test
|
|
#
|
|
# This script demonstrates how to create structures and populate them
|
|
# with members of different types.
|
|
#---------------------------------------------------------------------
|
|
|
|
import ida_struct
|
|
import ida_idaapi
|
|
import ida_bytes
|
|
import ida_nalt
|
|
|
|
import idc
|
|
|
|
sid = ida_struct.get_struc_id("mystr1")
|
|
if sid != -1:
|
|
idc.del_struc(sid)
|
|
sid = ida_struct.add_struc(ida_idaapi.BADADDR, "mystr1", 0)
|
|
print("%x" % sid)
|
|
|
|
# Test simple data types
|
|
simple_types_data = [
|
|
(ida_bytes.FF_BYTE, 1),
|
|
(ida_bytes.FF_WORD, 2),
|
|
(ida_bytes.FF_DWORD, 4),
|
|
(ida_bytes.FF_QWORD, 8),
|
|
(ida_bytes.FF_TBYTE, 10),
|
|
(ida_bytes.FF_OWORD, 16),
|
|
(ida_bytes.FF_FLOAT, 4),
|
|
(ida_bytes.FF_DOUBLE, 8),
|
|
(ida_bytes.FF_PACKREAL, 10),
|
|
]
|
|
for i, tpl in enumerate(simple_types_data):
|
|
t, nsize = tpl
|
|
print("t%x:"% ((t|ida_bytes.FF_DATA) & 0xFFFFFFFF),
|
|
idc.add_struc_member(sid, "t%02d"%i, ida_idaapi.BADADDR, (t|ida_bytes.FF_DATA )&0xFFFFFFFF, -1, nsize))
|
|
|
|
# Test ASCII type
|
|
print("ASCII:", idc.add_struc_member(sid, "tascii", -1, ida_bytes.FF_STRLIT|ida_bytes.FF_DATA, ida_nalt.STRTYPE_C, 8))
|
|
|
|
# Test struc member type
|
|
msid = ida_struct.get_struc_id("mystr2")
|
|
if msid != -1:
|
|
idc.del_struc(msid)
|
|
msid = idc.add_struc(-1, "mystr2", 0)
|
|
print(idc.add_struc_member(msid, "member1", -1, (ida_bytes.FF_DWORD|ida_bytes.FF_DATA )&0xFFFFFFFF, -1, 4))
|
|
print(idc.add_struc_member(msid, "member2", -1, (ida_bytes.FF_DWORD|ida_bytes.FF_DATA )&0xFFFFFFFF, -1, 4))
|
|
|
|
msize = ida_struct.get_struc_size(msid)
|
|
print("Struct:", idc.add_struc_member(sid, "tstruct", -1, ida_bytes.FF_STRUCT|ida_bytes.FF_DATA, msid, msize))
|
|
print("Stroff:", idc.add_struc_member(sid, "tstroff", -1, ida_bytes.stroff_flag()|ida_bytes.FF_DWORD, msid, 4))
|
|
|
|
# Test offset types
|
|
print("Offset:", idc.add_struc_member(sid, "toffset", -1, ida_bytes.off_flag()|ida_bytes.FF_DATA|ida_bytes.FF_DWORD, 0, 4))
|
|
print("Offset:", idc.set_member_type(sid, 0, ida_bytes.off_flag()|ida_bytes.FF_DATA|ida_bytes.FF_DWORD, 0, 4))
|
|
|
|
print("Done")
|