Waleed Alomoush

26 papers Journal 21Unranked 4
YearRankTypeTitle / Venue / Authors
2026 J jnl
Discov. Internet Things
Sharif Naser Makhadmeh, Yousef K. Sanjalawe, Mohammad Adnan Aladaileh, Mohammed Azmi Al-Betar, Qusai Yousef Shambour, Waleed Alomoush
2025 J jnl
Int. J. Comput. Intell. Syst.
Mohanad A. Deif, Mohamed Elhoseny, Waleed Alomoush, Mohamed A. Hafez, Mohammad Khishe
2025 J jnl
Appl. Comput. Intell. Soft Comput.
Mohanad A. Deif, Hani Attar, Waleed Alomoush, Mohamed A. Hafez
2024 J jnl
Comput. Biol. Medicine
Essam H. Houssein, Marwa M. Emam, Waleed Alomoush, Nagwan M. Abdel Samee, Mona M. Jamjoom, Rui Zhong, Krishna Gopal Dhal
2024 conf
ACIT
Hani Attar, Jafar Ababneh, Mohamed A. Hafez, Waleed Alomoush, Hussein Al-Faiz, Mohanad A. Deif
2024 conf
ICCR
Ayat Alrosan, Waleed Alomoush, Merna Youssef, Abdelrhman W. Nile, Mohanad A. Deif, Rania El-Gohary
2024 J jnl
IEEE Access
Osama Ahmed Khashan, Nour Mahmoud Khafajah, Waleed Alomoush, Mohammad Alshinwan
2024 J jnl
Evol. Intell.
Waleed Alomoush, Essam H. Houssein, Ayat Alrosan, Alaa Abd-alrazaq, Mohammed Alweshah, Mohammad Alshinwan
2024 conf
ICCR
Mohanad A. Dief, Waleed Alomoush, Hani H. Attar, Osama Ahmed Khashan, Ahmed A. A. Solyman, Rania Elgohary
2024 J jnl
IEEE Open J. Commun. Soc.
Osama Ahmed Khashan, Nour Mahmoud Khafajah, Waleed Alomoush, Mohammad Alshinwan, Emad Alomari
2023 J jnl
IEEE Access
Mohammad Hijjawi, Mohammad Alshinwan, Osama Ahmed Khashan, Waleed Alomoush, Nader Abdel Karim, Ahmed Younes Shdefat, Saad Said Alqahtany, Eman Ahmad Shudayfat
2023 J jnl
J. Cloud Comput.
Waleed Alomoush, Osama Ahmed Khashan, Ayat Alrosan, Hani H. Attar, Ammar Almomani, Fuad Alhosban, Sharif Naser Makhadmeh
2023 J jnl
Cryptogr.
Osama Ahmed Khashan, Nour Mahmoud Khafajah, Waleed Alomoush, Mohammad Alshinwan, Sultan Alamri, Samer Atawneh, Mutasem K. Alsmadi
2023 ch.
The Effect of Information Technology on Business and Marketing Intelligence Systems
Taher M. Ghazal, Mohammad Kamrul Hasan, Siti Norul Huda Sheikh Abdullah, Khairul Azmi Abu Bakar, Nidal A. Al-Dmour, Raed A. Said, Tamer Mohamed Abdellatif, Abdallah Moubayed, Haitham M. Alzoubi, Muhammad Alshurideh, Waleed Alomoush
2023 J jnl
IEEE Access
Mohammed Alweshah, Muder Almiani, Saleh Alkhalaileh, Sofian Kassaymeh, Essa Abdullah Hezzam, Waleed Alomoush
2022 J jnl
Symmetry
Mohammed Alswaitti, Kamran Siddique, Shulei Jiang, Waleed Alomoush, Ayat Alrosan
2022 J jnl
J. Ambient Intell. Humaniz. Comput.
Waleed Alomoush, Ayat Alrosan, Yazan M. Alomari, Alaa A. Alomoush, Ammar Almomani, Hammoudeh S. Alamri
2022 J jnl
Sensors
Waleed Alomoush, Osama Ahmed Khashan, Ayat Alrosan, Essam H. Houssein, Hani Attar, Mohammed Alweshah, Fuad Alhosban
2022 J jnl
Int. J. Semantic Web Inf. Syst.
Ammar Almomani, Mohammad Alauthman, Mohd Taib Shatnawi, Mohammed Alweshah, Ayat Alrosan, Waleed Alomoush, Brij B. Gupta
2022 J jnl
J. Big Data
Mohammed Alweshah, Muder Almiani, Nedaa Almansour, Saleh Al Khalaileh, Hamza Aldabbas, Waleed Alomoush, Almahdi Alshareef
2021 J jnl
Neural Comput. Appl.
Ayat Alrosan, Waleed Alomoush, Norita Md Norwawi, Mohammed Alswaitti, Sharif Naser Makhadmeh
2021 J jnl
Knowl. Based Syst.
Essam H. Houssein, Kashif Hussain, Laith Mohammad Abualigah, Mohamed E. Abd Elaziz, Waleed Alomoush, Gaurav Dhiman, Youcef Djenouri, Erik Cuevas
2021 J jnl
J. Glob. Inf. Manag.
Ammar Almomani, Ahmad Al Nawasrah, Waleed Alomoush, Mustafa Al-Abweh, Ayat Alrosan, Brij B. Gupta
2020 J jnl
J. King Saud Univ. Comput. Inf. Sci.
Waleed Alomoush, Khairuddin Omar, Ayat Alrosan, Yazan M. Alomari, Dheeb Albashish, Ammar Almomani
2019 conf
IRICT
Alaa A. Alomoush, AbdulRahman A. Al-Sewari, Hammoudeh S. Alamri, Kamal Z. Zamli, Waleed Alomoush, Mohammed Issam Younis
2018 J jnl
CoRR
Waleed Alomoush, Ayat Alrosan
tests/unit/test_decompile_medium_level.py
← Index tests/unit/test_decompile_medium_level.py python
# tests/unit/test_decompile_medium_level.py
"""Unit tests (mocked BN) for bninja/analysis/medium_level.py
   and bninja/analysis/medium_level_normalization.py."""
