Imene Trigui

42 papers B 13Journal 22Unranked 7
YearRankTypeTitle / Venue / Authors
2024 J jnl
CoRR
Khaled Humadi, Imene Trigui, Wei-Ping Zhu, Wessam Ajib
2022 J jnl
IEEE Commun. Lett.
Liang Yang, Pinhui Li, Yin Yang, Sai Li, Imene Trigui, Rongchang Ma
2021 J jnl
CoRR
Imene Trigui, Edouard Komi Agbogla, Mustapha Benjillali, Wessam Ajib, Wei-Ping Zhu
2021 J jnl
IEEE Wirel. Commun. Lett.
Liang Yang, Yin Yang, Daniel Benevides da Costa, Imene Trigui
2021 J jnl
Comput. Commun.
Manlin Fang, Dong Li, Han Zhang, Lisheng Fan, Imene Trigui
2020 J jnl
CoRR
Liang Yang, Yin Yang, Daniel Benevides da Costa, Imene Trigui
2020 J jnl
CoRR
Liang Yang, Yin Yang, Daniel Benevides da Costa, Imene Trigui
2020 J jnl
CoRR
Imene Trigui, Wessam Ajib, Wei-Ping Zhu, Marco Di Renzo
2019 J jnl
CoRR
Imene Trigui, Panagiotis D. Diamantoulakis, Sofiène Affes, George K. Karagiannidis
2019 J jnl
IEEE Trans. Commun.
Imene Trigui, Sofiène Affes
2018 J jnl
CoRR
Imene Trigui, Sofiène Affes
2017 B conf
PIMRC
Nesrine Cherif, Imene Trigui, Sofiène Affes
2017 B conf
PIMRC
Imene Trigui, Ben Liang, Sofiène Affes
2017 B conf
PIMRC
Imene Trigui, Nesrine Cherif, Sofiène Affes, Xianbin Wang, Victor C. M. Leung, Alex Stephenne
2017 conf
SPAWC
Nesrine Cherif, Imene Trigui, Sofiène Affes
2017 J jnl
IEEE Wirel. Commun. Lett.
Imene Trigui, Nesrine Cherif, Sofiène Affes
2017 J jnl
IEEE Trans. Commun.
Imene Trigui, Sofiène Affes, Ben Liang
2017 B conf
PIMRC
Imene Trigui, Sofiène Affes, Ben Liang
2016 J jnl
IEEE Trans. Commun.
Imene Trigui, Sofiène Affes, Alex Stephenne
2016 B conf
WCNC
Imene Trigui, Sofiène Affes, Alex Stephenne
2016 J jnl
CoRR
Imene Trigui, Sofiène Affes, Ben Liang
2015 J jnl
IEEE Wirel. Commun. Lett.
Imene Trigui, Sofiène Affes, Alex Stephenne
2015 conf
ICC
Imene Trigui, Sofiène Affes, Alex Stephenne
2015 conf
ICC
Imene Trigui, Imen Mechmeche, Sofiène Affes, Alex Stephenne
2015 conf
ICUWB
Imene Trigui, Imen Mechmeche, Sofiène Affes, Alex Stephenne
2014 B conf
WCNC
Imene Trigui, Sofiène Affes, Alex Stephenne
2014 J jnl
IEEE Wirel. Commun. Lett.
Imene Trigui, Imen Mechmeche, Sofiène Affes, Alex Stephenne
2014 B conf
WCNC
Imene Trigui, Sofiène Affes, Alex Stephenne
2013 J jnl
IEEE Trans. Commun.
Imene Trigui, Sofiène Affes, Alex Stephenne
2013 J jnl
IEEE Trans. Commun.
Imene Trigui, Sofiène Affes, Alex Stephenne
2012 conf
VTC Fall
Imene Trigui, Sofiène Affes, Alex Stephenne
2012 J jnl
IEEE Trans. Commun.
Imene Trigui, Amine Laourine, Sofiène Affes, Alex Stephenne
2011 J jnl
IEEE Trans. Commun.
Imene Trigui, Sofiène Affes, Alex Stephenne
2010 B conf
GLOBECOM
Imene Trigui, Sofiène Affes, Alex Stephenne
2010 B conf
WCNC
Imene Trigui, Sofiène Affes, Alex Stephenne
2010 conf
VTC Fall
Imene Trigui, Sofiène Affes, Alex Stephenne
2009 B conf
GLOBECOM
Imene Trigui, Amine Laourine, Sofiène Affes, Alex Stephenne
2009 B conf
WCNC
Imene Trigui, Amine Laourine, Sofiène Affes, Alex Stephenne
2009 J jnl
IEEE Trans. Wirel. Commun.
Imene Trigui, Amine Laourine, Sofiène Affes, Alex Stephenne
2008 B conf
GLOBECOM
Imene Trigui, Amine Laourine, Sofiène Affes, Alex Stephenne
2007 conf
ISSPA
Imene Trigui, Mohamed Siala, Hatem Boujemaa
2007 B conf
GLOBECOM
Imene Trigui, Mohamed Siala, Sofiène Affes, Alex Stephenne, Hatem Boujemaa
tests/unit/test_decompile_scores.py
← Index tests/unit/test_decompile_scores.py python
"""Unit tests for bninja/analysis/scores.py — ObfuscationScores."""
import sys
import pytest
from unittest.mock import MagicMock

