def get_enum_members(_enum) -> typing.Dict[str, int]: enum_members = {} member = ida_enum.get_first_enum_member(_enum) member_addr = ida_enum.get_enum_member(_enum, member, 0, 0) member_name = ida_enum.get_enum_member_name(member_addr) enum_members[member_name] = member while member := ida_enum.get_next_enum_member(_enum, member, 0): if member == 0xffffffffffffffff: break member_addr = ida_enum.get_enum_member(_enum, member, 0, 0) member_name = ida_enum.get_enum_member_name(member_addr) enum_members[member_name] = member
def renaming_enum(self, id, is_enum, newname): if is_enum: oldname = ida_enum.get_enum_name(id) else: oldname = ida_enum.get_enum_member_name(id) self._send_packet(evt.EnumRenamedEvent(oldname, newname, is_enum)) return 0
def enum_member_created(self, id, cid): ename = ida_enum.get_enum_name(id) name = ida_enum.get_enum_member_name(cid) value = ida_enum.get_enum_member_value(cid) bmask = ida_enum.get_enum_member_bmask(cid) self._send_event(EnumMemberCreatedEvent(ename, name, value, bmask)) return 0
def name(self): """ Property for getting and setting the name of this enum member. :return str: The name of this enum member. """ return ida_enum.get_enum_member_name(self._mid)
def enum_member_created(self, id, cid): if not shared.PAUSE_HOOK: log("Enum memeber created: {0} {1}".format(id, cid)) name = ida_enum.get_enum_name(id) enum_item_name = ida_enum.get_enum_member_name(cid) value = ida_enum.get_enum_member_value(cid) pass_to_manager(CreateEnumItemEvent(name, enum_item_name, value)) return ida_idp.IDB_Hooks.enum_member_created(self, id, cid)
def renaming_enum(self, id, is_enum, newname): if is_enum: oldname = ida_enum.get_enum_name(id) else: oldname = ida_enum.get_enum_member_name(id) print("Detected an enum renamed from %s to %s (is_enum=%s)" % (oldname, newname, is_enum)) return 0
def enum_member_created(self, id, cid): ename = ida_enum.get_enum_name(id) name = ida_enum.get_enum_member_name(cid) value = ida_enum.get_enum_member_value(cid) bmask = ida_enum.get_enum_member_bmask(cid) print( "Detected a new enum member created: 0x%x (%s), 0x%x (%s) = 0x%x, 0x%x" % (id, ename, cid, name, value, bmask)) return 0
def enum_member_created(self, id, cid): print("enum member created") return ename = ida_enum.get_enum_name(id) name = ida_enum.get_enum_member_name(cid) value = ida_enum.get_enum_member_value(cid) bmask = ida_enum.get_enum_member_bmask(cid) self._send_packet(evt.EnumMemberCreatedEvent(ename, name, value, bmask)) return 0
def display_ui(self, bit_test_value): matches = [] value_str = '' if bit_test_value: # Shift the value to get our search parameter enum_value = 1 << int(bit_test_value) value_str = hex(enum_value) # Go through all loaded enums to see if it's in there enum_count = ida_enum.get_enum_qty() for i in range(enum_count): enum_id = ida_enum.getn_enum(i) if not enum_id: continue enum_is_bitfield = ida_enum.is_bf(enum_id) if enum_is_bitfield: # If the enum is a bitfield which contains (binary) flags, chances are # the mask for each member is equal to the flag. const_id = ida_enum.get_enum_member( enum_id, enum_value, 0, enum_value) else: # Otherwise, no mask! const_id = ida_enum.get_enum_member( enum_id, enum_value, 0, 0) # Returns BADNODE if not found if const_id != ida_netnode.BADNODE: # Looks legitimate, grab the enum name and const name const_name = ida_enum.get_enum_member_name(const_id) enum_name = ida_enum.get_enum_name(enum_id) matches.append((const_name, enum_name)) # Populate and show the dialog box dialog = BitTesterWidget(value_str) for match in matches: const_name, enum_name = match dialog.addEnumEntry(const_name, enum_name) dialog.table.resizeRowsToContents() old_timeout = idaapi.set_script_timeout(0) res = dialog.exec_() idaapi.set_script_timeout(old_timeout) if res != QtWidgets.QDialog.Accepted: self.logger.debug('Dialog rejected') return None, None self.logger.debug('Dialog accepted. Fetching values.') enum_choice, const_choice = dialog.getChoice() return enum_choice, const_choice
def visit_enum_member(self, cid, value): members.append({ 'value': value, 'name': ida_enum.get_enum_member_name(cid), }) return 0