Oliver P. Waldhorst

58 papers A* 1A 2B 7C 3Misc 1Journal 18Unranked 22
YearRankTypeTitle / Venue / Authors
2025 J jnl
IEEE Access
Reza Poorzare, Dimitris N. Kanellopoulos, Varun Kumar Sharma, Poulami Dalapati, Oliver P. Waldhorst
2024 C conf
IPCCC
David Monschein, Oliver P. Waldhorst
2024 B conf
NSS
David Monschein, Oliver P. Waldhorst
2023 C conf
IPCCC
Reza Poorzare, Oliver P. Waldhorst
2023 conf
NoF
Reza Poorzare, Oliver P. Waldhorst
2023 B conf
LCN
Michael König, Oliver P. Waldhorst, Martina Zitterbart
2023 B conf
LCN
Pia Baumstark, David Monschein, Oliver P. Waldhorst
2023 J jnl
IEEE Access
Reza Poorzare, Oliver P. Waldhorst
2022 ed.
ESOCC Workshops
Christian Zirpins, Guadalupe Ortiz, Zoltán Nochta, Oliver P. Waldhorst, Jacopo Soldani, Massimo Villari, Damian A. Tamburri
2022 J jnl
Electron. Commun. Eur. Assoc. Softw. Sci. Technol.
David Monschein, Oliver P. Waldhorst
2022 J jnl
CoRR
David Monschein, Oliver P. Waldhorst
2021 B conf
LCN
David Monschein, Oliver P. Waldhorst
2021 C conf
ISCC
David Monschein, José Antonio Peregrina Pérez, Tim Piotrowski, Zoltán Nochta, Oliver P. Waldhorst, Christian Zirpins
2014 Misc conf
ICNC
Christoph Werle, Oliver P. Waldhorst
2014 J jnl
Comput. Commun.
Christoph P. Mayer, Oliver P. Waldhorst
2013 conf
FGCT
Christoph Werle, Oliver P. Waldhorst
2012 J jnl
Peer-to-Peer Netw. Appl.
Christian Hübsch, Oliver P. Waldhorst, Mario Hock
2012 J jnl
Comput. Networks
Jochen Wolfgang Furthmüller, Oliver P. Waldhorst
2012 conf
ICC
Jochen Wolfgang Furthmüller, Oliver P. Waldhorst
2011 conf
KiVS
Holger Teske, Jochen Wolfgang Furthmüller, Oliver P. Waldhorst
2011 conf
GLOBECOM Workshops
Christian Hübsch, Oliver P. Waldhorst
2011 conf
Peer-to-Peer Computing
Sebastian Mies, Oliver P. Waldhorst
2011 J jnl
Comput. Commun.
Lars Völker, Marcel Noe, Oliver P. Waldhorst, Christoph Werle, Christoph Sorge
2011 conf
ICON
Christian Hübsch, Oliver P. Waldhorst
2011 conf
Wireless Days
Christoph P. Mayer, Oliver P. Waldhorst
2011 J jnl
Prax. Inf.verarb. Kommun.
Roland Bless, Christian Hübsch, Christoph P. Mayer, Sebastian Mies, Oliver P. Waldhorst, Martina Zitterbart
2010 J jnl
J. Intell. Manuf.
Michael Conrad, Christian Funk, Oliver Raabe, Oliver P. Waldhorst
2010 B conf
ICCCN
Oliver P. Waldhorst
2010 conf
EUNICE
Christian Hübsch, Christoph P. Mayer, Oliver P. Waldhorst
2010 J jnl
Inform. Spektrum
Oliver P. Waldhorst, Roland Bless, Martina Zitterbart
2010 J jnl
Comput. Commun. Rev.
Christian Hübsch, Christoph P. Mayer, Sebastian Mies, Roland Bless, Oliver P. Waldhorst, Martina Zitterbart
2010 J jnl
Prax. Inf.verarb. Kommun.
Christian Hübsch, Christoph P. Mayer, Oliver P. Waldhorst
2010 conf
KIT-Nachwuchswissenschaftler-Symposium
Oliver P. Waldhorst
2010 conf
MMB/DFT
Christian Hübsch, Christoph P. Mayer, Oliver P. Waldhorst
2009 B conf
Networking
Jochen Dinger, Oliver P. Waldhorst
2009 conf
KiVS
Christian Hübsch, Oliver P. Waldhorst
2009 J jnl
Electron. Commun. Eur. Assoc. Softw. Sci. Technol.
Jochen Wolfgang Furthmüller, Mario Pink, Hannes Hartenstein, Oliver P. Waldhorst
2008 J jnl
Prax. Inf.verarb. Kommun.
Jochen Dinger, Konrad Jünemann, Oliver P. Waldhorst, Michael Conrad
2008 J jnl
it Inf. Technol.
Oliver P. Waldhorst, Christian Blankenhorn, Dirk Haage, Ralph Holz, Gerald G. Koch, Boris Koldehofe, Fleming Lampi, Christoph P. Mayer, Sebastian Mies
2007 conf
Virtual Enterprises and Collaborative Networks
Michael Conrad, Christian Funk, Oliver Raabe, Oliver P. Waldhorst
2006 B conf
SECON
Christoph Lindemann, Oliver P. Waldhorst
2006 J jnl
Inform. Spektrum
Christoph Lindemann, Oliver P. Waldhorst
2005
Oliver P. Waldhorst
2005 ch.
Ausgezeichnete Informatikdissertationen
Oliver P. Waldhorst
2005 ch.
Peer-to-Peer Systems and Applications
Christoph Lindemann, Oliver P. Waldhorst
2005 conf
KiVS
Christoph Lindemann, Oliver P. Waldhorst
2005 A* conf
SIGMETRICS
Christoph Lindemann, Oliver P. Waldhorst
2004 A conf
Internet Measurement Conference
Alexander Klemm, Christoph Lindemann, Mary K. Vernon, Oliver P. Waldhorst
2004 J jnl
ACM SIGMOBILE Mob. Comput. Commun. Rev.
Christoph Lindemann, Oliver P. Waldhorst
2004 conf
MMB
Alexander Klemm, Christoph Lindemann, Oliver P. Waldhorst
2003 conf
MobiDE
Christoph Lindemann, Oliver P. Waldhorst
2003 conf
MASCOTS Tutorials
Alexander Klemm, Christoph Lindemann, Oliver P. Waldhorst
2002 conf
Peer-to-Peer Computing
Christoph Lindemann, Oliver P. Waldhorst
2002 conf
WMAN
Christoph Lindemann, Oliver P. Waldhorst
2002 A conf
DSN
Christoph Lindemann, Oliver P. Waldhorst
2002 conf
Workshop on Software and Performance
Christoph Lindemann, Axel Thümmler, Alexander Klemm, Marco Lohmann, Oliver P. Waldhorst
2001 conf
DFN Arbeitstagung über Kommunikationsnetze
Christoph Lindemann, Oliver P. Waldhorst
2000 conf
Workshop on Software and Performance
Christoph Lindemann, Axel Thümmler, Alexander Klemm, Marco Lohmann, Oliver P. Waldhorst
redb/extractors/decompiler/bninja/analysis/cfg.py
← Index redb/extractors/decompiler/bninja/analysis/cfg.py python
from binaryninja.enums import LowLevelILOperation as LLIL_OP

