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 op_type_changed(self, ea, n): self._plugin.logger.debug("op_type_changed(ea = %x, n = %d)" % (ea, n)) def gather_enum_info(ea, n): id = ida_bytes.get_enum_id(ea, n)[0] serial = ida_enum.get_enum_idx(id) return id, serial extra = {} mask = ida_bytes.MS_0TYPE if not n else ida_bytes.MS_1TYPE flags = ida_bytes.get_full_flags(ea) self._plugin.logger.debug("op_type_changed: flags = 0x%X)" % flags) def is_flag(type): return flags & mask == mask & type if is_flag(ida_bytes.hex_flag()): op = "hex" elif is_flag(ida_bytes.dec_flag()): op = "dec" elif is_flag(ida_bytes.char_flag()): op = "chr" elif is_flag(ida_bytes.bin_flag()): op = "bin" elif is_flag(ida_bytes.oct_flag()): op = "oct" elif is_flag(ida_bytes.off_flag()): op = "offset" elif is_flag(ida_bytes.enum_flag()): op = "enum" id, serial = gather_enum_info(ea, n) ename = ida_enum.get_enum_name(id) extra["ename"] = Event.decode(ename) extra["serial"] = serial elif flags & ida_bytes.stroff_flag(): op = "struct" path = ida_pro.tid_array(1) delta = ida_pro.sval_pointer() path_len = ida_bytes.get_stroff_path(path.cast(), delta.cast(), ea, n) spath = [] for i in range(path_len): sname = ida_struct.get_struc_name(path[i]) spath.append(Event.decode(sname)) extra["delta"] = delta.value() extra["spath"] = spath elif is_flag(ida_bytes.stkvar_flag()): op = "stkvar" # FIXME: No hooks are called when inverting sign # elif ida_bytes.is_invsign(ea, flags, n): # op = 'invert_sign' else: return 0 # FIXME: Find a better way to do this self._send_packet(evt.OpTypeChangedEvent(ea, n, op, extra)) return 0
def op_type_changed(self, ea, n): def gather_enum_info(ea, n): id = ida_bytes.get_enum_id(ea, n)[0] serial = ida_enum.get_enum_idx(id) return id, serial extra = {} mask = ida_bytes.MS_0TYPE if not n else ida_bytes.MS_1TYPE flags = ida_bytes.get_full_flags(ea) & mask def is_flag(type): return flags == mask & type if is_flag(ida_bytes.hex_flag()): op = 'hex' elif is_flag(ida_bytes.dec_flag()): op = 'dec' elif is_flag(ida_bytes.char_flag()): op = 'chr' elif is_flag(ida_bytes.bin_flag()): op = 'bin' elif is_flag(ida_bytes.oct_flag()): op = 'oct' elif is_flag(ida_bytes.enum_flag()): op = 'enum' id, serial = gather_enum_info(ea, n) ename = ida_enum.get_enum_name(id) extra['ename'] = Event.decode(ename) extra['serial'] = serial elif is_flag(flags & ida_bytes.stroff_flag()): op = 'struct' path = ida_pro.tid_array(1) delta = ida_pro.sval_pointer() path_len = ida_bytes.get_stroff_path(path.cast(), delta.cast(), ea, n) spath = [] for i in range(path_len): sname = ida_struct.get_struc_name(path[i]) spath.append(Event.decode(sname)) extra['delta'] = delta.value() extra['spath'] = spath elif is_flag(ida_bytes.stkvar_flag()): op = 'stkvar' # IDA hooks for is_invsign seems broken # Inverting sign don't trigger the hook # elif ida_bytes.is_invsign(ea, flags, n): # op = 'invert_sign' else: return 0 # FIXME: Find a better way self._send_event(OpTypeChangedEvent(ea, n, op, extra)) return 0
def op_type_changed(self, ea, n): extra = {} mask = ida_bytes.MS_0TYPE if not n else ida_bytes.MS_1TYPE flags = ida_bytes.get_full_flags(ea) & mask if flags == mask & ida_bytes.hex_flag(): op = 'hex' elif flags == mask & ida_bytes.dec_flag(): op = 'dec' elif flags == mask & ida_bytes.char_flag(): op = 'chr' elif flags == mask & ida_bytes.bin_flag(): op = 'bin' elif flags == mask & ida_bytes.oct_flag(): op = 'oct' elif flags == mask & ida_bytes.enum_flag(): op = 'enum' enum_id = ida_bytes.get_enum_id(ea, n)[0] enum_serial = ida_enum.get_enum_idx(enum_id) ename = ida_enum.get_enum_name(enum_id) extra['ename'] = Unicoder.decode(ename) extra['serial'] = enum_serial elif flags == mask & ida_bytes.stroff_flag(): op = 'struct' path = ida_pro.tid_array(1) delta = ida_pro.sval_pointer() path_len = ida_bytes.get_stroff_path(path.cast(), delta.cast(), ea, n) spath = [] for i in range(path_len): sname = ida_struct.get_struc_name(path[i]) spath.append(Unicoder.decode(sname)) extra['delta'] = delta.value() extra['spath'] = spath elif flags == mask & ida_bytes.stkvar_flag(): op = 'stkvar' else: return 0 self._network.send_event( EventType.OPTYPECHANGED, ea=ea, n=n, op=Unicoder.decode(op), extra=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