Ejemplo n.º 1
0
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
Ejemplo n.º 2
0
 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
Ejemplo n.º 3
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
Ejemplo n.º 4
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)
Ejemplo n.º 5
0
 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)
Ejemplo n.º 6
0
 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
Ejemplo n.º 7
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
Ejemplo n.º 8
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
Ejemplo n.º 10
0
 def visit_enum_member(self, cid, value):
     members.append({
         'value': value,
         'name': ida_enum.get_enum_member_name(cid),
     })
     return 0