# Support both package and standalone imports
try:
    from . import cfg_features
except ImportError:
    from redb.extractors.decompiler.bninja.analysis import cfg_features


# ---------------------------------------------------------------------------
# Task 2.2: Build LLIL operation maps at import time using real enum values
# ---------------------------------------------------------------------------

# Prime product map: LLIL operation integer value -> small prime
cfg_features.LLIL_OP_PRIMES = {
    # SET_REG, SET_REG_SPLIT
    LLIL_OP.LLIL_SET_REG.value: 2,
    LLIL_OP.LLIL_SET_REG_SPLIT.value: 2,
    # SET_FLAG
    LLIL_OP.LLIL_SET_FLAG.value: 3,
    # LOAD
    LLIL_OP.LLIL_LOAD.value: 5,
    # STORE
    LLIL_OP.LLIL_STORE.value: 7,
    # PUSH, POP
    LLIL_OP.LLIL_PUSH.value: 11,
    LLIL_OP.LLIL_POP.value: 13,
    # CALL, TAILCALL, SYSCALL
    LLIL_OP.LLIL_CALL.value: 17,
    LLIL_OP.LLIL_TAILCALL.value: 17,
    LLIL_OP.LLIL_SYSCALL.value: 19,
    # RET, NORET
    LLIL_OP.LLIL_RET.value: 23,
    LLIL_OP.LLIL_NORET.value: 23,
    # IF, GOTO
    LLIL_OP.LLIL_IF.value: 29,
    LLIL_OP.LLIL_GOTO.value: 31,
    # ADD, SUB
    LLIL_OP.LLIL_ADD.value: 37,
    LLIL_OP.LLIL_SUB.value: 41,
    # AND, OR, XOR
    LLIL_OP.LLIL_AND.value: 43,
    LLIL_OP.LLIL_OR.value: 47,
    LLIL_OP.LLIL_XOR.value: 53,
    # LSL, LSR, ASR, ROL, ROR
    LLIL_OP.LLIL_LSL.value: 59,
    LLIL_OP.LLIL_LSR.value: 61,
    LLIL_OP.LLIL_ASR.value: 67,
    LLIL_OP.LLIL_ROL.value: 71,
    LLIL_OP.LLIL_ROR.value: 73,
    # MUL, DIVU, DIVS, MODU, MODS
    LLIL_OP.LLIL_MUL.value: 79,
    LLIL_OP.LLIL_DIVU.value: 83,
    LLIL_OP.LLIL_DIVS.value: 83,
    LLIL_OP.LLIL_MODU.value: 89,
    LLIL_OP.LLIL_MODS.value: 89,
    # NEG, NOT
    LLIL_OP.LLIL_NEG.value: 97,
    LLIL_OP.LLIL_NOT.value: 101,
    # CMP_E, CMP_NE, CMP_SLT, CMP_ULT, CMP_SLE, CMP_ULE
    # CMP_SGT, CMP_UGT, CMP_SGE, CMP_UGE
    LLIL_OP.LLIL_CMP_E.value: 103,
    LLIL_OP.LLIL_CMP_NE.value: 103,
    LLIL_OP.LLIL_CMP_SLT.value: 107,
    LLIL_OP.LLIL_CMP_ULT.value: 107,
    LLIL_OP.LLIL_CMP_SLE.value: 109,
    LLIL_OP.LLIL_CMP_ULE.value: 109,
    LLIL_OP.LLIL_CMP_SGT.value: 113,
    LLIL_OP.LLIL_CMP_UGT.value: 113,
    LLIL_OP.LLIL_CMP_SGE.value: 127,
    LLIL_OP.LLIL_CMP_UGE.value: 127,
    # NOP
    LLIL_OP.LLIL_NOP.value: 1,
    # SX, ZX, LOW_PART, BOOL_TO_INT
    LLIL_OP.LLIL_SX.value: 131,
    LLIL_OP.LLIL_ZX.value: 137,
    LLIL_OP.LLIL_LOW_PART.value: 139,
    LLIL_OP.LLIL_BOOL_TO_INT.value: 149,
    # JUMP, JUMP_TO
    LLIL_OP.LLIL_JUMP.value: 151,
    LLIL_OP.LLIL_JUMP_TO.value: 151,
}

