Caetano Traina

31 papers B 18C 2Misc 2Journal 6Unranked 3
YearRankTypeTitle / Venue / Authors
2025 J jnl
Softw. Pract. Exp.
Igor Alberte Rodrigues Eleutério, Willian Dener de Oliveira, Larissa Roberta Teixeira, Thiago Galbiatti Vespa, William Zaniboni Silva, Agma Juci Machado Traina, Caetano Traina
2025 J jnl
Health Inf. Sci. Syst.
Márcus V. L. Costa, Erikson Júlio De Aguiar, Lucas Santiago Rodrigues, Caetano Traina, Agma J. M. Traina
2025 B conf
CBMS
Eduardo Moura, Rafael C. G. Conrado, Leonardo O. Campos, Mauro Marcel Olivatto, Marco Antonio Gutierrez, Caetano Traina, Agma J. M. Traina, Mirela T. Cazzolato
2024 B conf
CBMS
Jean R. Ponciano, Mirela T. Cazzolato, Marco Antonio Gutierrez, Caetano Traina, Agma J. M. Traina
2024 Misc conf
SAC
Igor A. R. Eleutério, Mirela T. Cazzolato, Larissa Roberta Teixeira, Marco Antonio Gutierrez, Agma Juci Machado Traina, Caetano Traina
2024 B conf
CBMS
Erikson Júlio De Aguiar, Caetano Traina, Agma J. M. Traina
2023 B conf
CBMS
Márcus V. L. Costa, Erikson Júlio De Aguiar, Lucas Santiago Rodrigues, Jonathan S. Ramos, Caetano Traina, Agma J. M. Traina
2023 B conf
CBMS
Erikson Júlio De Aguiar, Márcus V. L. Costa, Caetano Traina, Agma J. M. Traina
2023 J jnl
IEEE Trans. Vis. Comput. Graph.
Claudio D. G. Linhares, Daniel Mario de Lima, Jean R. Ponciano, Mauro M. Olivatto, Marco A. Gutierrez, Jorge Poco, Caetano Traina, Agma J. M. Traina
2023 B conf
CBMS
Mirela T. Cazzolato, Marco Antonio Gutierrez, Caetano Traina, Christos Faloutsos, Agma J. M. Traina
2022 B conf
CBMS
Jonathan S. Ramos, Erikson Júlio De Aguiar, Ivar Vargas Belizario, Márcus V. L. Costa, Jamilly G. Maciel, Mirela T. Cazzolato, Caetano Traina, Marcello H. Nogueira-Barbosa, Agma J. M. Traina
2022 conf
ICCS (4)
Lucas Santiago Rodrigues, Thiago Galbiatti Vespa, Igor A. R. Eleutério, Willian D. Oliveira, Agma J. M. Traina, Caetano Traina
2022 B conf
CBMS
Marcos V. N. Bedo, Jonathan S. Ramos, Agma J. M. Traina, Caetano Traina, Marcello H. Nogueira-Barbosa, Paulo M. Azevedo-Marques
2021 B conf
CBMS
Jonathan S. Ramos, Jamilly G. Maciel, Mirela T. Cazzolato, Caetano Traina, Marcello H. Nogueira-Barbosa, Agma J. M. Traina
2021 B conf
CBMS
Claudio D. G. Linhares, Daniel Mario de Lima, Christian C. Bones, Marina F. S. de Sá Rebelo, Marco A. Gutierrez, Caetano Traina, Agma J. M. Traina
2021 B conf
CBMS
José Maria Clementino, Bruno S. Faiçal, Christian C. Bones, Caetano Traina, Marco A. Gutierrez, Agma J. M. Traina
2021 Misc conf
SAC
Andre Moriyama, Lucas Santiago Rodrigues, Lucas C. Scabora, Mirela T. Cazzolato, Agma J. M. Traina, Caetano Traina
2020 B conf
CBMS
José Maria Clementino, Christian C. Bones, Bruno S. Faiçal, Oscar A. C. Linares, Daniel Mario de Lima, Marco A. Gutierrez, Caetano Traina, Agma J. M. Traina
2020 B conf
CBMS
Mirela T. Cazzolato, Jonathan S. Ramos, Lucas Santiago Rodrigues, Lucas C. Scabora, Daniel Y. T. Chino, Ana Elisa Serafim Jorge, Paulo Mazzoncini de Azevedo Marques, Caetano Traina, Agma J. M. Traina
2020 B conf
SISAP
Lucas Santiago Rodrigues, Mirela Teixeira Cazzolato, Agma Juci Machado Traina, Caetano Traina
2019 B conf
CBMS
Jonathan S. Ramos, Mirela T. Cazzolato, Bruno S. Faiçal, Marcello H. Nogueira-Barbosa, Caetano Traina, Agma J. M. Traina
2019 C conf
ISM
Guilherme F. Zabot, Mirela T. Cazzolato, Lucas C. Scabora, Agma J. M. Traina, Caetano Traina
2019 J jnl
IEEE J. Biomed. Health Informatics
Paulo H. Oliveira, Lucas C. Scabora, Mirela T. Cazzolato, Willian D. Oliveira, Rafael S. Paixão, Agma J. M. Traina, Caetano Traina
2019 conf
SIBGRAPI
Jonathan S. Ramos, Mirela T. Cazzolato, Bruno S. Faiçal, Oscar A. C. Linares, Marcello H. Nogueira-Barbosa, Caetano Traina, Agma J. M. Traina
2019 B conf
CBMS
Guilherme F. Zabot, Mirela T. Cazzolato, Lucas C. Scabora, Bruno S. Faiçal, Agma J. M. Traina, Caetano Traina
2018 J jnl
Data Knowl. Eng.
Joe Tekli, Richard Chbeir, Agma J. M. Traina, Caetano Traina, Kokou Yétongnon, Carlos Raymundo Ibañez, Marc Al Assad, Christian Kallas
2018 J jnl
Pattern Recognit. Lett.
Jonathan S. Ramos, Carolina Yukari Veludo Watanabe, Caetano Traina, Agma J. M. Traina
2018 B conf
CBMS
Daniel Yoshinobu Takada Chino, Lucas de Carvalho Scabora, Mirela Teixeira Cazzolato, Ana Elisa Serafim Jorge, Caetano Traina, Agma Juci Machado Traina
2018 B conf
CBMS
Marcos Roberto Nesso Junior, Mirela T. Cazzolato, Lucas C. Scabora, Paulo H. Oliveira, Gabriel Spadon, Jéssica Andressa de Souza, Willian D. Oliveira, Daniel Y. T. Chino, José F. Rodrigues Jr., Agma J. M. Traina, Caetano Traina
2018 C conf
ICCC
Joe Tekli, Richard Chbeir, Agma J. M. Traina, Caetano Traina, Kokou Yétongnon, Carlos Raymundo Ibañez, Christian Kallas
2008 conf
Computer-Aided Diagnosis
Pedro Henrique Bugatti, Agma J. M. Traina, Joaquim Cezar Felipe, Caetano Traina
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)