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 renamed(self, ea, new_name, local_name): # #print("renamed(ea = %x, new_name = %s, local_name = %d)" % (ea, new_name, local_name)) if ida_struct.is_member_id(ea) or ida_struct.get_struc( ea) or ida_enum.get_enum_name(ea): return 0 ida_func = idaapi.get_func(ea) # global var renaming if ida_func is None: size = idaapi.get_item_size(ea) self.binsync_state_change(self.controller.push_artifact, GlobalVariable(ea, new_name, size=size)) # function name renaming elif ida_func.start_ea == ea: # grab the name instead from ida name = idc.get_func_name(ida_func.start_ea) self.binsync_state_change(self.controller.push_artifact, FunctionHeader(name, ida_func.start_ea)) return 0
def renamed(self, ea, new_name, local_name): print("renamed(ea = %x, new_name = %s, local_name = %d)" % (ea, new_name, local_name)) if ida_struct.is_member_id(ea) or ida_struct.get_struc( ea) or ida_enum.get_enum_name(ea): # Drop hook to avoid duplicate since already handled by the following hooks: # - renaming_struc_member() -> sends 'StrucMemberRenamedEvent' # - renaming_struc() -> sends 'StrucRenamedEvent' # - renaming_enum() -> sends 'EnumRenamedEvent' return 0 # confirm we are renaming a function ida_func = idaapi.get_func(ea) if ida_func is None: return 0 # grab the name instead from ida name = idc.get_func_name(ida_func.start_ea) self.controller.make_controller_cmd(self.controller.push_function_name, ida_func.start_ea, name) return 0
# https://github.com/csnover/ida-misc # # Sorts all the enums in a database in case-insensitive alphabetical order. import ida_enum enums = [] for i in range(0, ida_enum.get_enum_qty()): id = ida_enum.getn_enum(i) name = ida_enum.get_enum_name(id) enums.append((name, id)) enums.sort(key=lambda t: t[0].lower()) for i, t in enumerate(enums): ida_enum.set_enum_idx(t[1], i)
def deleting_enum(self, id): print("enum deleted") return 0 enum_name = ida_enum.get_enum_name(id)
def deleting_enum(self, id): name = ida_enum.get_enum_name(id) enum = Enum(name, {}) self.binsync_state_change(self.controller.push_artifact, enum) return 0
def enum_cmt_changed(self, tid, repeatable_cmt): cmt = ida_enum.get_enum_cmt(tid, repeatable_cmt) emname = ida_enum.get_enum_name(tid) print("Detected an enum comment changed for 0x%x (%s): %s, %s" % (tid, emname, cmt, repeatable_cmt)) return 0
def enum_bf_changed(self, id): bf_flag = 1 if ida_enum.is_bf(id) else 0 ename = ida_enum.get_enum_name(id) self._send_packet(evt.EnumBfChangedEvent(ename, bf_flag)) return 0
def enum_created(self, id): if not shared.PAUSE_HOOK: log("Enum created: {0}".format(id)) pass_to_manager(CreateEnumEvent(ida_enum.get_enum_name(id), id)) return ida_idp.IDB_Hooks.enum_created(self, id)
def _is_this_elt(cls, idelt): """ Return true if ``idelt`` correspond to an enum_t. """ return ida_enum.get_enum_name(idelt) is not None
def implement(self): enum_name = ida_enum.get_enum_name(self._id) value = ida_enum.get_enum_member_value(self._member_id) serial = ida_enum.get_enum_member_serial(self._member_id) bmask = ida_enum.get_enum_member_bmask(self._member_id) ida_enum.del_enum_member(enum_name, value, serial, bmask)
def enum_bf_changed(self, id): ename = ida_enum.get_enum_name(id) print("Detected a bf changed: 0x%x (%s)" % (id, ename)) return 0
def deleting_enum(self, id): name = ida_enum.get_enum_name(id) print("Detected a enum deleted: 0x%x (%s)" % (id, name)) return 0
def enum_created(self, enum): name = ida_enum.get_enum_name(enum) print("Detected a new enum created: 0x%x (%s)" % (enum, name)) return 0
def enum_created(self, enum): name = ida_enum.get_enum_name(enum) self._send_packet(evt.EnumCreatedEvent(enum, name)) return 0
def deleting_enum(self, id): self._send_packet(evt.EnumDeletedEvent(ida_enum.get_enum_name(id))) return 0
def deleting_enum(self, id): if not shared.PAUSE_HOOK: log("Enum deleted") pass_to_manager(DeleteEnumEvent(ida_enum.get_enum_name(id))) return ida_idp.IDB_Hooks.enum_deleted(self, id)
def enum_cmt_changed(self, tid, repeatable_cmt): cmt = ida_enum.get_enum_cmt(tid, repeatable_cmt) emname = ida_enum.get_enum_name(tid) self._send_packet(evt.EnumCmtChangedEvent(emname, cmt, repeatable_cmt)) return 0
def bs_enum_modified(self, enum): name = ida_enum.get_enum_name(enum) _enum = compat.enum(name) self.binsync_state_change(self.controller.push_artifact, _enum)