# Category map: LLIL operation integer value -> category index
_ARITHMETIC = {
    LLIL_OP.LLIL_ADD, LLIL_OP.LLIL_ADC, LLIL_OP.LLIL_SUB, LLIL_OP.LLIL_SBB,
    LLIL_OP.LLIL_MUL, LLIL_OP.LLIL_MULU_DP, LLIL_OP.LLIL_MULS_DP,
    LLIL_OP.LLIL_DIVU, LLIL_OP.LLIL_DIVU_DP, LLIL_OP.LLIL_DIVS,
    LLIL_OP.LLIL_DIVS_DP, LLIL_OP.LLIL_MODU, LLIL_OP.LLIL_MODS,
    LLIL_OP.LLIL_NEG,
}
_LOGIC = {
    LLIL_OP.LLIL_AND, LLIL_OP.LLIL_OR, LLIL_OP.LLIL_XOR, LLIL_OP.LLIL_NOT,
    LLIL_OP.LLIL_LSL, LLIL_OP.LLIL_LSR, LLIL_OP.LLIL_ASR,
    LLIL_OP.LLIL_ROL, LLIL_OP.LLIL_RLC, LLIL_OP.LLIL_ROR, LLIL_OP.LLIL_RRC,
}
_TRANSFER = {
    LLIL_OP.LLIL_SET_REG, LLIL_OP.LLIL_SET_REG_SPLIT, LLIL_OP.LLIL_SET_FLAG,
    LLIL_OP.LLIL_GOTO, LLIL_OP.LLIL_IF, LLIL_OP.LLIL_JUMP, LLIL_OP.LLIL_JUMP_TO,
    LLIL_OP.LLIL_RET, LLIL_OP.LLIL_NORET, LLIL_OP.LLIL_PUSH, LLIL_OP.LLIL_POP,
}
_CALL = {
    LLIL_OP.LLIL_CALL, LLIL_OP.LLIL_TAILCALL, LLIL_OP.LLIL_SYSCALL,
}
_COMPARISON = {
    LLIL_OP.LLIL_CMP_E, LLIL_OP.LLIL_CMP_NE,
    LLIL_OP.LLIL_CMP_SLT, LLIL_OP.LLIL_CMP_ULT,
    LLIL_OP.LLIL_CMP_SLE, LLIL_OP.LLIL_CMP_ULE,
    LLIL_OP.LLIL_CMP_SGE, LLIL_OP.LLIL_CMP_UGE,
    LLIL_OP.LLIL_CMP_SGT, LLIL_OP.LLIL_CMP_UGT,
    LLIL_OP.LLIL_TEST_BIT, LLIL_OP.LLIL_FLAG_COND,
}
_MEMORY = {
    LLIL_OP.LLIL_LOAD, LLIL_OP.LLIL_STORE,
}

