Kaikai Pan

27 papers A* 1C 1Journal 18Unranked 7
YearRankTypeTitle / Venue / Authors
2025 J jnl
CoRR
Jialin Wu, Kaikai Pan, Yanjiao Chen, Jiangyi Deng, Shengyuan Pang, Wenyuan Xu
2025 A* conf
NDSS
Fengchen Yang, Zihao Dan, Kaikai Pan, Chen Yan, Xiaoyu Ji, Wenyuan Xu
2025 J jnl
IEEE Trans. Ind. Electron.
Kaikai Pan, Zhiyun Wang, Jingwei Dong, Peter Palensky, Wenyuan Xu
2025 J jnl
IEEE Internet Things J.
Qidi Zhong, Shiang Guo, Aoran Cui, Kaikai Pan, Wenyuan Xu
2025 J jnl
Autom.
Jingwei Dong, Kaikai Pan, Sérgio Pequito, Peyman Mohajerin Esfahani
2025 J jnl
IEEE Trans. Ind. Informatics
Zhiyun Wang, Kaikai Pan, Wenyuan Xu
2024 conf
MetaCom
Jialin Wu, Kaikai Pan, Yanjiao Chen, Jiangyi Deng, Shengyuan Pang, Wenyuan Xu
2024 J jnl
CoRR
Fengchen Yang, Zihao Dan, Kaikai Pan, Chen Yan, Xiaoyu Ji, Wenyuan Xu
2023 conf
ISGT Asia
Huaiyu Liu, Yuze Fu, Kaikai Pan, Wenyuan Xu, Chenggang Li, Chen Liu
2023 J jnl
CoRR
Jingwei Dong, Kaikai Pan, Sérgio Pequito, Peyman Mohajerin Esfahani
2022 conf
EEET
Jiandong Si, Huaiyu Liu, Zihuai Zheng, Xueqi Jin, Dongbo Zhang, Zhouhong Wang, Kaikai Pan
2022 J jnl
IEEE Trans. Smart Grid
Kaikai Pan, Peter Palensky, Peyman Mohajerin Esfahani
2022 J jnl
Neural Comput. Appl.
Pin Wu, Kaikai Pan, Lulu Ji, Siquan Gong, Weibing Feng, Wenyan Yuan, Christopher C. Pain
2020 J jnl
CoRR
Kaikai Pan, Peter Palensky, Peyman Mohajerin Esfahani
2020 J jnl
CoRR
Chenguang Wang, Simon H. Tindemans, Kaikai Pan, Peter Palensky
2020 J jnl
CoRR
Kaikai Pan, Elyas Rakhshani, Peter Palensky
2020 J jnl
IEEE Access
Kaikai Pan, Elyas Rakhshani, Peter Palensky
2020 conf
ISGT-Europe
Chenguang Wang, Kaikai Pan, Simon H. Tindemans, Peter Palensky
2020 J jnl
CoRR
Chenguang Wang, Kaikai Pan, Simon H. Tindemans, Peter Palensky
2019 J jnl
IEEE Trans. Smart Grid
Kaikai Pan, André Teixeira, Milos Cvetkovic, Peter Palensky
2019 conf
HASE
Kaikai Pan, Digvijay Gusain, Peter Palensky
2017 J jnl
CoRR
Kaikai Pan, André Teixeira, Claudio David López, Peter Palensky
2017 conf
SmartGridComm
Kaikai Pan, André Teixeira, Claudio David López, Peter Palensky
2017 J jnl
CoRR
Kaikai Pan, André Teixeira, Milos Cvetkovic, Peter Palensky
2017 J jnl
CoRR
Kaikai Pan, André Teixeira, Milos Cvetkovic, Peter Palensky
2017 C conf
IECON
Kaikai Pan, André Teixeira, Milos Cvetkovic, Peter Palensky
2016 conf
SmartGridComm
Kaikai Pan, André M. H. Teixeira, Milos Cvetkovic, Peter Palensky
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}"