Ioannis Basdekis

17 papers B 1C 1Misc 1Journal 6Unranked 8
YearRankTypeTitle / Venue / Authors
2024 J jnl
Int. J. Inf. Sec.
Michail Smyrlis, Evangelos Floros, Ioannis Basdekis, Dumitru-Bogdan Prelipcean, Aristeidis Sotiropoulos, Hervé Debar, Apostolis Zarras, George Spanoudakis
2023 conf
DRCN
Ioannis Basdekis, Christos Kloukinas, Carlos Agostinho, Ioannis Vezakis, Andreia Pimenta, Luigi Gallo, George Spanoudakis
2023 J jnl
CoRR
Konstantinos Lampropoulos, Apostolis Zarras, Eftychia Lakka, Polyanthi Barmpaki, Kostas Drakonakis, Manos Athanatos, Hervé Debar, Andreas Alexopoulos, Aristeidis Sotiropoulos, George Tsakirakis, Nikos Dimakopoulos, Dimitris Tsolovos, Matthias Pocs, Michalis Smyrlis, Ioannis Basdekis, Georgios Spanoudakis, Ovidiu Mihaila, Bogdan Prelipcean, Eliot Salant, Sotiris Athanassopoulos, Petros Papachristou, Ioannis Ladakis, John Chang, Evangelos Floros, Konstantinos Smyrlis, Rouven Besters, Pietro Randine, Karianna Fjeld Lovaas, John Cooper, Iulia Ilie, Gabriel Mihail Danciu, Marwan Darwish Khabbaz
2022 J jnl
IEEE J. Biomed. Health Informatics
Marios Prasinos, Ioannis Basdekis, Marco Anisetti, George Spanoudakis, Dimitrios D. Koutsouris, Ernesto Damiani
2022 J jnl
Complex Intell. Syst.
Valerio Bellandi, Paolo Ceravolo, Ernesto Damiani, Samira Maghool, Matteo Cesari, Ioannis Basdekis, Eleftheria Iliadou, Mircea Dan Marzan
2022 conf
I-ESA Workshops
Carlos Agostinho, Andreia Pimenta, Maria Marques, Kostas M. Tsiouris, Fanis Kalatzis, Christos Nikitas, Eleftheria Iliadou, Mattia Occhipinti, Ioannis N. Kouris, Dimitrios D. Koutsouris, Ioannis Basdekis, Konstantina Koloutsou, Luigi Gallo, Giueppe De Pietro, Ricardo Jardim-Gonçalves
2022 C conf
ICT4AWE
Vadim Peretokin, Ioannis Basdekis, Ioannis N. Kouris, Jonatan Maggesi, Mario Sicuranza, Qiqi Su, Alberto Acebes, Anca Bucur, Vinod Jaswanth Roy Mukkala, Konstantin Pozdniakov, Christos Kloukinas, Dimitrios D. Koutsouris, Eleftheria Iliadou, Ioannis Leontsinis, Luigi Gallo, Giuseppe De Pietro, George Spanoudakis
2022 conf
ICT4AWE (Revised Selected Papers)
Qiqi Su, Vadim Peretokin, Ioannis Basdekis, Ioannis N. Kouris, Jonatan Maggesi, Mario Sicuranza, Alberto Acebes, Anca Bucur, Vinod Jaswanth Roy Mukkala, Konstantin Pozdniakov, Christos Kloukinas, Dimitrios D. Koutsouris, Eleftheria Iliadou, Ioannis Leontsinis, Luigi Gallo, Giuseppe De Pietro, George Spanoudakis
2021 conf
ICDH
Valerio Bellandi, Ioannis Basdekis, Paolo Ceravolo, Matteo Cesari, Ernesto Damiani, Eleftheria Iliadou, Mircea Dan Marzan, Samira Maghool
2019 B conf
SERVICES
Ioannis Basdekis, Konstantin Pozdniakov, Marios Prasinos, Konstantina Koloutsou
2018 conf
BHI
Bin Ye, Ioannis Basdekis, Michail Smyrlis, George Spanoudakis, Konstantina Koloutsou
2016 Misc conf
PACBB
Giorgos Athineou, Giorgos Papoutsoglou, Sofia Triantafillou, Ioannis Basdekis, Vincenzo Lagani, Ioannis Tsamardinos
2011 conf
MobiHealth
Ioannis Basdekis, Vangelis Sakkalis, Constantine Stephanidis
2010 J jnl
Univers. Access Inf. Soc.
Ioannis Basdekis, Iosif Klironomos, Ioannis Metaxas, Constantine Stephanidis
2009 conf
HCI (6)
Ioannis Basdekis, Panagiotis Karampelas, Voula Doulgeraki, Constantine Stephanidis
2009 conf
HCI (5)
Panagiotis Karampelas, Ioannis Basdekis, Constantine Stephanidis
2006 J jnl
Univers. Access Inf. Soc.
Iosif Klironomos, Margherita Antona, Ioannis Basdekis, Constantine Stephanidis
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