Hamzah Elrehail

14 papers Journal 10Unranked 4
YearRankTypeTitle / Venue / Authors
2024 J jnl
Int. J. Inf. Manag. Data Insights
Shafique Ur Rehman, Hamzah Elrehail, Abdallah Taamneh, Abdallah Alsaad, Raid Al-Adaileh
2024 conf
ICCR
Riktesh Srivastava, Belal Shneikat, Sharon Mendoza, Hamzah Elrehail, Mohammed A. M. Afifi
2024 J jnl
Int. J. Bus. Inf. Syst.
Mohammad J. Adaileh, Ali R. Alshawawreh, Ibrahim Harazneh, Hamzah Elrehail, Shafique Ur Rehman, Mohammad Rokibul Hossain
2024 conf
ICCR
Mohamed Dawood Shamout, Haitham M. Alzoubi, Hamzah Elrehail, Rania Itani, Anwar Al-Gasaymeh, Maged Farouk
2023 J jnl
Int. J. Inf. Manag. Data Insights
Naveed Iqbal Chaudhry, Shafique Ur Rehman, Hamzah Elrehail, Turki Fahed Al Masaeid, Raid Al-Adaileh, Haitham M. Alzoubi
2023 J jnl
Kybernetes
Manaf Al-Okaily, Hamza Alqudah, Anas Ali Al-Qudah, Naim S. Al-Qadi, Hamzah Elrehail, Aws Al-Okaily
2022 conf
ICCR
Turki Fahed Al Masaeid, Hamzah Elrehail, Ayesha Kalim
2022 J jnl
Inf. Resour. Manag. J.
Mohamed Dawood Shamout, Malek Bakheet Haroun Elayan, Salima Hamouche, Adnan M. Rawashdeh, Hamzah Elrehail
2022 conf
ICCR
Rachid Alami, Hamzah Elrehail, Amro Alzghoul
2022 J jnl
Int. J. Serv. Sci. Manag. Eng. Technol.
Haitham M. Alzoubi, Hamzah Elrehail, Jalal Rajeh Hanaysha, Anwar Al-Gasaymeh, Raid Al-Adaileh
2021 J jnl
Educ. Inf. Technol.
Hamzah Elrehail, Shafique Ur Rehman, Naveed Iqbal Chaudhry, Amro Alzghoul
2021 J jnl
J. Inf. Technol.
Abdallah Alsaad, Abdallah Taamneh, Ismail Sila, Hamzah Elrehail
2018 J jnl
Telematics Informatics
Hamzah Elrehail, Okechukwu Lawrence Emeagwali, Abdallah Alsaad, Amro Alzghoul
2016 J jnl
Comput. Hum. Behav.
Emran Aljarrah, Hamzah Elrehail, Bashar Aababneh
tests/unit/test_decompile_strings.py
← Index tests/unit/test_decompile_strings.py python
"""Unit tests for bninja/analysis/strings.py — StringAnalysis."""
import pytest
import math
from unittest.mock import MagicMock


# StringAnalysis has no binaryninja imports, just collections and math
from redb.extractors.decompiler.bninja.analysis.strings import StringAnalysis


# ============================================================================
# Helper mocks
# ============================================================================

class MockStringEntry:
    """Mock for a Binary Ninja string reference."""
    def __init__(self, value, raw=None, start=0, length=0, type_name="Utf8String"):
        self.value = value
        self.raw = raw if raw is not None else (value.encode("utf-8") if isinstance(value, str) else value)
        self.start = start
        self.length = length if length else len(self.raw)
        self.type = MagicMock()
        self.type.name = type_name


class MockBinaryView:
    """Mock binary view with a strings list."""
    def __init__(self, strings=None):
        self.strings = strings or []


# ============================================================================
# 6a. StringAnalysis
# ============================================================================


class TestStringAnalysisEntropy:
    def setup_method(self):
        self.sa = StringAnalysis(bv=MockBinaryView(), functions=[])

    def test_entropy_empty_string(self):
        assert self.sa.entropy("") == 0.0

    def test_entropy_single_char(self):
        assert self.sa.entropy("aaaa") == 0.0

    def test_entropy_uniform_distribution(self):
        # "abcd" -> 4 unique chars, each p=1/4, entropy = log2(4) = 2.0
        result = self.sa.entropy("abcd")
        assert result == pytest.approx(2.0)

    def test_entropy_binary_string(self):
        # "ab" -> 2 unique chars, each p=1/2, entropy = log2(2) = 1.0
        result = self.sa.entropy("ab")
        assert result == pytest.approx(1.0)


class TestStringAnalysisAnalyze:
    def test_analyze_deduplication(self):
        """Duplicate (string, encoding) pairs -> only first kept."""
        entries = [
            MockStringEntry("hello", start=100, type_name="Utf8String"),
            MockStringEntry("hello", start=200, type_name="Utf8String"),
        ]
        bv = MockBinaryView(strings=entries)
        sa = StringAnalysis(bv=bv, functions=[])
        result = sa.analyze()
        assert len(result) == 1
        assert result[0]["string_offset"] == 100

    def test_analyze_sorted_by_address(self):
        """First occurrence (lowest offset) is the one kept."""
        entries = [
            MockStringEntry("world", start=500, type_name="Utf8String"),
            MockStringEntry("world", start=100, type_name="Utf8String"),
        ]
        bv = MockBinaryView(strings=entries)
        sa = StringAnalysis(bv=bv, functions=[])
        result = sa.analyze()
        assert len(result) == 1
        # The analyze() sorts by start, so 100 comes first
        assert result[0]["string_offset"] == 100

    def test_analyze_empty_bv(self):
        bv = MockBinaryView(strings=[])
        sa = StringAnalysis(bv=bv, functions=[])
        result = sa.analyze()
        assert result == []

    def test_analyze_output_schema(self):
        entries = [MockStringEntry("test_string", start=0, type_name="Utf8String")]
        bv = MockBinaryView(strings=entries)
        sa = StringAnalysis(bv=bv, functions=[])
        result = sa.analyze()
        assert len(result) == 1
        r = result[0]
        required_keys = [
            "string",
            "string_raw",
            "string_encoding",
            "string_offset",
            "string_length",
            "string_raw_length",
            "string_entropy",
        ]
        for key in required_keys:
            assert key in r, f"Missing key: {key}"