Natasa Przulj

56 papers Misc 3Journal 49Unranked 2
YearRankTypeTitle / Venue / Authors
2025 J jnl
Bioinform.
Zuqi Li, Sam F. L. Windels, Noël Malod-Dognin, Seth M. Weinberg, Mary L. Marazita, Susan Walsh, Mark D. Shriver, David W. Fardo, Peter Claes, Natasa Przulj, Kristel Van Steen
2024 J jnl
Bioinform.
Sam F. L. Windels, Daniel Tello Velasco, Mikhail Rotkevich, Noël Malod-Dognin, Natasa Przulj
2024 J jnl
CoRR
Sam F. L. Windels, Noël Malod-Dognin, Natasa Przulj
2024 J jnl
CoRR
Natasa Przulj, Noël Malod-Dognin
2024 J jnl
CoRR
Alexandros Xenos, Noël Malod-Dognin, Natasa Przulj
2023 J jnl
Bioinform.
Sergio Doria-Belenguer, Alexandros Xenos, Gaia Ceddia, Noël Malod-Dognin, Natasa Przulj
2022 J jnl
J. Glob. Optim.
Rok Hribar, Timotej Hrga, Gregor Papa, Gasper Petelin, Janez Povh, Natasa Przulj, Vida Vukasinovic
2022 J jnl
Bioinform.
Sam F. L. Windels, Noël Malod-Dognin, Natasa Przulj
2021 J jnl
Bioinform.
Jose Lugo-Martinez, Daniel Zeiberg, Thomas Gaudelet, Noël Malod-Dognin, Natasa Przulj, Predrag Radivojac
2021 J jnl
Bioinform.
Alexandros Xenos, Noël Malod-Dognin, S. Milinkovic, Natasa Przulj
2021 J jnl
Bioinform.
Diego Azael Salazar, Natasa Przulj, Carlos F. Valencia
2020 J jnl
Bioinform.
Noël Malod-Dognin, Vera Pancaldi, Alfonso Valencia, Natasa Przulj
2020 J jnl
CoRR
Rok Hribar, Timotej Hrga, Gregor Papa, Gasper Petelin, Janez Povh, Natasa Przulj, Vida Vukasinovic
2020 J jnl
Bioinform.
Sergio Doria-Belenguer, Markus K. Youssef, René Böttcher, Noël Malod-Dognin, Natasa Przulj
2019 J jnl
Bioinform.
Noël Malod-Dognin, Natasa Przulj
2019 J jnl
Bioinform.
Sam F. L. Windels, Noël Malod-Dognin, Natasa Przulj
2018 J jnl
Bioinform.
Thomas Gaudelet, Noël Malod-Dognin, Natasa Przulj
2017 J jnl
J. Integr. Bioinform.
Noël Malod-Dognin, Natasa Przulj
2017 J jnl
Bioinform.
Ömer Nebil Yaveroglu, Noël Malod-Dognin, Tijana Milenkovic, Natasa Przulj
2016 J jnl
Bioinform.
Vladimir Gligorijevic, Noël Malod-Dognin, Natasa Przulj
2016 Misc conf
PSB
Vladimir Gligorijevic, Noël Malod-Dognin, Natasa Przulj
2016 J jnl
CoRR
Anida Sarajlic, Noël Malod-Dognin, Ömer Nebil Yaveroglu, Natasa Przulj
2015 J jnl
Bioinform.
Noël Malod-Dognin, Natasa Przulj
2015 J jnl
Bioinform.
Ömer Nebil Yaveroglu, Tijana Milenkovic, Natasa Przulj
2015 J jnl
Bioinform.
Darren Davis, Ömer Nebil Yaveroglu, Noël Malod-Dognin, Aleksandar Stojmirovic, Natasa Przulj
2014 J jnl
Bioinform.
Noël Malod-Dognin, Natasa Przulj
2014 J jnl
Bioinform.
Vladimir Gligorijevic, Vuk Janjic, Natasa Przulj
2014 J jnl
BMC Bioinform.
Kai Sun, Joana P. Gonçalves, Chris Larminie, Natasa Przulj
2014 J jnl
J. Integr. Bioinform.
Vuk Janjic, Natasa Przulj
2014 J jnl
CoRR
Omer Nebil Yaveroglu, Sean M. Fitzhugh, Maciej Kurant, Athina Markopoulou, Carter T. Butts, Natasa Przulj
2013 J jnl
Bioinform.
Wayne B. Hayes, Kai Sun, Natasa Przulj
2011 conf
FPT
Brahim Betkaoui, David B. Thomas, Wayne Luk, Natasa Przulj
2011 J jnl
BMC Bioinform.
Oleksii Kuchaiev, Aleksandar Stevanovic, Wayne B. Hayes, Natasa Przulj
2011 J jnl
Bioinform.
Oleksii Kuchaiev, Natasa Przulj
2011 J jnl
Internet Math.
Natasa Przulj
2010 J jnl
J. Integr. Bioinform.
Vesna Memisevic, Tijana Milenkovic, Natasa Przulj
2010 J jnl
Bioinform.
Natasa Przulj
2010 J jnl
J. Integr. Bioinform.
Vesna Memisevic, Tijana Milenkovic, Natasa Przulj
2010 ch.
Network Science
Natasa Przulj
2010 Misc conf
Pacific Symposium on Biocomputing
Natasa Przulj, Oleksii Kuchaiev, Aleksandar Stevanovic, Wayne B. Hayes
2010 J jnl
BMC Syst. Biol.
Hsiang Ho, Tijana Milenkovic, Vesna Memisevic, Jayavani Aruri, Natasa Przulj, Anand K. Ganesan
2009 J jnl
PLoS Comput. Biol.
Oleksii Kuchaiev, Marija Rasajski, Desmond J. Higham, Natasa Przulj
2009 Misc conf
Pacific Symposium on Biocomputing
Oleksii Kuchaiev, Natasa Przulj
2008 J jnl
Bioinform.
Desmond J. Higham, Marija Rasajski, Natasa Przulj
2008 J jnl
BMC Bioinform.
Tijana Milenkovic, Jason Lai, Natasa Przulj
2007 J jnl
Bioinform.
Natasa Przulj
2007 J jnl
PLoS Comput. Biol.
Fereydoun Hormozdiari, Petra Berenbrink, Natasa Przulj, Süleyman Cenk Sahinalp
2006 J jnl
Bioinform.
Natasa Przulj, Derek G. Corneil, Igor Jurisica
2006 conf
Systems Biology and Computational Proteomics
Fereydoun Hormozdiari, Petra Berenbrink, Natasa Przulj, Süleyman Cenk Sahinalp
2005 J jnl
Discret. Appl. Math.
Natasa Przulj, Derek G. Corneil
2005
Natasa Przulj
2004 J jnl
Bioinform.
Natasa Przulj, Dennis A. Wigle, Igor Jurisica
2004 J jnl
Discret. Appl. Math.
Natasa Przulj, Derek G. Corneil, Ekkehard Köhler
2004 J jnl
Bioinform.
Natasa Przulj, Derek G. Corneil, Igor Jurisica
2004 J jnl
Bioinform.
Andrew D. King, Natasa Przulj, Igor Jurisica
1998 J jnl
Parallel Process. Lett.
Arthur L. Liestman, Natasa Przulj
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