# tests/unit/test_decompile_medium_level.py
import sys
from unittest.mock import MagicMock, patch

# Installa gli stubs BN
from tests.unit.conftest_binja_stubs import install_binja_stubs
install_binja_stubs()

# ── Definisci MockMLILInstruction PRIMA di importare il modulo ──
class MockMLILInstruction:
    def __init__(self, operation, address=0, operands=None):
        self.operation = operation
        self.address = address
        self.operands = operands or []

# ── Patcha il modulo BN in modo che isinstance() funzioni ──
sys.modules["binaryninja"].MediumLevelILInstruction = MockMLILInstruction
sys.modules["binaryninja"].SSAVariable = type("SSAVariable", (), {})
sys.modules["binaryninja"].Variable = type("Variable", (), {})
sys.modules["binaryninja"].ILIntrinsic = type("ILIntrinsic", (), {})

# Ora importa il modulo — vede già i tipi corretti
from redb.extractors.decompiler.bninja.analysis.medium_level_normalization import (
    MediumLevelNormalization,
)	

class MockMLILFunction:
    def __init__(self, instructions):
        self._instructions = instructions

    @property
    def instructions(self):
        return iter(self._instructions)

    @property
    def basic_blocks(self):
        # one block containing all instructions, good enough for MinHasher
        block = MagicMock()
        block.__iter__ = lambda self_: iter([])  # not used by MediumLevelAnalysis
        return [block]


class MockFunction:
    def __init__(self, name="func", start=0x1000, mlil=None):
        self.name = name
        self.start = start
        self.mlil = mlil



