Magnus Boman

72 papers A 2B 3C 4Journal 42Unranked 19
YearRankTypeTitle / Venue / Authors
2026 J jnl
IEEE Trans. Netw. Serv. Manag.
Akhila Rao, Magnus Boman
2026 J jnl
CoRR
Magnus Boman
2025 J jnl
CoRR
Daniel F. Perez-Ramirez, Dejan Kostic, Magnus Boman
2024 conf
TSD (1)
Evangelia Gogoulou, Timothée Lesort, Magnus Boman, Joakim Nivre
2024 conf
ICPRAI (1)
Giacomo Verardo, Magnus Boman, Samuel Bruchfeld, Marco Chiesa, Sabine Koch, Gerald Q. Maguire Jr., Dejan Kostic
2024 conf
CMRxRecon/MBAS/STACOM@MICCAI
Giacomo Verardo, Daniel F. Perez-Ramirez, Samuel Bruchfeld, Magnus Boman, Marco Chiesa, Sabine Koch, Gerald Q. Maguire Jr., Dejan Kostic
2024 J jnl
CoRR
Daniel F. Perez-Ramirez, Carlos M. Pérez-Penichet, Nicolas Tsiftes, Dejan Kostic, Magnus Boman, Thiemo Voigt
2024 J jnl
Health Informatics J.
Orlinda Brahimllari, Sandra Eloranta, Patrik Georgii-Hemming, Zahra Haider, Sabine Koch, Aleksandra Krstic, Frantzeska Papadopoulou Skarp, Richard Rosenquist, Karin E. Smedby, Fulya Taylan, Birna Thorvaldsdottir, Valtteri Wirta, Tove Wästerlid, Magnus Boman
2023 J jnl
CoRR
Evangelia Gogoulou, Timothée Lesort, Magnus Boman, Joakim Nivre
2023 conf
IPSN
Daniel F. Perez-Ramirez, Carlos M. Pérez-Penichet, Nicolas Tsiftes, Thiemo Voigt, Dejan Kostic, Magnus Boman
2023 J jnl
CoRR
Giacomo Verardo, Magnus Boman, Samuel Bruchfeld, Marco Chiesa, Sabine Koch, Gerald Q. Maguire Jr., Dejan Kostic
2023 J jnl
Digit. Soc.
Magnus Boman
2022 B conf
CNSM
Diarmuid Corcoran, Per Kreuger, Magnus Boman
2022 J jnl
IEEE Trans. Netw. Serv. Manag.
Rasoul Behravesh, Akhila Rao, Daniel F. Perez-Ramirez, Davit Harutyunyan, Roberto Riggio, Magnus Boman
2021 J jnl
PeerJ Comput. Sci.
Marcos Fernández Carbonell, Magnus Boman, Petri Laukka
2021 J jnl
CoRR
Daniel F. Perez-Ramirez, Carlos M. Pérez-Penichet, Nicolas Tsiftes, Thiemo Voigt, Dejan Kostic, Magnus Boman
2021 A conf
EACL
Evangelia Gogoulou, Magnus Boman, Fehmi Ben Abdesslem, Nils Hentati Isacsson, Viktor Kaldo, Magnus Sahlgren
2021 B conf
CNSM
Diarmuid Corcoran, Per Kreuger, Magnus Boman
2020 J jnl
IEEE Access
Natalia Vesselinova, Rebecca Steinert, Daniel F. Perez-Ramirez, Magnus Boman
2020 J jnl
CoRR
Natalia Vesselinova, Rebecca Steinert, Daniel F. Perez-Ramirez, Magnus Boman
2019 J jnl
Prog. Artif. Intell.
Magnus Boman, Fehmi Ben Abdesslem, Erik Forsell, Daniel Gillblad, Olof Görnerup, Nils Hentati Isacsson, Magnus Sahlgren, Viktor Kaldo
2018 conf
AAAI Spring Symposia
Magnus Boman, Magnus Sahlgren, Olof Görnerup, Daniel Gillblad
2018 conf
Financial Cryptography Workshops
Dominik Harz, Magnus Boman
2018 J jnl
CoRR
Dominik Harz, Magnus Boman
2015 J jnl
Künstliche Intell.
Magnus Boman, Pedro Sanches
2014 J jnl
CoRR
Pedro Sanches, Eric-Oluf Svee, Markus Bylund, Benjamin Hirsch, Magnus Boman
2014 conf
IEEE BigData
Magnus Boman, Daniel Gillblad
2013 J jnl
CoRR
Magnus Boman, Paul Davidsson, Håkan L. S. Younes
2013 J jnl
Netw. Commun. Technol.
Pedro Sanches, Eric-Oluf Svee, Markus Bylund, Benjamin Hirsch, Magnus Boman
2011 J jnl
J. Comput. Sci.
Baki Cakici, Magnus Boman
2010 J jnl
ERCIM News
Wah-Sui Almberg, Magnus Boman
2010 B conf
DCC
Katarina Borg Gyllenbäck, Magnus Boman
2009 J jnl
CoRR
Olof Görnerup, Magnus Boman
2007 J jnl
ERCIM News
Magnus Boman, Kristofer Franzén, Fredrik Espinoza
2007 J jnl
CoRR
Magnus Boman, Stefan J. Johansson
2007 conf
DiGRA Conference
Magnus Boman, Stefan J. Johansson
2006 J jnl
Decis. Support Syst.
Magnus Boman, Anna Sandin
2005 J jnl
Inf. Sci.
Paul Davidsson, Magnus Boman
2004 J jnl
ACM Trans. Internet Techn.
David Lybäck, Magnus Boman
2004 J jnl
Ann. Math. Artif. Intell.
Jan Odelstad, Magnus Boman
2004 J jnl
Pers. Ubiquitous Comput.
Stina Nylander, Markus Bylund, Magnus Boman
2003 J jnl
CoRR
Jan Odelstad, Magnus Boman
2003 conf
ABiALS
Jarmo Laaksolahti, Magnus Boman
2003 J jnl
CoRR
Magnus Boman, Anna Sandin
2002 J jnl
CoRR
David Lybäck, Magnus Boman
2002 J jnl
CoRR
Jarmo Laaksolahti, Magnus Boman
2002 J jnl
CoRR
Magnus Boman, Stefan J. Johansson, David Lybäck
2002 J jnl
CoRR
Magnus Boman, Markus Bylund, Fredrik Espinoza, Mats Danielson, David Lybäck
2001 J jnl
Electron. Commer. Res.
Koen Bertels, Magnus Boman
2001 J jnl
Electron. Commer. Res.
Magnus Boman, Lisa Brouwers, Karin Hansson, Carl-Gustaf Jansson, Johan Kummeneje, Harko Verhagen
2000 conf
ICMAS
Paul Davidsson, Magnus Boman
2000 conf
DEXA Workshop
Magnus Boman, Love Ekenberg
2000 conf
ASA/MA
Paul Davidsson, Magnus Boman
2000 C conf
RoboCup
Alessandro Saffiotti, Magnus Boman, Pär Buschka, Paul Davidsson, Stefan J. Johansson, Zbigniew Wasik
1999 A conf
UAI
Magnus Boman, Paul Davidsson, Håkan L. S. Younes
1999 ed.
MAAMAW
Francisco J. Garijo, Magnus Boman
1999 J jnl
Artif. Intell. Law
Magnus Boman
1999 C conf
RoboCup
Magnus Boman, Kevin LeBlanc, Christian Guttmann, Alessandro Saffiotti
1999 C conf
RoboCup
Johan Kummeneje, David Lybäck, Håkan L. S. Younes, Magnus Boman
1998 conf
PAAM
Magnus Boman, Paul Davidsson, Nikolaos Skarmeas, Keith L. Clark, Rune Gustavsson
1998 conf
SEAL
Stefan J. Johansson, Bengt Carlsson, Magnus Boman
1998 J jnl
Robotics Auton. Syst.
Magnus Boman
1998 C conf
RoboCup
Magnus Boman, Helena Åberg, Åsa Åhman, Jens Andreasen, Mats Danielson, Carl-Gustaf Jansson, Johan Kummeneje, Harko Verhagen, Johan Walter
1997 J jnl
Decis. Support Syst.
Love Ekenberg, Mats Danielson, Magnus Boman
1997 ed.
MAAMAW
Magnus Boman, Walter Van de Velde
1997 conf
MAAMAW
Magnus Boman
1996 J jnl
Int. J. Cooperative Inf. Syst.
Love Ekenberg, Mats Danielson, Magnus Boman
1995 conf
ICMAS
Love Ekenberg, Magnus Boman, Mats Danielson
1994 conf
MAAMAW
Love Ekenberg, Mats Danielson, Magnus Boman
1994 J jnl
Appl. Artif. Intell.
Harald Kjellin, Magnus Boman
1992 conf
DAISD
Magnus Boman
1992 conf
CNKBS
Magnus Boman, Paul Johanesson
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