Beispiel #1
0
    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
Beispiel #2
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_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
Beispiel #3
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
Beispiel #4
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
Beispiel #5
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
Beispiel #6
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