Naif Al Mudawi

43 papers C 1Journal 39Unranked 3
YearRankTypeTitle / Venue / Authors
2025 J jnl
PeerJ Comput. Sci.
Abdulwahab Alazeb, Iqra Aijaz Abro, Naif Al Mudawi, Haifa F. Alhasson, Naif S. Alshassari, Mohammed S. Alshehri, Fatimah Alhayan
2025 J jnl
IEEE Access
Abdulwahab Alazeb, Mouazma Batool, Naif Al Mudawi, Mohammed S. Alshehri, Sultan Almakdi, Nouf Abdullah Almujally, Asaad Algarni
2025 J jnl
PeerJ Comput. Sci.
Naif Al Mudawi, Muhammad Waqas Ahmed, Haifa F. Alhasson, Naif S. Alshassari, Abdulwahab Alazeb, Mohammed S. Alshehri, Bayan Alabdullah
2025 J jnl
Comput. Mater. Continua
Abdulwahab Alazeb, Muhammad Hanzla, Naif Al Mudawi, Mohammed Alshehri, Haifa F. Alhasson, Dina Abdulaziz Alhammadi, Ahmad Jalal
2025 J jnl
Int. Arab J. Inf. Technol.
Muhammad Waqas Ahmed, Abdulwahab Alazeb, Naif Al Mudawi, Touseef Sadiq, Bayan Alabdullah, Hameedur Rahman, Asaad Algarni, Ahmad Jalal
2025 J jnl
Comput. Mater. Continua
Naif Al Mudawi, Muhammad Hanzla, Abdulwahab Alazeb, Mohammed Alshehri, Haifa F. Alhasson, Dina Abdulaziz Alhammadi, Ahmad Jalal
2024 J jnl
Sensors
Danyal Khan, Naif Al Mudawi, Maha S. Abdelhaq, Abdulwahab Alazeb, Saud S. Alotaibi, Asaad Algarni, Ahmad Jalal
2024 J jnl
IEEE Access
Danyal Khan, Abdullah Alshahrani, Abrar Almjally, Naif Al Mudawi, Asaad Algarni, Khaled Alnowaiser, Ahmad Jalal
2024 J jnl
Sensors
Nouf Abdullah Almujally, Danyal Khan, Naif Al Mudawi, Mohammed Alonazi, Abdulwahab Alazeb, Asaad Algarni, Ahmad Jalal, Hui Liu
2024 J jnl
IEEE Access
Aysha Naseer, Naif Al Mudawi, Maha S. Abdelhaq, Mohammed Alonazi, Abdulwahab Alazeb, Asaad Algarni, Ahmad Jalal
2024 J jnl
IEEE Access
Aysha Naseer, Hamdan A. Alzahrani, Nouf Abdullah Almujally, Khaled Al Nowaiser, Naif Al Mudawi, Asaad Algarni, Jeongmin Park
2024 C conf
ICINCO (1)
Naif Al Mudawi, Wahidur Rahman, Md. Tusher Ahmad Bappy
2024 J jnl
IEEE Access
Abdulwahab Alazeb, Mouazma Batool, Naif Al Mudawi, Mohammed S. Alshehri, Sultan Almakdi, Nouf Abdullah Almujally, Asaad Algarni
2024 J jnl
IEEE Access
Aysha Naseer, Hamdan A. Alzahrani, Nouf Abdullah Almujally, Khaled Abdulrahman Alnowaiser, Naif Al Mudawi, Asaad Algarni, Jeongmin Park
2024 J jnl
IEEE Access
Kainat Iqbal, Bayan Ibrahimm Alabdullah, Naif Al Mudawi, Asaad Algarni, Ahmad Jalal, Jeongmin Park
2024 J jnl
Sensors
Syed Jalaluddin Hashmi, Bayan Ibrahimm Alabdullah, Naif Al Mudawi, Asaad Algarni, Ahmad Jalal, Hui Liu
2024 J jnl
IEEE Access
Muhammad Ovais Yusuf, Muhammad Hanzla, Hameedur Rahman, Touseef Sadiq, Naif Al Mudawi, Nouf Abdullah Almujally, Asaad Algarni
2024 conf
ICARSC
Naif Al Mudawi, Muhammad Tayyab, Muhammad Waqas Ahmed, Ahmad Jalal
2024 J jnl
Frontiers Neurorobotics
Nouf Abdullah Almujally, Adnan Ahmed Rafique, Naif Al Mudawi, Abdulwahab Alazeb, Mohammed Alonazi, Asaad Algarni, Ahmad Jalal, Hui Liu
2024 J jnl
IEEE Access
Muhammad Waqas Ahmed, Abdullah Alshahrani, Abrar Almjally, Naif Al Mudawi, Asaad Algarni, Khaled Al Nowaiser, Ahmad Jalal, Jeongmin Park
2024 J jnl
Frontiers Neurorobotics
Abdulwahab Alazeb, Bisma Riaz Chughtai, Naif Al Mudawi, Yahya Alqahtani, Mohammed Alonazi, Hanan Aljuaid, Ahmad Jalal, Hui Liu
2024 J jnl
Comput. Mater. Continua
Tanvir Fatima Naik Bukht, Abdulwahab Alazeb, Naif Al Mudawi, Bayan Alabdullah, Khaled Alnowaiser, Ahmad Jalal, Hui Liu
2024 J jnl
Comput. Mater. Continua
Bayan Alabdullah, Muhammad Tayyab, Yahay Alqahtani, Naif Al Mudawi, Asaad Algarni, Ahmad Jalal, Jeongmin Park
2024 J jnl
Frontiers Neurorobotics
Muhammad Ovais Yusuf, Muhammad Hanzla, Naif Al Mudawi, Touseef Sadiq, Bayan Ibrahimm Alabdullah, Hameedur Rahman, Asaad Algarni
2024 J jnl
IEEE Access
Muhammad Hanzla, Muhammad Ovais Yusuf, Touseef Sadiq, Naif Al Mudawi, Hameedur Rahman, Abdulwahab Alazeb, Aisha Ahmed AlArfaj, Asaad Algarni
2024 J jnl
Comput. Mater. Continua
Nouf Abdullah Almujally, Bisma Riaz Chughtai, Naif Al Mudawi, Abdulwahab Alazeb, Asaad Algarni, Hamdan A. Alzahrani, Jeongmin Park
2024 J jnl
Frontiers Neurorobotics
Yawar Abbas, Naif Al Mudawi, Bayan Alabdullah, Touseef Sadiq, Asaad Algarni, Hameedur Rahman, Ahmad Jalal
2024 J jnl
Frontiers Neurorobotics
Muhammad Hanzla, Muhammad Ovais Yusuf, Naif Al Mudawi, Touseef Sadiq, Nouf Abdullah Almujally, Hameedur Rahman, Abdulwahab Alazeb, Asaad Algarni
2023 J jnl
Sensors
Madiha Javeed, Naif Al Mudawi, Bayan Ibrahimm Alabdullah, Ahmad Jalal, Wooseong Kim
2023 J jnl
IEEE Access
Mohammed Alonazi, Asifa Mehmood Qureshi, Saud S. Alotaibi, Nouf Abdullah Almujally, Naif Al Mudawi, Abdulwahab Alazeb, Ahmad Jalal, Jaekwang Kim, Moohong Min
2023 J jnl
IEEE Access
Usman Azmat, Saud S. Alotaibi, Naif Al Mudawi, Bayan Ibrahimm Alabdullah, Mohammed Alonazi, Ahmad Jalal, Jeongmin Park
2023 J jnl
IEEE Access
Madiha Javeed, Naif Al Mudawi, Abdulwahab Alazeb, Saud S. Alotaibi, Nouf Abdullah Almujally, Ahmad Jalal
2023 J jnl
IEEE Access
Hira Ansar, Naif Al Mudawi, Saud S. Alotaibi, Abdulwahab Alazeb, Bayan Ibrahimm Alabdullah, Mohammed Alonazi, Jeongmin Park
2023 J jnl
IEEE Access
Israr Akhtar, Naif Al Mudawi, Bayan Ibrahimm Alabdullah, Mohammed Alonazi, Jeongmin Park
2023 J jnl
Sensors
Madiha Javeed, Naif Al Mudawi, Abdulwahab Alazeb, Sultan Almakdi, Saud S. Alotaibi, Samia Allaoua Chelloug, Ahmad Jalal
2023 J jnl
Sensors
Abdulwahab Alazeb, Usman Azmat, Naif Al Mudawi, Abdullah Alshahrani, Saud S. Alotaibi, Nouf Abdullah Almujally, Ahmad Jalal
2023 J jnl
IEEE Access
Sadaf Hafeez, Saud S. Alotaibi, Abdulwahab Alazeb, Naif Al Mudawi, Wooseong Kim
2023 J jnl
IEEE Access
Mohammed Alonazi, Hira Ansar, Naif Al Mudawi, Saud S. Alotaibi, Nouf Abdullah Almujally, Abdulwahab Alazeb, Ahmad Jalal, Jaekwang Kim, Moohong Min
2023 J jnl
Sensors
Bayan Ibrahimm Alabdullah, Hira Ansar, Naif Al Mudawi, Abdulwahab Alazeb, Abdullah Alshahrani, Saud S. Alotaibi, Ahmad Jalal
2022 J jnl
Sensors
Naif Al Mudawi, Abdulwahab Alazeb
2022 J jnl
IEEE Access
Naif Al Mudawi
2021 conf
SAI (1)
Naif Al Mudawi, Natalia Beloff, Martin White
2019 conf
SmartWorld/SCALCOM/UIC/ATC/CBDCom/IOP/SCI
Naif Al Mudawi, Natalia Beloff, Martin White
redb/extractors/decompiler/bninja/arch/x86.py
← Index redb/extractors/decompiler/bninja/arch/x86.py python
from binaryninja.enums import (
    InstructionTextTokenType,
)

