Hans C. van Assen

34 papers A* 1B 1C 1Misc 1Journal 8Unranked 19
YearRankTypeTitle / Venue / Authors
2016 conf
EMBC
Paul Hamelmann, Alexander F. Kolen, Lars Schmitt, Rik Vullings, Hans C. van Assen, Massimo Mischi, Libertario Demi, Judith Van Laar, Jan W. M. Bergmans
2015 conf
STACOM@MICCAI
Hanne B. Kause, Aura Hernández-Sabaté, Patricia Márquez-Valle, Andrea Fuster, Luc Florack, Hans C. van Assen, Debora Gil
2015 ed.
FIMH
Hans C. van Assen, Peter Bovendeerd, Tammo Delhaas
2014 conf
ISBI
S. Saporito, Ingeborg H. F. Herold, Patrick Houthuizen, Hendrikus H. M. Korsten, Hans C. van Assen, Massimo Mischi
2014 J jnl
Medical Biol. Eng. Comput.
Mustafa A. Elattar, E. M. Wiegerinck, R. N. Planken, Ed VanBavel, Hans C. van Assen, Jan Baan, Henk A. Marquering
2014 conf
STACOM
Patricia Márquez-Valle, Hanne B. Kause, Andrea Fuster, Aura Hernández-Sabaté, Luc Florack, Debora Gil, Hans C. van Assen
2014 J jnl
Neurocomputing
Fei Zuo, Jungong Han, Pingkun Yan, Hans C. van Assen, Kenji Suzuki
2014 conf
STACOM
Ahmad Al-Agamy, Rashed Karim, Aruna Arujuna, James L. Harrison, Steven E. Williams, Kawal S. Rhode, Hans C. van Assen
2013 conf
STACOM
Hanne B. Kause, Olena G. Filatova, Remco Duits, L. C. Mark Bruurmijn, Andrea Fuster, Jos J. M. Westenberg, Luc Florack, Hans C. van Assen
2013 conf
FIMH
L. C. Mark Bruurmijn, Hanne B. Kause, Olena G. Filatova, Remco Duits, Andrea Fuster, Luc Florack, Hans C. van Assen
2012 conf
ISBI
Andrea Fuster, Roy van Pelt, Rutger Henri Jacques Fick, Geert Claassen, Bart M. ter Haar Romeny, Hans C. van Assen, Luc Florack
2012 J jnl
J. Math. Imaging Vis.
Luc Florack, Hans C. van Assen
2011 J jnl
Int. J. Biomed. Imaging
Alessandro Becciu, Andrea Fuster, Mark Pottek, Bart van den Heuvel, Bart M. ter Haar Romeny, Hans C. van Assen
2011 conf
STACOM
Alessandro Becciu, Remco Duits, Bart J. Janssen, Luc Florack, Hans C. van Assen
2011 Misc conf
IMVIP
Carla Gil, Adrianus J. Bakermans, Baastian J. van Nierop, Gustav J. Strijkers, Hans C. van Assen, Kathleen M. Curran
2010 J jnl
Int. J. Biomed. Imaging
Luc Florack, Hans C. van Assen
2010 conf
ISBI
Marc M. J. Koppert, Peter M. J. Rongen, Mathias Prokop, Bart M. ter Haar Romeny, Hans C. van Assen
2009 conf
SSVM
Alessandro Becciu, Hans C. van Assen, Luc Florack, Sebastian Kozerke, Vivian Roode, Bart M. ter Haar Romeny
2009 C conf
CAIP
Alessandro Becciu, Bart J. Janssen, Hans C. van Assen, Luc Florack, Vivian Roode, Bart M. ter Haar Romeny
2008 J jnl
IEEE Trans. Inf. Technol. Biomed.
Hans C. van Assen, Mikhail G. Danilouchkine, M. S. Dirksen, Johan H. C. Reiber, Boudewijn P. F. Lelieveldt
2007 conf
MICCAI (2)
Edwin Bennink, Hans C. van Assen, Geert J. Streekstra, René ter Wee, Jos A. E. Spaan, Bart M. ter Haar Romeny
2007 A* conf
ICCV
Luc Florack, Hans C. van Assen, Avan Suinesiaputra
2006 ch.
Handbook of Mathematical Models in Computer Vision
B. Legeveldt, Alejandro F. Frangi, Steven C. Mitchell, Hans C. van Assen, Sebastián Ordas, Johan H. C. Reiber, Milan Sonka
2006
Hans C. van Assen
2006 conf
ISBI
Hans C. van Assen, Alejandro F. Frangi, Mikhail G. Danilouchkine, Sebastián Ordas, Jos J. M. Westenberg, Johan H. C. Reiber, Boudewijn P. F. Lelieveldt
2006 J jnl
Medical Image Anal.
Hans C. van Assen, Mikhail G. Danilouchkine, Alejandro F. Frangi, Sebastián Ordas, Jos J. M. Westenberg, Johan H. C. Reiber, Boudewijn P. F. Lelieveldt
2005 conf
MICCAI (2)
Mikhail G. Danilouchkine, Jos J. M. Westenberg, Hans C. van Assen, Johan H. C. Reiber, Boudewijn P. F. Lelieveldt
2005 conf
HealthGrid
Sebastián Ordas, Hans C. van Assen, Jesús Puente, Boudewijn P. F. Lelieveldt, Alejandro F. Frangi
2005 conf
FIMH
Hans C. van Assen, Mikhail G. Danilouchkine, Alejandro F. Frangi, Sebastián Ordas, Jos J. M. Westenberg, Johan H. C. Reiber, Boudewijn P. F. Lelieveldt
2005 conf
EGC
Sebastián Ordas, Hans C. van Assen, Loic Boisrobert, Marcos Laucelli, Jesús Puente, Boudewijn P. F. Lelieveldt, Alejandro F. Frangi
2003 conf
CARS
Emmanuelle Angelié, Patrick J. H. de Koning, Hans C. van Assen, Mikhail G. Danilouchkine, Gerhard Koning, Rob J. van der Geest, Johan H. C. Reiber
2003 conf
MICCAI (1)
Hans C. van Assen, Mikhail G. Danilouchkine, Faiza Behloul, Hildo J. Lamb, Rob J. van der Geest, Johan H. C. Reiber, Boudewijn P. F. Lelieveldt
2003 B conf
Image Processing
Hans C. van Assen, Rob J. van der Geest, Mikhail G. Danilouchkine, Hildo J. Lamb, Johan H. C. Reiber, Boudewijn P. F. Lelieveldt
2002 J jnl
IEEE Trans. Image Process.
Hans C. van Assen, Michael Egmont-Petersen, Johan H. C. Reiber
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)