Nael H. El-Farra

102 papers C 66Journal 14Unranked 22
YearRankTypeTitle / Venue / Authors
2025 C conf
ACC
Aatam Gajjar, Matthew J. Ellis, Nael H. El-Farra
2025 C conf
ACC
James Allen, Nael H. El-Farra
2024 C conf
ACC
Shilpa Narasimhan, Nael H. El-Farra, Matthew J. Ellis
2024 C conf
ACC
Aatam Gajjar, Nael H. El-Farra
2023 C conf
ACC
Shilpa Narasimhan, Nael H. El-Farra, Matthew J. Ellis
2023 C conf
ACC
Amr Zedan, Nael H. El-Farra
2022 C conf
ACC
Shilpa Narasimhan, Nael H. El-Farra, Matthew J. Ellis
2021 C conf
ACC
Amr Zedan, Heqing Huang, Nael H. El-Farra
2021 C conf
ACC
Amr Zedan, Nael H. El-Farra
2021 conf
CDC
Amr Zedan, Nael H. El-Farra
2020 C conf
ACC
Amr Zedan, Nael H. El-Farra
2020 J jnl
J. Comput. Methods Sci. Eng.
Feifan Shen, Jiaqi Zheng, Lingjian Ye, Nael H. El-Farra
2020 C conf
ACC
James Allen, Nael H. El-Farra
2019 conf
CDC
Amr Zedan, Nael H. El-Farra
2019 C conf
ACC
Da Xue, Nael H. El-Farra
2018 C conf
ACC
Da Xue, Nael H. El-Farra
2018 C conf
ACC
Da Xue, Nael H. El-Farra
2018 C conf
ACC
James Allen, Ari Halberstadt, John Powers, Nael H. El-Farra
2017 C conf
ACC
Da Xue, Nael H. El-Farra
2017 C conf
ACC
Da Xue, Nael H. El-Farra
2016 C conf
ACC
Da Xue, Nael H. El-Farra
2016 conf
CDC
Da Xue, Nael H. El-Farra
2016 C conf
ACC
Da Xue, Nael H. El-Farra
2015 C conf
ACC
Di Peng, Nael H. El-Farra
2015 conf
CDC
Da Xue, Nael H. El-Farra
2014 C conf
ACC
Ye Hu, Nael H. El-Farra
2014 C conf
ACC
Zhiyuan Yao, Nael H. El-Farra
2014 conf
CDC
Xiaonan Wang, Chudong Tong, Ahmet Palazoglu, Nael H. El-Farra
2014 C conf
ACC
Chudong Tong, Nael H. El-Farra, Ahmet Palazoglu
2014 conf
CDC
Zhiyuan Yao, Nael H. El-Farra
2014 C conf
ACC
Xiaonan Wang, Ahmet Palazoglu, Nael H. El-Farra
2013 J jnl
Comput. Chem. Eng.
Michael Baldea, Nael H. El-Farra, B. Erik Ydstie
2013 C conf
ACC
Zhiyuan Yao, Ye Hu, Nael H. El-Farra
2013 C conf
ACC
Ye Hu, Nael H. El-Farra
2013 conf
CDC
Zhiyuan Yao, Nael H. El-Farra
2013 C conf
ACC
Yulei Sun, Nael H. El-Farra
2012 conf
CDC
Zhiyuan Yao, Nael H. El-Farra
2012 C conf
ACC
Zhiyuan Yao, Nael H. El-Farra
2012 C conf
ACC
Wei Wan, Nael H. El-Farra
2012 C conf
ACC
Ye Hu, Nael H. El-Farra
2011 C conf
ACC
Ye Hu, Nael H. El-Farra
2011 conf
CDC/ECC
Ye Hu, Nael H. El-Farra
2011 C conf
ACC
Yulei Sun, Nael H. El-Farra
2011 C conf
ACC
Yulei Sun, Nael H. El-Farra
2011 conf
CDC/ECC
Zhiyuan Yao, Nael H. El-Farra
2011 C conf
ACC
Zhiyuan Yao, Nael H. El-Farra
2010 C conf
ACC
Sathyendra Ghantasala, Nael H. El-Farra
2010 C conf
ACC
Yulei Sun, Sathyendra Ghantasala, Nael H. El-Farra
2010 conf
CDC
Zhiyuan Yao, Nael H. El-Farra
2010 C conf
ACC
Yulei Sun, Nael H. El-Farra
2010 C conf
ACC
Zhiyuan Yao, Yulei Sun, Nael H. El-Farra
2010 conf
CDC
Ye Hu, Nael H. El-Farra
2009 C conf
ACC
Sathyendra Ghantasala, Nael H. El-Farra
2009 C conf
ACC
Yulei Sun, Sathyendra Ghantasala, Nael H. El-Farra
2009 C conf
ACC
Yulei Sun, Sathyendra Ghantasala, Nael H. El-Farra
2009 C conf
ACC
Nael H. El-Farra, Yulei Sun
2009 C conf
ACC
Yulei Sun, Nael H. El-Farra
2009 J jnl
Autom.
Sathyendra Ghantasala, Nael H. El-Farra
2009 conf
CDC
Yulei Sun, Nael H. El-Farra
2008 C conf
ACC
Arthi Giridhar, Nael H. El-Farra
2008 J jnl
Comput. Chem. Eng.
Yulei Sun, Nael H. El-Farra
2008 C conf
ACC
Yulei Sun, Nael H. El-Farra
2008 conf
CDC
Yulei Sun, Nael H. El-Farra
2008 C conf
ACC
Sathyendra Ghantasala, Nael H. El-Farra
2008 J jnl
Comput. Chem. Eng.
Nael H. El-Farra, Prashant Mhaskar
2007 conf
CDC
Sathyendra Ghantasala, Nael H. El-Farra
2007 C conf
ACC
Nael H. El-Farra, Arthi Giridhar
2007 C conf
ACC
Nael H. El-Farra, Sathyendra Ghantasala
2007 C conf
ACC
Sathyendra Ghantasala, Nael H. El-Farra
2007 C conf
ACC
Prashant Mhaskar, Nael H. El-Farra, Panagiotis D. Christofides
2006 C conf
ACC
Nael H. El-Farra
2006 conf
CDC
Stevan Dubljevic, Prashant Mhaskar, Nael H. El-Farra, Panagiotis D. Christofides
2006 J jnl
Syst. Control. Lett.
Prashant Mhaskar, Nael H. El-Farra, Panagiotis D. Christofides
2005 C conf
ACC
Nael H. El-Farra, Adiwinata Gani, Panagiotis D. Christofides
2005 J jnl
Syst. Control. Lett.
Nael H. El-Farra, Prashant Mhaskar, Panagiotis D. Christofides
2005 C conf
ACC
Stevan Dubljevic, Prashant Mhaskar, Nael H. El-Farra, Panagiotis D. Christofides
2005 C conf
ACC
Dan Shi, Prashant Mhaskar, Nael H. El-Farra, Panagiotis D. Christofides
2005 J jnl
IEEE Trans. Autom. Control.
Prashant Mhaskar, Nael H. El-Farra, Panagiotis D. Christofides
2005 J jnl
Comput. Chem. Eng.
Stevan Dubljevic, Prashant Mhaskar, Nael H. El-Farra, Panagiotis D. Christofides
2005 J jnl
Autom.
Prashant Mhaskar, Nael H. El-Farra, Panagiotis D. Christofides
2005 C conf
ACC
Prashant Mhaskar, Nael H. El-Farra, Panagiotis D. Christofides
2004 C conf
ACC
Nael H. El-Farra, Prashant Mhaskar, Panagiotis D. Christofides
2004 C conf
ACC
Prashant Mhaskar, Nael H. El-Farra, Panagiotis D. Christofides
2004 J jnl
Comput. Chem. Eng.
Nael H. El-Farra, Panagiotis D. Christofides
2004 C conf
ACC
Stevan Dubljevic, Nael H. El-Farra, Prashant Mhaskar, Panagiotis D. Christofides
2004 C conf
ACC
Prashant Mhaskar, Nael H. El-Farra, Panagiotis D. Christofides
2004 J jnl
Autom.
Nael H. El-Farra, Prashant Mhaskar, Panagiotis D. Christofides
2003 J jnl
Autom.
Nael H. El-Farra, Antonios Armaou, Panagiotis D. Christofides
2003 J jnl
Comput. Chem. Eng.
Nael H. El-Farra, Yiming Lou, Panagiotis D. Christofides
2003 conf
HSCC
Nael H. El-Farra, Panagiotis D. Christofides
2003 C conf
ACC
Nael H. El-Farra, Prashant Mhaskar, Panagiotis D. Christofides
2002 conf
CDC
Nael H. El-Farra, Panagiotis D. Christofides, James C. Liao
2002 conf
CDC
Nael H. El-Farra, Panagiotis D. Christofides
2002 conf
HSCC
Nael H. El-Farra, Panagiotis D. Christofides
2002 C conf
ACC
Nael H. El-Farra, Prashant Mhaskar, Panagiotis D. Christofides
2001 conf
CDC
Nael H. El-Farra, Panagiotis D. Christofides
2001 C conf
ACC
Nael H. El-Farra, Panagiotis D. Christofides
2001 C conf
ACC
Nael H. El-Farra, Panagiotis D. Christofides
2001 conf
CDC
Nael H. El-Farra, Antonios Armaou, Panagiotis D. Christofides
2000 C conf
ACC
Nael H. El-Farra, Antonios Armaou, Panagiotis D. Christofides
2000 C conf
ACC
Timothy Chiu, Nael H. El-Farra, Panagiotis D. Christofides
2000 C conf
ACC
Nael H. El-Farra, Panagiotis D. Christofides
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