Haitham Qawaqneh

13 papers Journal 5Unranked 8
YearRankTypeTitle / Venue / Authors
2026 J jnl
J. Supercomput.
Ahmed M. Zidan, Mohammed Alquraish, Musaad S. Aldhabani, Haitham Qawaqneh, Faheem Jan, Noorullah Noori
2026 J jnl
J. Supercomput.
Haitham Qawaqneh, Mohammed Alquraish, Ahmed M. Zidan, Ahmad Shafee, Rasool Shah
2025 conf
ICIT
Haitham Qawaqneh, Habes Alsamir
2025 conf
ICIT
Hamzeh Abdelfattah Awad Alassaf, Fadi Bani Ahmad, Haitham Qawaqneh
2023 conf
ICIT
Habes Alsamir, Haitham Qawaqneh
2023 conf
ICIT
Hassan Alzoubi, Waseem Al-Mashaleh, Haitham Qawaqneh, Mohammad Al-kafaween
2023 conf
ICIT
Fadi Bani Ahmad, Haitham Qawaqneh, Amjed Zraiqat, Sabah Jamil Al Nawaiseh
2023 J jnl
Int. J. Emerg. Technol. Learn.
Haitham Qawaqneh, Fadi Bani Ahmad, Ali Ratib Alawamreh
2021 conf
ICIT
Habes Alsamir, Haitham Qawaqneh, Hassen Aydi, Wasfi A. Shatanawi
2021 conf
ICIT
Haitham Qawaqneh, Mohd Salmi Md Noorani, Habes Alsamir
2021 conf
ICIT
Haitham Qawaqneh, Fadi Bani Ahmad, Amjed Zraiqat
2019 J jnl
Symmetry
Hüseyin Isik, Hassen Aydi, Mohd Salmi Md Noorani, Haitham Qawaqneh
2018 J jnl
Axioms
Haitham Qawaqneh, Mohd Salmi Md Noorani, Wasfi A. Shatanawi, Habes Alsamir
redb/extractors/decompiler/bninja/analysis/strings.py
← Index redb/extractors/decompiler/bninja/analysis/strings.py python
from collections import Counter
import math

class StringAnalysis:
    def __init__(self, bv, functions):
        self.bv = bv
        self.functions = functions

    def entropy(self, s: str) -> float:
        """Compute Shannon entropy of a string."""
        if not s:
            return 0.0
        freq = Counter(s)
        length = len(s)
        return -sum((count / length) * math.log2(count / length) for count in freq.values())

    def analyze(self):
        """
        Extract unique strings from the binary.

        Deduplicates by (string, encoding) within the same binary, keeping the
        first occurrence (lowest offset). Cross-binary deduplication and
        aggregation is handled by ClickHouse materialized views.
        """
        strings = {}

        # Sort strings by their starting address
        sorted_entries = sorted(self.bv.strings, key=lambda e: e.start)

        for entry in sorted_entries:
            # Key is the string and its encoding
            key = (entry.value, entry.type.name)

            # Skip if this string (value + encoding) was already added.
            # Because entries are sorted by address, the first one is always kept.
            if key in strings:
                continue

            # Store only the first occurrence with schema-matching field names
            # entry.length is the raw byte length, len(entry.value) is decoded string length
            string_entry = {
                "string": entry.value,
                "string_raw": entry.raw,
                "string_encoding": entry.type.name,
                "string_offset": entry.start,
                "string_length": len(entry.value),
                "string_raw_length": entry.length,
                "string_entropy": self.entropy(entry.value),
            }

            strings[key] = string_entry

        # Return as list for export compatibility
        return list(strings.values())