def apply_member(cls, struct, data): ida_struct.add_struc_member(struct, data['name'], data['offset'], data['flag'], data['opinfo'], data['size']) member = ida_struct.get_member(struct, data['offset']) if 'comment' in data and data['comment']: ida_struct.set_member_cmt(member, data['comment'], False) if 'repeatable_comment' in data and data['repeatable_comment']: ida_struct.set_member_cmt(member, data['repeatable_comment'], True)
def __call__(self): struc = ida_struct.get_struc_id(self.sname) sptr = ida_struct.get_struc(struc) cmt = self.cmt if self.cmt else "" if self.smname: mptr = ida_struct.get_member_by_name(sptr, self.smname) ida_struct.set_member_cmt(mptr, cmt, self.repeatable_cmt) else: ida_struct.set_struc_cmt(sptr.id, cmt, self.repeatable_cmt)
def __call__(self): struc = ida_struct.get_struc_id(Event.encode(self.sname)) sptr = ida_struct.get_struc(struc) cmt = Event.encode(self.cmt if self.cmt else '') if self.smname: mptr = ida_struct.get_member_by_name(sptr, Event.encode(self.smname)) ida_struct.set_member_cmt(mptr, cmt, self.repeatable_cmt) else: ida_struct.set_struc_cmt(sptr.id, cmt, self.repeatable_cmt)
def create_struct(name, fields, size): struct_id = idaapi.get_struc_id(name) # print struct_id if struct_id != idaapi.BADADDR: i = ida_kernwin.ask_yn( 0, "A class structure for %s already exists. Are you sure you want to remake it?" % name) if i == idaapi.BADADDR: return if i == 1: idaapi.del_struc_members(idaapi.get_struc(struct_id), 0, idaapi.get_struc_size(struct_id)) # struct_id = idc.AddStrucEx(idaapi.BADADDR, name + "_vtbl", 0) else: struct_id = idaapi.add_struc(idaapi.BADADDR, name, 0) if struct_id == idaapi.BADADDR: Warning( "Could not create the class structure!.\nPlease check something.") return sptr = idaapi.get_struc(struct_id) for off in fields: off, type_name, type_kind, field_name = fields[off] print( "Process field. Off = 0x%04X, type_name = %s (%d: %s), field_name = %s" % (off, type_name, type_kind, type_sizes[type_kind][0], field_name)) type_size = type_sizes[type_kind][1] ret = ida_struct.add_struc_member(sptr, field_name.decode(), off, flags_dict[type_size], None, type_size) if ret != 0: ida_kernwin.warning("Unknown error! Err = %d" % ret) return mptr = ida_struct.get_member(sptr, off) ida_struct.set_member_cmt( mptr, " --> %s (%d: %s)" % (type_name.decode(), type_kind, type_sizes[type_kind][0]), False) struct_size = ida_struct.get_struc_size(sptr) if size < struct_size: ida_kernwin.warning( "Struct create error! final size (%d) > instanse size (%d)" % (struct_size, size)) elif size > struct_size: for i in range(size - struct_size): ida_struct.add_struc_member(sptr, "dummy%d" % i, idaapi.BADADDR, idaapi.FF_BYTE, None, 1)