def autoenum(self): common_value = get_common_value() enum_name = idaapi.ask_str(self._last_enum, 0, "Enum Name") if enum_name is None: return if not enum_name: enum_name = None self._last_enum = enum_name # Can't ask with negative numbers. if common_value >> ((8 * sark.core.get_native_size()) - 1): common_value = 0 const_value = idaapi.ask_long(common_value, "Const Value") if const_value is None: return modify = True try: enum = sark.add_enum(enum_name) except sark.exceptions.EnumAlreadyExists: enum = sark.Enum(enum_name) yes_no_cancel = idaapi.ask_yn(idaapi.ASKBTN_NO, "Enum already exists. Modify?\n") if yes_no_cancel == idaapi.ASKBTN_CANCEL: return elif yes_no_cancel == idaapi.ASKBTN_YES: modify = True else: # yes_no_cancel == idaapi.ASKBTN_NO: modify = False member_name = const_name(enum, const_value) if modify: try: enum.members.add(member_name, const_value) except sark.exceptions.SarkErrorAddEnumMemeberFailed as ex: idaapi.msg("[AutoEnum] Adding enum member failed: {}.".format( ex.message)) else: for member in enum.members: if member.value == const_value: member_name = member.name break else: return # Apply the enum apply_enum_by_name(enum, member_name)
def run(self, arg): common_value = get_common_value() enum_name = idc.AskStr(self._last_enum, "Enum Name") if enum_name is None: return if not enum_name: enum_name = None self._last_enum = enum_name const_value = idc.AskLong(common_value, "Const Value") if const_value is None: return modify = True try: enum = sark.add_enum(enum_name) except sark.exceptions.EnumAlreadyExists: enum = sark.Enum(enum_name) yes_no_cancel = idc.AskYN(idaapi.ASKBTN_NO, "Enum already exists. Modify?\n") if yes_no_cancel == idaapi.ASKBTN_CANCEL: return elif yes_no_cancel == idaapi.ASKBTN_YES: modify = True else: # yes_no_cancel == idaapi.ASKBTN_NO: modify = False member_name = const_name(enum, const_value) if modify: try: enum.members.add(member_name, const_value) except sark.exceptions.SarkErrorAddEnumMemeberFailed as ex: idaapi.msg( "[AutoEnum] Adding struct member failed: {}.".format( ex.message)) else: for member in enum.members: if member.value == const_value: member_name = member.name break else: return # Apply the enum apply_enum_by_name(enum, member_name)
def __get_enum_values(self): try: enum_name = idaapi.print_tinfo("", 0, 0, idaapi.PRTYPE_1LINE, self.type, "", "") enum = sark.Enum(name=enum_name) for member in enum.members: if member.value == self.rawValue: self.parsedValues.append( ParsedValue("{}.{}".format(enum_name, member.name), "Enum", MAX_SCORE, hex(self.rawValue), "enum")) return True return False except Exception as ex: self.logger.exception("Error while retrieving enum values: %s", ex) return False
def rename_immediate(): highlighted = sark.get_highlighted_identifier() try: desired = int(highlighted, 0) except (ValueError, TypeError): desired = None value = idaapi.ask_long(get_common_value(desired), "Const Value") if value is None: return name = idaapi.ask_str("", 0, "Constant Name") if name is None: return try: enum = sark.Enum('GlobalConstants') except sark.exceptions.EnumNotFound: enum = sark.add_enum('GlobalConstants') enum.members.add(name, value) apply_enum_by_name(enum, name)