Wei Zhao

13 papers A 2B 1C 1Misc 1Journal 3Unranked 5
YearRankTypeTitle / Venue / Authors
2007 J jnl
Int. J. Bus. Process. Integr. Manag.
Wei Zhao, Barrett R. Bryant, Fei Cao, Rainer Hauser, Kamal Bhattacharya, Tao Tao
2006 J jnl
Int. J. Web Grid Serv.
Wei Zhao, Rainer Hauser, Kamal Bhattacharya, Barrett R. Bryant, Fei Cao
2005 J jnl
J. Univers. Comput. Sci.
Fei Cao, Barrett R. Bryant, Rajeev R. Raje, Andrew M. Olson, Mikhail Auguston, Wei Zhao, Carol C. Burt
2005 A conf
ICWS
Fei Cao, Barrett R. Bryant, Shih-Hsi Liu, Wei Zhao
2005 Misc conf
SAC
Fei Cao, Barrett R. Bryant, Wei Zhao, Carol C. Burt, Rajeev R. Raje, Andrew M. Olson, Mikhail Auguston
2005 conf
IEEE SCC
Wei Zhao, Barrett R. Bryant, Fei Cao, Kamal Bhattacharya, Rainer Hauser
2004 A conf
ICWS
Fei Cao, Barrett R. Bryant, Wei Zhao, Carol C. Burt, Rajeev R. Raje, Andrew M. Olson, Mikhail Auguston
2004 B conf
EDOC
Wei Zhao, Barrett R. Bryant, Carol C. Burt, Rajeev R. Raje, Andrew M. Olson, Mikhail Auguston
2004 C conf
SEKE
Wei Zhao, Barrett R. Bryant, Fei Cao, Rajeev R. Raje, Mikhail Auguston, Carol C. Burt, Andrew M. Olson
2003 conf
OOPSLA Companion
Wei Zhao
2003 conf
OOPSLA Companion
Wei Zhao
2003 conf
eTX
Beum-Seuk Lee, Xiaoqing Wu, Fei Cao, Shih-Hsi Liu, Wei Zhao, Chunmin Yang, Barrett R. Bryant, Jeffrey G. Gray
2002 conf
OOPSLA Companion
Fei Cao, Barrett R. Bryant, Wei Zhao, Carol C. Burt, Rajeev R. Raje, Mikhail Auguston, Andrew M. Olson
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}"