class TestMediumLevelNormalization:
    def setup_method(self):
        from redb.extractors.decompiler.bninja.analysis.medium_level_normalization import (
            MediumLevelNormalization,
        )
        self.norm = MediumLevelNormalization()

    def test_normalize_skeleton_single_instruction(self):
        il = MockMLILInstruction(operation=42, operands=[])
        result = self.norm.normalize_instruction_all_levels(il)
        assert result == [42]

    def test_normalize_skeleton_nested(self):
        inner = MockMLILInstruction(operation=7, operands=[])
        outer = MockMLILInstruction(operation=1, operands=[inner])
        result = self.norm.normalize_instruction_all_levels(outer)
        assert result == [1, 7]

    def test_normalize_skeleton_with_list_operand(self):
        inner_a = MockMLILInstruction(operation=10, operands=[])
        inner_b = MockMLILInstruction(operation=11, operands=[])
        outer = MockMLILInstruction(operation=2, operands=[[inner_a, inner_b]])
        result = self.norm.normalize_instruction_all_levels(outer)
        assert result == [2, 10, 11]

    def test_normalize_skeleton_none(self):
        result = self.norm.normalize_instruction_all_levels(None)
        # collect on None should leave ops empty
        assert result == []

    def test_normalize_typed_appends_leaf_types(self):
        # operand is a plain int -> "CONST"
        il = MockMLILInstruction(operation=3, operands=[42])
        result = self.norm.normalize_instr_with_operands(il)
        assert result == [3, "CONST"]

    def test_normalize_typed_bool_before_int(self):
        # bool must be detected before int (since bool is an int subclass)
        il = MockMLILInstruction(operation=4, operands=[True])
        result = self.norm.normalize_instr_with_operands(il)
        assert result == [4, "BOOL"]

    def test_normalize_typed_float(self):
        il = MockMLILInstruction(operation=5, operands=[1.5])
        result = self.norm.normalize_instr_with_operands(il)
        assert result == [5, "FLOAT_CONST"]

    def test_normalize_typed_str(self):
        il = MockMLILInstruction(operation=6, operands=["hello"])
        result = self.norm.normalize_instr_with_operands(il)
        assert result == [6, "STR"]

    def test_normalize_typed_unknown_falls_back_to_typename(self):
        class Weird:
            pass
        il = MockMLILInstruction(operation=8, operands=[Weird()])
        result = self.norm.normalize_instr_with_operands(il)
        assert result == [8, "WEIRD"]

    def test_normalize_typed_nested_mlil(self):
        inner = MockMLILInstruction(operation=99, operands=[7])
        outer = MockMLILInstruction(operation=1, operands=[inner])
        result = self.norm.normalize_instr_with_operands(outer)
        assert result == [1, 99, "CONST"]

    def test_normalize_typed_list_mixed(self):
        inner = MockMLILInstruction(operation=50, operands=[])
        il = MockMLILInstruction(operation=2, operands=[[inner, 99]])
        result = self.norm.normalize_instr_with_operands(il)
        assert result == [2, 50, "CONST"]


class TestMediumLevelAnalysis:
    def _make_analysis(self, instructions=None, mlil=True, start=0x1000):
        from redb.extractors.decompiler.bninja.analysis.medium_level import (
            MediumLevelAnalysis,
        )
        mlil_func = MockMLILFunction(instructions or []) if mlil else None
        func = MockFunction(name="testfunc", start=start, mlil=mlil_func)
        bv = MagicMock()
        return MediumLevelAnalysis(func, bv, MagicMock())

    def test_collect_returns_empty_when_no_mlil(self):
        a = self._make_analysis(mlil=False)
        sk, sk_addr, ty, ty_addr = a._collect_mlil_skeleton_and_typed()
        assert sk == [] and sk_addr == [] and ty == [] and ty_addr == []

    def test_collect_skeleton_and_typed_basic(self):
        instrs = [
            MockMLILInstruction(operation=1, address=0x1000, operands=[]),
            MockMLILInstruction(operation=2, address=0x1004, operands=[42]),
        ]
        a = self._make_analysis(instructions=instrs, start=0x1000)
        sk, sk_addr, ty, ty_addr = a._collect_mlil_skeleton_and_typed()

        assert sk == [[1], [2]]
        assert ty == [[1], [2, "CONST"]]
        assert sk_addr == [(0, [1]), (4, [2])]
        assert ty_addr == [(0, [1]), (4, [2, "CONST"])]

    def test_collect_negative_offset_clamped_to_zero(self):
        instrs = [
            MockMLILInstruction(operation=1, address=0x900, operands=[]),
        ]
        a = self._make_analysis(instructions=instrs, start=0x1000)
        _, sk_addr, _, ty_addr = a._collect_mlil_skeleton_and_typed()
        assert sk_addr[0][0] == 0
        assert ty_addr[0][0] == 0

    def test_log_error_records_entry(self):
        a = self._make_analysis()
        a.log_error("boom", "fname", 0x1234, ValueError("x"), "loc")
        assert len(a.errors) == 1
        err = a.errors[0]
        assert err["function_name"] == "fname"
        assert err["function_address"] == "4660"  # hex 0x1234
        assert err["error_location"] == "loc"
        assert err["error_message"] == "boom"
        assert err["error_type"] == "ValueError"
        assert "timestamp" in err

    @patch(
        "redb.extractors.decompiler.bninja.analysis.medium_level.MinHasher"
    )
    def test_analyze_returns_expected_keys(self, mock_minhasher):
        mock_minhasher.return_value.calculateMinHash.return_value = [1, 2, 3]

        instrs = [
            MockMLILInstruction(operation=1, address=0x1000, operands=[]),
            MockMLILInstruction(operation=2, address=0x1004, operands=[42]),
            MockMLILInstruction(operation=3, address=0x1008, operands=[]),
        ]
        a = self._make_analysis(instructions=instrs, start=0x1000)
        result, errors = a.analyze()

        expected_keys = {
            "function_address",
            "body_mlil_skeleton_vector",
            "sha256_mlil_skeleton",
            "tlsh_mlil_skeleton",
            "minhash_mlil_skeleton",
            "body_mlil_typed_vector",
            "sha256_mlil_typed",
            "tlsh_mlil_typed",
            "minhash_mlil_typed",
        }
        assert set(result.keys()) == expected_keys
        assert result["function_address"] == 0x1000
        assert result["minhash_mlil_skeleton"] == [1, 2, 3]
        assert result["minhash_mlil_typed"] == [1, 2, 3]
        assert errors == []

    @patch(
        "redb.extractors.decompiler.bninja.analysis.medium_level.MinHasher"
    )
    def test_analyze_empty_mlil(self, mock_minhasher):
        mock_minhasher.return_value.calculateMinHash.return_value = []
        a = self._make_analysis(mlil=False)
        result, errors = a.analyze()
        assert result["body_mlil_skeleton_vector"] == []
        assert result["body_mlil_typed_vector"] == []
        assert errors == []

    @patch(
        "redb.extractors.decompiler.bninja.analysis.medium_level.MinHasher"
    )
    def test_analyze_sha256_differs_skeleton_vs_typed(self, mock_minhasher):
        mock_minhasher.return_value.calculateMinHash.return_value = []

        instrs = [
            MockMLILInstruction(operation=1, address=0x1000, operands=[42]),
            MockMLILInstruction(operation=2, address=0x1004, operands=["foo"]),
            MockMLILInstruction(operation=3, address=0x1008, operands=[True]),
        ]
        a = self._make_analysis(instructions=instrs)
        result, _ = a.analyze()
        # skeleton ignores operand leaves, typed includes them -> different hashes
        assert result["sha256_mlil_skeleton"] != result["sha256_mlil_typed"]


