def member_data(self, member): d = {} # TODO: variable size bool # TODO: retrieve_member_info - get operand type member info d['name'] = ida_struct.get_member_name(member.id) d['size'] = ida_struct.get_member_size(member) d['flag'] = member.flag d['offset'] = member.soff d['comment'] = ida_struct.get_member_cmt(member.id, False) d['repeatable_comment'] = ida_struct.get_member_cmt(member.id, True) if member.has_ti(): tinfo = ida_typeinf.tinfo_t() ida_struct.get_member_tinfo(tinfo, member) d['type_info_serialize'] = tinfo.serialize() d['type_info'] = str(tinfo) oi = ida_nalt.opinfo_t() ida_struct.retrieve_member_info(oi, member) # TODO: Do things with OI sptr = ida_struct.get_sptr(member) if sptr: struct_name = ida_struct.get_struc_name(sptr.id) d['struct_name'] = struct_name d['struct_uuid'] = StructureAnnotation.depend(self, struct_name) return d
def struc_member_changed(self, sptr, mptr): extra = {} sname = ida_struct.get_struc_name(sptr.id) soff = 0 if mptr.unimem() else mptr.soff flag = mptr.flag mt = ida_nalt.opinfo_t() is_not_data = ida_struct.retrieve_member_info(mt, mptr) if is_not_data: if flag & ida_bytes.off_flag(): extra["target"] = mt.ri.target extra["base"] = mt.ri.base extra["tdelta"] = mt.ri.tdelta extra["flags"] = mt.ri.flags self._send_packet( evt.StrucMemberChangedEvent(sname, soff, mptr.eoff, flag, extra)) elif flag & ida_bytes.enum_flag(): extra["serial"] = mt.ec.serial self._send_packet( evt.StrucMemberChangedEvent(sname, soff, mptr.eoff, flag, extra)) elif flag & ida_bytes.stru_flag(): extra["struc_name"] = ida_struct.get_struc_name(mt.tid) if flag & ida_bytes.strlit_flag(): extra["strtype"] = mt.strtype self._send_packet( evt.StrucMemberChangedEvent(sname, soff, mptr.eoff, flag, extra)) else: self._send_packet( evt.StrucMemberChangedEvent(sname, soff, mptr.eoff, flag, extra)) return 0
def struc_member_changed(self, sptr, mptr): extra = {} sname = ida_struct.get_struc_name(sptr.id) soff = 0 if mptr.unimem() else mptr.soff flag = mptr.flag mt = ida_nalt.opinfo_t() is_not_data = ida_struct.retrieve_member_info(mt, mptr) if is_not_data: if flag & ida_bytes.off_flag(): extra['target'] = mt.ri.target extra['base'] = mt.ri.base extra['tdelta'] = mt.ri.tdelta extra['flags'] = mt.ri.flags self._send_event( StrucMemberChangedEvent(sname, soff, mptr.eoff, flag, extra)) # Is it really possible to create an enum? elif flag & ida_bytes.enum_flag(): extra['serial'] = mt.ec.serial self._send_event( StrucMemberChangedEvent(sname, soff, mptr.eoff, flag, extra)) elif flag & ida_bytes.stru_flag(): extra['id'] = mt.tid if flag & ida_bytes.strlit_flag(): extra['strtype'] = mt.strtype self._send_event( StrucMemberChangedEvent(sname, soff, mptr.eoff, flag, extra)) else: self._send_event( StrucMemberChangedEvent(sname, soff, mptr.eoff, flag, extra)) return 0
def struc_member_created(self, sptr, mptr): extra = {} sname = ida_struct.get_struc_name(sptr.id) fieldname = ida_struct.get_member_name(mptr.id) offset = 0 if mptr.unimem() else mptr.soff flag = mptr.flag nbytes = mptr.eoff if mptr.unimem() else mptr.eoff - mptr.soff mt = ida_nalt.opinfo_t() is_not_data = ida_struct.retrieve_member_info(mt, mptr) if is_not_data: if flag & ida_bytes.off_flag(): extra["target"] = mt.ri.target extra["base"] = mt.ri.base extra["tdelta"] = mt.ri.tdelta extra["flags"] = mt.ri.flags self._send_packet( evt.StrucMemberCreatedEvent( sname, fieldname, offset, flag, nbytes, extra ) ) # Is it really possible to create an enum? elif flag & ida_bytes.enum_flag(): extra["serial"] = mt.ec.serial self._send_packet( evt.StrucMemberCreatedEvent( sname, fieldname, offset, flag, nbytes, extra ) ) elif flag & ida_bytes.stru_flag(): extra["id"] = mt.tid if flag & ida_bytes.strlit_flag(): extra["strtype"] = mt.strtype self._send_packet( evt.StrucMemberCreatedEvent( sname, fieldname, offset, flag, nbytes, extra ) ) else: self._send_packet( evt.StrucMemberCreatedEvent( sname, fieldname, offset, flag, nbytes, extra ) ) return 0
def struc_member_changed(self, sptr, mptr): print("struc member changed") extra = {} sname = ida_struct.get_struc_name(sptr.id) soff = 0 if mptr.unimem() else mptr.soff flag = mptr.flag mt = ida_nalt.opinfo_t() is_not_data = ida_struct.retrieve_member_info(mt, mptr) if is_not_data: if flag & ida_bytes.off_flag(): extra["target"] = mt.ri.target extra["base"] = mt.ri.base extra["tdelta"] = mt.ri.tdelta extra["flags"] = mt.ri.flags elif flag & ida_bytes.enum_flag(): extra["serial"] = mt.ec.serial elif flag & ida_bytes.stru_flag(): extra["struc_name"] = ida_struct.get_struc_name(mt.tid) if flag & ida_bytes.strlit_flag(): extra["strtype"] = mt.strtype return 0
def struc_member_created(self, sptr, mptr): print("struc member created") extra = {} sname = ida_struct.get_struc_name(sptr.id) fieldname = ida_struct.get_member_name(mptr.id) offset = 0 if mptr.unimem() else mptr.soff flag = mptr.flag nbytes = mptr.eoff if mptr.unimem() else mptr.eoff - mptr.soff mt = ida_nalt.opinfo_t() is_not_data = ida_struct.retrieve_member_info(mt, mptr) if is_not_data: if flag & ida_bytes.off_flag(): extra["target"] = mt.ri.target extra["base"] = mt.ri.base extra["tdelta"] = mt.ri.tdelta extra["flags"] = mt.ri.flags # Is it really possible to create an enum? elif flag & ida_bytes.enum_flag(): extra["serial"] = mt.ec.serial elif flag & ida_bytes.stru_flag(): extra["struc_name"] = ida_struct.get_struc_name(mt.tid) if flag & ida_bytes.strlit_flag(): extra["strtype"] = mt.strtype return 0