# Install binaryninja stubs before importing
from tests.unit.conftest_binja_stubs import (
    install_binja_stubs,
    HighLevelILOperation,
)
bn_mock = install_binja_stubs()

from redb.extractors.decompiler.bninja.analysis.scores import (
    ObfuscationScores,
    get_dominated_by,
    uses_mba,
)
import binaryninja.highlevelil as hlil_mod


# ============================================================================
# Helper: Mock HLIL instruction
# ============================================================================

class MockHLILInstruction(hlil_mod.HighLevelILInstruction):
    """Mock HLIL instruction with operation and operands."""
    def __init__(self, operation, operands=None):
        self.operation = operation
        self.operands = operands or []


class MockHLILBasicBlock:
    """Mock HLIL basic block for flattened score testing."""
    def __init__(self, incoming_edges=None, dominator_tree_children=None):
        self.incoming_edges = incoming_edges or []
        self.dominator_tree_children = dominator_tree_children or []


# ============================================================================
# 5a. ObfuscationScores
# ============================================================================


class TestFlattenedScore:
    def test_flattened_score_no_back_edges(self):
        """Linear CFG with no back edges -> score 0.0."""
        block = MockHLILBasicBlock(incoming_edges=[], dominator_tree_children=[])
        func = MagicMock()
        func.basic_blocks = [block]
        scores = ObfuscationScores(func)
        assert scores.flattened_score() == 0.0

    def test_flattened_score_with_loop(self):
        """CFG with a back edge -> score > 0.0."""
        block = MockHLILBasicBlock(dominator_tree_children=[])
        # Create a back edge: an incoming edge whose source is in the dominated set
        edge = MagicMock()
        edge.source = block  # source IS the dominator -> back edge
        block.incoming_edges = [edge]
        func = MagicMock()
        func.basic_blocks = [block]
        scores = ObfuscationScores(func)
        assert scores.flattened_score() > 0.0

    def test_flattened_score_fully_flat(self):
        """Flattened CFG: one block dominates all -> ratio close to 1.0."""
        children = [MockHLILBasicBlock() for _ in range(4)]
        root = MockHLILBasicBlock(dominator_tree_children=children)
        # Back edge from root incoming
        edge = MagicMock()
        edge.source = root
        root.incoming_edges = [edge]
        all_blocks = [root] + children
        func = MagicMock()
        func.basic_blocks = all_blocks
        scores = ObfuscationScores(func)
        assert scores.flattened_score() == pytest.approx(1.0)


class TestMBAScore:
    def test_mba_score_no_mixed_ops(self):
        """Instructions with only arithmetic -> score 0.0."""
        instr = MockHLILInstruction(HighLevelILOperation.HLIL_ADD, operands=[])
        func = MagicMock()
        func.instructions = [instr]
        scores = ObfuscationScores(func)
        assert scores.MBA_score() == 0.0

    def test_mba_score_mixed_ops(self):
        """Instructions with arithmetic + logic -> score > 0.0."""
        inner_logic = MockHLILInstruction(HighLevelILOperation.HLIL_XOR, operands=[])
        outer_arith = MockHLILInstruction(
            HighLevelILOperation.HLIL_ADD, operands=[inner_logic]
        )
        func = MagicMock()
        func.instructions = [outer_arith]
        scores = ObfuscationScores(func)
        assert scores.MBA_score() > 0.0

    def test_mba_score_all_mixed(self):
        """Every instruction has both -> score 1.0."""
        inner_logic = MockHLILInstruction(HighLevelILOperation.HLIL_NOT, operands=[])
        outer_arith = MockHLILInstruction(
            HighLevelILOperation.HLIL_SUB, operands=[inner_logic]
        )
        func = MagicMock()
        func.instructions = [outer_arith]
        scores = ObfuscationScores(func)
        assert scores.MBA_score() == 1.0


class TestGetDominatedBy:
    def test_get_dominated_by(self):
        child1 = MockHLILBasicBlock(dominator_tree_children=[])
        child2 = MockHLILBasicBlock(dominator_tree_children=[])
        root = MockHLILBasicBlock(dominator_tree_children=[child1, child2])
        result = get_dominated_by(root)
        assert root in result
        assert child1 in result
        assert child2 in result
        assert len(result) == 3


class TestUsesMBA:
    def test_uses_mba_arithmetic_only(self):
        instr = MockHLILInstruction(HighLevelILOperation.HLIL_ADD, operands=[])
        assert uses_mba(instr) is False

    def test_uses_mba_logic_only(self):
        instr = MockHLILInstruction(HighLevelILOperation.HLIL_XOR, operands=[])
        assert uses_mba(instr) is False

    def test_uses_mba_mixed(self):
        inner = MockHLILInstruction(HighLevelILOperation.HLIL_AND, operands=[])
        outer = MockHLILInstruction(HighLevelILOperation.HLIL_ADD, operands=[inner])
        assert uses_mba(outer) is True