# Support both package and standalone imports
try:
    from .architecture import Architecture
except ImportError:
    # Fallback to absolute imports (for multiprocessing spawned processes)
    from redb.extractors.decompiler.bninja.arch.architecture import Architecture


class Arch_x86(Architecture):
    """The concrete class for architecture-dependent details for x86_64"""

    def __init__(self):
        # general purpose registers for 64bits
        self.gpr_64 = [
            "RAX",
            "RBX",
            "RCX",
            "RDX",
            "RSI",
            "RDIR9",
            "R10",
            "R11",
            "R12",
            "R13",
            "R14",
            "R15",
        ]

        self.gpr_32 = [
            "EAX",
            "EBX",
            "ECX",
            "EDX",
            "ESI",
            "EDI",
            "R8D",
            "R9D",
            "R10D",
            "R11D",
            "R12D",
            "R13D",
            "R14D",
            "R15D",
        ]

        self.gpr_16 = [
            "AX",
            "BX",
            "CX",
            "DX",
            "SI",
            "DI",
            "R8W",
            "R9W",
            "R10W",
            "R11W",
            "R12W",
            "R13W",
            "R14W",
            "R15W",
        ]

        self.gpr_8 = [
            "AL",
            "BL",
            "CL",
            "DL",
            "SIL",
            "DIL",
            "R8B",
            "R9B",
            "R10B",
            "R11B",
            "R12B",
            "R13B",
            "R14B",
            "R15B",
        ]

        self.fpu_x87 = ["ST0", "ST1", "ST2", "ST3", "ST4", "ST5", "ST6", "ST7"]

        self.sse_xmm = [
            "XMM0",
            "XMM1",
            "XMM2",
            "XMM3",
            "XMM4",
            "XMM5",
            "XMM6",
            "XMM7",
            "XMM8",
            "XMM9",
            "XMM10",
            "XMM11",
            "XMM12",
            "XMM13",
            "XMM14",
            "XMM15",
        ]

        self.avx_ymm = [
            "YMM0",
            "YMM1",
            "YMM2",
            "YMM3",
            "YMM4",
            "YMM5",
            "YMM6",
            "YMM7",
            "YMM8",
            "YMM9",
            "YMM10",
            "YMM11",
            "YMM12",
            "YMM13",
            "YMM14",
            "YMM15",
        ]
        self.flags = ["FLAGS", "EFLAGS", "RFLAGS"]
        self.stack_registers = ["RBP", "RSP", "SP", "BP"]
        self.size = 8
        self.global_registers = (
            self.gpr_64
            + self.gpr_32
            + self.gpr_16
            + self.gpr_8
            + self.fpu_x87
            + self.sse_xmm
            + self.avx_ymm
        )
        self.opcode_categories = self._initialize_opcode_categories()

        ## instructions
        self.instructions = []

    def is_register(self, register):
        register = register.upper()
        return register in self.global_registers

    def is_general_purpose_register(self, register):
        register = register.upper()
        return (
            register in self.gpr_64
            or register in self.gpr_32
            or register in self.gpr_16
            or register in self.gpr_8
        )

    def is_stack_register(self, register):
        register = register.upper()
        return register in self.stack_registers

    def is_xmm_register(self, register):
        register = register.upper()
        return register in self.sse_xmm

    def is_control_flow(self, instr_tokens):
        return False

    def is_control_flow_instruction(self, instr_tokens):
        """Check if an instruction is a control flow instruction (jump, call, return, loop)."""
        try:
            # Extract the mnemonic from the instruction tokens
            mnemonic = None
            for token in instr_tokens:
                if token.type == InstructionTextTokenType.InstructionToken:
                    mnemonic = token.text.upper()
                    break

            if not mnemonic:
                return False

            # Check if it's a jump, call, return, or loop instruction
            return (
                mnemonic.startswith("J")  # All jumps (JMP, JE, JNE, etc.)
                or mnemonic == "CALL"  # Function calls
                or mnemonic == "RET"  # Return
                or mnemonic == "RETN"  # Another form of return
                or mnemonic.startswith("LOOP")
            )  # Loop instructions

        except Exception as e:
            print(e)
            # If we can't determine, assume it's not a control flow instruction
            return False

    def is_control_flow_instruction_by_mnemonic(self, mnemonic):
        """Check if an instruction is a control flow instruction based on its mnemonic."""
        if not mnemonic:
            return False

        mnemonic = mnemonic.upper()
        return (
            mnemonic.startswith("J")  # All jumps (JMP, JE, JNE, etc.)
            or mnemonic == "CALL"  # Function calls
            or mnemonic == "RET"  # Return
            or mnemonic == "RETN"  # Another form of return
            or mnemonic.startswith("LOOP")
        )

    def _initialize_opcode_categories(self):
        """Initialize mapping of opcodes to categories similar to Ghidra's implementation."""
        opcode_categories = {}
        opcode_index = {}  # Add this to mimic Ghidra's opcodeIndex

        # Define common opcodes array similar to Ghidra's COMMON_OPCODES
        COMMON_OPCODES = [
            # Core instructions (tracked individually)
            "MOV",
            "PUSH",
            "POP",
            "LEA",
            "CALL",
            "RET",  # Data movement and control
            "ADD",
            "SUB",
            "MUL",
            "DIV",  # Basic arithmetic
            "AND",
            "OR",
            "XOR",
            "NOT",  # Logical operations
            "JMP",
            "JE",
            "JNE",  # Basic jumps
            "TEST",
            "CMP",  # Comparisons
            # Grouped categories (aggregated tracking)
            "SIMD_MOVE",  # MOVAPS, MOVDQA, MOVDQU, etc.
            "COND_JUMP_EXT",  # Other conditional jumps (JG, JL, JGE, etc.)
            "STRING_OP",  # MOVS, STOS, LODS, SCAS, CMPS
            "STACK_ADV",  # ENTER, LEAVE, PUSHA, POPA
            "ARITHMETIC_ADV",  # IMUL, IDIV, ADC, SBB
            "BIT_OP",  # SHL, SHR, SAR, ROL, ROR, etc.
            "FPU_OP",  # FLD, FST, FADD, etc.
            "SYSTEM_OP",  # SYSCALL, INT, SYSENTER
            "CRYPTO_OP",  # AES*, SHA* instructions
            "MISC_OP",  # Rare but interesting (CPUID, RDTSC, etc.)
        ]

        # Create index map like Ghidra
        for i, opcode in enumerate(COMMON_OPCODES):
            opcode_index[opcode] = i

        # Now categorize opcodes using if/elif/else structure like in Ghidra
        for opcode in COMMON_OPCODES:
            # String Operations (checking these first to avoid MOV confusion)
            if opcode.startswith("MOVS") or opcode in [
                "STOS",
                "LODS",
                "SCAS",
                "CMPS",
                "REP",
                "REPE",
                "REPNE",
            ]:
                opcode_categories[opcode] = "STRING_MANIPULATION"

            # Data Movement (after string ops to avoid MOVS confusion)
            elif opcode.startswith("MOV") or opcode in ["LEA", "XCHG"]:
                opcode_categories[opcode] = "DATA_MOVEMENT"

            # Stack Operations
            elif opcode in ["PUSH", "POP", "ENTER", "LEAVE", "PUSHA", "POPA"]:
                opcode_categories[opcode] = "STACK_MANAGEMENT"

            # Control Flow (non-conditional)
            elif opcode in ["JMP", "CALL", "RET"]:
                opcode_categories[opcode] = "CONTROL_FLOW"

            # Conditional Jumps and Loops
            elif opcode.startswith("J") or opcode.startswith("LOOP"):
                opcode_categories[opcode] = "CONDITIONAL_JUMP"

            # Arithmetic
            elif opcode in [
                "ADD",
                "SUB",
                "MUL",
                "DIV",
                "IMUL",
                "IDIV",
                "ADC",
                "SBB",
                "INC",
                "DEC",
                "NEG",
            ]:
                opcode_categories[opcode] = "ARITHMETIC"

            # Logical
            elif opcode in ["AND", "OR", "XOR", "NOT", "TEST", "CMP"]:
                opcode_categories[opcode] = "LOGICAL"

            # Shifts & Rotates
            elif opcode in ["SHL", "SHR", "SAR", "SAL", "ROL", "ROR", "RCL", "RCR"]:
                opcode_categories[opcode] = "SHIFT_ROTATE"

            # System & Interrupts
            elif opcode in [
                "SYSCALL",
                "INT",
                "SYSENTER",
                "SYSEXIT",
                "SGDT",
                "SIDT",
                "SLDT",
                "WRMSR",
                "RDMSR",
            ]:
                opcode_categories[opcode] = "SYSTEM_CALLS"

            # Floating Point
            elif opcode.startswith("F"):
                opcode_categories[opcode] = "FPU_ARITHMETIC"

            # System Information and Random Number Generation
            elif opcode in ["PUSHF", "POPF", "CPUID", "RDTSC", "RDRAND", "RDSEED"]:
                opcode_categories[opcode] = "CPU_FEATURES"

            # Cryptography
            elif opcode.startswith("AES") or opcode.startswith("SHA"):
                opcode_categories[opcode] = "CRYPTOGRAPHIC"

            # Miscellaneous (including flag operations)
            else:
                opcode_categories[opcode] = "MISC"

        # Additional categorization for opcodes not in COMMON_OPCODES
        # This can be used in the normalize_opcode method

        # Store both maps as instance variables
        # self.opcode_categories = opcode_categories
        self.opcode_index = opcode_index

        return opcode_categories

    def is_simd_register(self, register):
        return register in self.sse_xmm