Ola Friman

38 papers A 1B 2Misc 1Journal 15Unranked 19
YearRankTypeTitle / Venue / Authors
2014 J jnl
IEEE Trans. Image Process.
Erik Ringaby, Ola Friman, Per-Erik Forssén, Thomas-Olsvik Opsahl, Trym Vegard Haavardsholm, Ingebjørg Kåsen
2014 J jnl
IEEE Trans. Geosci. Remote. Sens.
Ola Friman, Peter Follo, Jörgen Ahlberg, Stefan Sjokvist
2013 J jnl
Medical Image Anal.
Catalina Tobon-Gomez, Mathieu De Craene, Kristin McLeod, Lennart Tautz, Wenzhe Shi, Anja Hennemuth, Adityo Prakosa, H. Wang, Gerry Carr-White, Stam Kapetanakis, Anja Lutz, Volker Rasche, Tobias Schaeffter, Constantine Butakoff, Ola Friman, Tommaso Mansi, Maxime Sermesant, Xiahai Zhuang, Sébastien Ourselin, Heinz-Otto Peitgen, Xavier Pennec, Reza Razavi, Daniel Rueckert, Alejandro F. Frangi, Kawal S. Rhode
2013 Misc conf
ICASSP
Maria Axelsson, Ola Friman, Ida Johansson, Markus Nordberg, Henric Östmark
2012 conf
STACOM
Anja Hennemuth, Ola Friman, Markus Hüllebrand, Heinz-Otto Peitgen
2011 B conf
ICIP
Anders Eklund, Ola Friman, Mats T. Andersson, Hans Knutsson
2011 conf
Bildverarbeitung für die Medizin
Lennart Tautz, Ola Friman, Anja Hennemuth, Achim Seeger, Heinz-Otto Peitgen
2011 conf
MICCAI (1)
Michael Schwenke, Anja Hennemuth, Bernd Fischer, Ola Friman
2011 conf
Bildverarbeitung für die Medizin
Michael Schwenke, Anja Hennemuth, Bernd Fischer, Ola Friman
2011 conf
ISBI
Lei Wang, Michael Kohnen, Ola Friman, Horst K. Hahn
2011 conf
Image-Guided Procedures
Anja Hennemuth, Ola Friman, Christian Schumann, J. Bock, Johann Drexl, Markus Hüllebrand, Michael Markl, Heinz-Otto Peitgen
2011 conf
Computer-Aided Diagnosis
Lei Wang, Konstantinos Filippatos, Ola Friman, Horst K. Hahn
2011 J jnl
Medical Image Anal.
Ola Friman, Anja Hennemuth, Andreas Harloff, Jelena Bock, Michael Markl, Heinz-Otto Peitgen
2011 conf
Bildverarbeitung für die Medizin
Markus Hüllebrand, Anja Hennemuth, Daniel Messroghli, Titus Kühne, Ola Friman
2011 conf
Bildverarbeitung für die Medizin
Rocco Gasteiger, Gábor Janiga, Daniel Stucht, Anja Hennemuth, Ola Friman, Oliver Speck, Michael Markl, Bernhard Preim
2010 conf
ISBI
Bianca Lassen, Jan-Martin Kuhnigk, Ola Friman, Stefan Krass, Heinz-Otto Peitgen
2010 J jnl
Medical Image Anal.
Ola Friman, Milo Hindennach, Caroline Kühnel, Heinz-Otto Peitgen
2010 conf
WBIR
Dong Ping Zhang, Laurent Risser, Ola Friman, Coert Metz, Lisan Neefjes, Nico Mollet, Wiro J. Niessen, Daniel Rueckert
2010 conf
ISBI
Lennart Tautz, Anja Hennemuth, Mats T. Andersson, Achim Seeger, Hans Knutsson, Ola Friman
2010 conf
MICCAI (3)
Ola Friman, Anja Hennemuth, Andreas Harloff, Jelena Bock, Michael Markl, Heinz-Otto Peitgen
2010 B conf
Image Processing
Jan Klein, Adrian Grötsch, Daniel Betz, Sebastiano Barbieri, Ola Friman, Bram Stieltjes, Helmut Hildebrandt, Horst K. Hahn
2009 J jnl
Medical Image Anal.
Michiel Schaap, Coert Metz, Theo van Walsum, Alina G. van der Giessen, Annick C. Weustink, Nico Mollet, Christian Bauer, Hrvoje Bogunovic, Carlos Castro-Gonzalez, Xiang Deng, Engin Dikici, Thomas O'Donnell, Michel Frenay, Ola Friman, Marcela Hernández Hoyos, Pieter H. Kitslaar, Karl Krissian, Caroline Kühnel, Miguel A. Luengo-Oroz, Maciej Orkisz, Örjan Smedby, Martin Styner, Andrzej Szymczak, Hüseyin Tek, Chunliang Wang, Simon K. Warfield, Sebastian Zambal, Yong Zhang, Gabriel P. Krestin, Wiro J. Niessen
2009 conf
GI Jahrestagung
Anja Hennemuth, Andreas Harloff, Timo Spehl, Nikolay Pavlov, Ola Friman, Dominik Paul, Dominik von Elverfeldt, Caroline Kühnel, Stefan Wirtz, Heike Goebel, Julia Mannheim, Horst K. Hahn, Bernd J. Pichler, Jürgen Hennig, Michael Markl
2009 J jnl
Comput. Graph.
Jan Klein, Ola Friman, Markus Hadwiger, Bernhard Preim, Felix Ritter, Anna Vilanova, Gabriel Zachmann, Dirk Bartz
2008 J jnl
IEEE Trans. Medical Imaging
Anja Hennemuth, Achim Seeger, Ola Friman, Stephan Miller, Bernhard Klumpp, Steffen Oeltze, Heinz-Otto Peitgen
2008 conf
Eurographics (State of the Art Reports)
Jan Klein, Dirk Bartz, Ola Friman, Markus Hadwiger, Bernhard Preim, Felix Ritter, Anna Vilanova, Gabriel Zachmann
2008 conf
ISBI
Ola Friman, Milo Hindennach, Heinz-Otto Peitgen
2007 J jnl
IEEE Trans. Biomed. Eng.
Ola Friman, Ivan Volosyak, Axel Gräser
2006 J jnl
IEEE Trans. Medical Imaging
Ola Friman, Gunnar Farnebäck, Carl-Fredrik Westin
2005 J jnl
NeuroImage
Ola Friman, Carl-Fredrik Westin
2005 A conf
MICCAI
Ola Friman, Carl-Fredrik Westin
2004 conf
MICCAI (2)
Ola Friman, Carl-Fredrik Westin
2004 J jnl
NeuroImage
Ola Friman, Magnus Borga, Peter Lundberg, Hans Knutsson
2004 conf
ISBI
Ola Friman
2003 J jnl
NeuroImage
Ola Friman, Magnus Borga, Peter Lundberg, Hans Knutsson
2002 J jnl
NeuroImage
Ola Friman, Magnus Borga, Peter Lundberg, Hans Knutsson
2002 J jnl
NeuroImage
Ola Friman, Magnus Borga, Peter Lundberg, Hans Knutsson
2002 conf
ICPR (1)
Ola Friman, Magnus Borga, Mikael Lundberg, Ulf Tylén, Hans Knutsson
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