Wanjuan Song

24 papers A 1B 1C 2Journal 17Unranked 3
YearRankTypeTitle / Venue / Authors
2025 J jnl
IEICE Trans. Fundam. Electron. Commun. Comput. Sci.
Jian Zhang, Guang Zhao, Wanjuan Song, Zhiyan Xu
2023 J jnl
IEEE Trans. Geosci. Remote. Sens.
Xinli Liu, Yaoyao Chen, Xihan Mu, Guangjian Yan, Donghui Xie, Xuanlong Ma, Kai Yan, Wanjuan Song, Zhigang Liu
2023 J jnl
Soft Comput.
Jian Zhang, Qinqin Dong, Wanjuan Song
2023 J jnl
IEEE Trans. Geosci. Remote. Sens.
Li Wang, Yangjian Zhang, Wanjuan Song, Quan Zhou, Wang Li, Ni Huang, Shiguang Xu, Zheng Niu
2022 J jnl
Remote. Sens.
Yangjian Zhang, Li Wang, Yuanhuizi He, Ni Huang, Wang Li, Shiguang Xu, Quan Zhou, Wanjuan Song, Wensheng Duan, Xiaoyue Wang, Shakir Muhammad, Biswajit Nath, Luying Zhu, Feng Tang, Huilin Du, Lei Wang, Zheng Niu
2022 J jnl
IEEE Trans. Geosci. Remote. Sens.
Kai Yan, Si Gao, Haojing Chi, Jianbo Qi, Wanjuan Song, Yiyi Tong, Xihan Mu, Guangjian Yan
2022 J jnl
IEEE Trans. Geosci. Remote. Sens.
Kai Yan, Hanliang Li, Wanjuan Song, Yiyi Tong, Dalei Hao, Yelu Zeng, Xihan Mu, Guangjian Yan, Yuan Fang, Ranga B. Myneni, Crystal Schaaf
2021 J jnl
J. Supercomput.
Jian Zhang, Feihu Feng, Wanjuan Song
2020 J jnl
Inf. Sci.
Wanjuan Song, Wenyong Dong, Lanlan Kang
2019 C conf
IGARSS
Kai Yan, Yiyi Tong, Wanjuan Song, Yelu Zeng, Zhao Liu, Xihan Mu, Guangjian Yan
2019 A conf
ICME
Yuhang Liu, Wenyong Dong, Wanjuan Song, Lei Zhang
2019 conf
ISICA
Wanjuan Song, Wenyong Dong
2019 conf
ISICA
Wanjuan Song, Wenyong Dong
2018 J jnl
IEEE Trans. Geosci. Remote. Sens.
Kai Yan, Taejin Park, Chi Chen, Baodong Xu, Wanjuan Song, Bin Yang, Yelu Zeng, Zhao Liu, Guangjian Yan, Yuri Knyazikhin, Ranga B. Myneni
2018 J jnl
Remote. Sens.
Wanjuan Song, Yuri Knyazikhin, Guoyong Wen, Alexander Marshak, Matti Mottus, Kai Yan, Bin Yang, Baodong Xu, Taejin Park, Chi Chen, Yelu Zeng, Guangjian Yan, Xihan Mu, Ranga B. Myneni
2018 J jnl
Remote. Sens.
Yelu Zeng, Baodong Xu, Gaofei Yin, Shengbiao Wu, Guoqing Hu, Kai Yan, Bin Yang, Wanjuan Song, Jing Li
2017 J jnl
Int. J. Appl. Earth Obs. Geoinformation
Wanjuan Song, Xihan Mu, Gaiyan Ruan, Zhan Gao, Linyuan Li, Guangjian Yan
2017 C conf
IGARSS
Linyuan Li, Guangjian Yan, Xihan Mu, Suhong Liu, Yiming Chen, Kai Yan, Jinghui Luo, Wanjuan Song
2016 J jnl
IEEE Trans. Geosci. Remote. Sens.
Guangjian Yan, Ronghai Hu, Yiting Wang, Huazhong Ren, Wanjuan Song, Jianbo Qi, Ling Chen
2015 J jnl
Remote. Sens.
Xihan Mu, Mao-Gui Hu, Wanjuan Song, Gaiyan Ruan, Yong Ge, Jinfeng Wang, Shuai Huang, Guangjian Yan
2015 J jnl
Remote. Sens.
Wanjuan Song, Xihan Mu, Guangjian Yan, Shuai Huang
2015 J jnl
IEEE J. Sel. Top. Appl. Earth Obs. Remote. Sens.
Xihan Mu, Shuai Huang, Huazhong Ren, Guangjian Yan, Wanjuan Song, Gaiyan Ruan
2014 B conf
FUZZ-IEEE
Wanjuan Song, Wenyong Dong, Jian Zhang
2013 conf
CloudComp
Jian Zhang, Wanjuan Song
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}"