class TestMinHasherMLILKinds:
    def _make_func(self, instrs):
        # MinHasher iterates basic_blocks then over each block
        block = MagicMock()
        block.__iter__ = lambda self_: iter(instrs)
        f = MagicMock()
        f.basic_blocks = [block]
        return f

    def test_mlil_skeleton_uses_medium_normalizer(self):
        from redb.extractors.decompiler.bninja.similarity.minhasher import (
            MinHasher, TokenKind,
        )
        instrs = [
            MockMLILInstruction(operation=i, operands=[]) for i in range(5)
        ]
        func = self._make_func(instrs)
        hasher = MinHasher(seed=42, il_function=func, kind=TokenKind.MLIL)
        result = hasher.calculateMinHash()
        # 5 instructions -> 3 trigrams -> non-empty signature
        assert result != []

    def test_typed_mlil_differs_from_skeleton(self):
        from redb.extractors.decompiler.bninja.similarity.minhasher import (
            MinHasher, TokenKind,
        )
        instrs = [
            MockMLILInstruction(operation=1, operands=[42]),
            MockMLILInstruction(operation=2, operands=["s"]),
            MockMLILInstruction(operation=3, operands=[True]),
            MockMLILInstruction(operation=4, operands=[1.5]),
        ]
        func = self._make_func(instrs)
        skel = MinHasher(seed=42, il_function=func, kind=TokenKind.MLIL).calculateMinHash()
        typed = MinHasher(seed=42, il_function=func, kind=TokenKind.TYPED_MLIL).calculateMinHash()
        # Same seed, same instructions, but typed has extra leaf tokens
        # -> hashes should generally differ
        assert skel != typed

    def test_mlil_too_few_instructions(self):
        from redb.extractors.decompiler.bninja.similarity.minhasher import (
            MinHasher, TokenKind,
        )
        instrs = [MockMLILInstruction(operation=1, operands=[])] * 2
        func = self._make_func(instrs)
        hasher = MinHasher(seed=42, il_function=func, kind=TokenKind.MLIL)
        assert hasher.calculateMinHash() == []

    def test_unsupported_kind_raises(self):
        from redb.extractors.decompiler.bninja.similarity.minhasher import MinHasher
        func = self._make_func([])
        hasher = MinHasher(seed=42, il_function=func, kind="bogus")
        with pytest.raises(ValueError):
            hasher.calculateMinHash()