cfg_features.LLIL_OP_CATEGORIES = {}
for _op in _ARITHMETIC:
    cfg_features.LLIL_OP_CATEGORIES[_op.value] = cfg_features.CAT_ARITHMETIC
for _op in _LOGIC:
    cfg_features.LLIL_OP_CATEGORIES[_op.value] = cfg_features.CAT_LOGIC
for _op in _TRANSFER:
    cfg_features.LLIL_OP_CATEGORIES[_op.value] = cfg_features.CAT_TRANSFER
for _op in _CALL:
    cfg_features.LLIL_OP_CATEGORIES[_op.value] = cfg_features.CAT_CALL
for _op in _COMPARISON:
    cfg_features.LLIL_OP_CATEGORIES[_op.value] = cfg_features.CAT_COMPARISON
for _op in _MEMORY:
    cfg_features.LLIL_OP_CATEGORIES[_op.value] = cfg_features.CAT_MEMORY

# Set of CALL operation values for counting
_CALL_OPS = {op.value for op in _CALL}


# ---------------------------------------------------------------------------
# Task 2.1 + 2.3: Rewritten CFGAnalysis
# ---------------------------------------------------------------------------

class CFGAnalysis:
    def __init__(self, function, llil_function=None):
        self.function = function
        self.llil_function = llil_function

    def extract_function_cfg(self):
        """Extract function-level CFG features as a flat dictionary."""

        if self.function is None:
            return None

        blocks = list(self.function.basic_blocks)
        if not blocks:
            return None

        n = len(blocks)

        # 1. Build index-based adjacency from Binary Ninja blocks
        addr_to_idx = {b.start: i for i, b in enumerate(blocks)}
        successors = [[] for _ in range(n)]
        predecessors = [[] for _ in range(n)]
        for i, block in enumerate(blocks):
            for edge in block.outgoing_edges:
                if edge.target is None:
                    continue
                target_idx = addr_to_idx.get(edge.target.start)
                if target_idx is not None:
                    successors[i].append(target_idx)
                    predecessors[target_idx].append(i)

        # 2. BFS order (reusable across multiple features)
        bfs = cfg_features.bfs_order(successors, n)

        # 3. Collect per-block LLIL operations (for prime product + ACFG features)
        block_llil_ops = self._collect_block_llil_ops(blocks, addr_to_idx, n)
        all_llil_ops = [op for block_ops in block_llil_ops for op in block_ops]

        # 4. Structural counts
        edge_count = sum(len(s) for s in successors)
        total_llil = sum(len(ops) for ops in block_llil_ops)
        call_count = sum(
            1 for ops in block_llil_ops for op in ops
            if op in _CALL_OPS
        )

        # 5. Compute all features
        bb_features = cfg_features.build_block_features(block_llil_ops, successors, n)

        return {
            "cfg_topology_hash": cfg_features.compute_topology_hash(successors, bfs, n),
            "block_count": n,
            "edge_count": edge_count,
            "llil_total_operations": total_llil,
            "call_count": call_count,
            "cyclomatic_complexity": edge_count - n + 2,
            "loop_count": cfg_features.count_back_edges(successors, n),
            "max_depth": cfg_features.bfs_max_depth(successors, n),
            "max_fan_out": max((len(s) for s in successors), default=0),
            "md_index_topdown": cfg_features.compute_md_index_topdown(successors, predecessors, bfs),
            "md_index_bottomup": cfg_features.compute_md_index_bottomup(successors, predecessors, n),
            "prime_product_llil": cfg_features.compute_prime_product(all_llil_ops),
            "cfg_feature_tlsh": cfg_features.compute_cfg_feature_tlsh(bb_features, bfs),
            "wl_minhash": cfg_features.compute_wl_minhash(successors, predecessors, bb_features, n),
            "bb_features": bb_features,
            "cfg_adjacency": cfg_features.pack_adjacency(successors),
        }

    def _collect_block_llil_ops(self, blocks, addr_to_idx, n):
        """
        Collect LLIL operation integers per native basic block.
        Walks the full expression tree of each instruction so that
        nested operations (e.g. ADD inside SET_REG) are captured.
        Returns list of n lists, one per block.
        """
        block_ops = [[] for _ in range(n)]

        if self.llil_function is None:
            return block_ops

        try:
            for llil_block in self.llil_function.basic_blocks:
                # Map LLIL block to native block via source_block
                if llil_block.source_block is not None:
                    native_idx = addr_to_idx.get(llil_block.source_block.start)
                    if native_idx is not None:
                        for instr in llil_block:
                            self._walk_llil_ops(instr, block_ops[native_idx])
        except Exception:
            pass  # Return empty ops — LLIL-dependent fields will be 0/null

        return block_ops

    @staticmethod
    def _walk_llil_ops(expr, ops_list):
        """Collect operation values from an LLIL expression tree iteratively."""
        stack = [expr]
        while stack:
            node = stack.pop()
            if hasattr(node, 'operation'):
                ops_list.append(node.operation.value)
            if hasattr(node, 'operands'):
                for operand in node.operands:
                    if hasattr(operand, 'operation'):
                        stack.append(operand)