Haijiang Sun

33 papers Journal 30Unranked 3
YearRankTypeTitle / Venue / Authors
2026 J jnl
Neural Networks
Wanying Xu, Haijiang Sun, Shuai Wang, Xiaowen Zhang, Yong Ji
2026 J jnl
IEEE J. Sel. Top. Appl. Earth Obs. Remote. Sens.
Yuqi Wu, Donglin Xue, Haijiang Sun, Jinchang Ren, Qiaoyuan Liu, Xiaowen Zhang
2025 J jnl
IEEE J. Sel. Top. Appl. Earth Obs. Remote. Sens.
Hongliang Chang, Haijiang Sun, Jinchang Ren, Qiaoyuan Liu, Xiaowen Zhang
2025 J jnl
Neurocomputing
Xinglong Sun, Haijiang Sun, Shan Jiang, Jiacheng Wang, Xilai Wei, Zhonghe Hu
2025 J jnl
CoRR
Yide Liu, Haijiang Sun, Xiaowen Zhang, Qiaoyuan Liu, Zhouchang Chen, Chongzhuo Xiao
2025 J jnl
IEEE Trans. Geosci. Remote. Sens.
Yide Liu, Haijiang Sun, Xiaowen Zhang, Qiaoyuan Liu, Zhouchang Chen, Chongzhuo Xiao
2025 J jnl
IEEE J. Sel. Top. Appl. Earth Obs. Remote. Sens.
Xinglong Sun, Haijiang Sun, Bo Liu, Shan Jiang, Jiacheng Wang, Daqun Li
2025 J jnl
CoRR
Xinglong Sun, Haijiang Sun, Shan Jiang, Jiacheng Wang, Jiasong Wang
2024 J jnl
Sensors
Jiawei Teng, Haijiang Sun, Peixun Liu, Shan Jiang
2024 J jnl
IEEE Access
Tianze Yan, Yuqing Wang, Hengyi Lv, Haijiang Sun, Dehao Zhang, Yifan Yang
2024 J jnl
Remote. Sens.
Yuqi Wu, Qiaoyuan Liu, Haijiang Sun, Donglin Xue
2024 conf
PRCV (12)
Lang Yang, Haoqi Wang, Haijiang Sun, Qiaoyuan Liu, Tanlin Li, Lijun Wang, Yifan Wang
2024 J jnl
CoRR
Xinglong Sun, Haijiang Sun, Shan Jiang, Jiacheng Wang, Xilai Wei, Zhonghe Hu
2024 J jnl
Remote. Sens.
Hongyu Wu, Guanzhou Chen, Yang Bai, Ying Peng, Qianqian Ba, Shuai Huang, Xing Zhong, Haijiang Sun, Lei Zhang, Fuyu Feng
2024 J jnl
Remote. Sens.
Kaidi Ma, Peixun Liu, Haijiang Sun, Jiawei Teng
2024 J jnl
Remote. Sens.
Yongxian Zhao, Haijiang Sun, Shuai Wang
2024 J jnl
Pattern Recognit.
Xinglong Sun, Haijiang Sun, Jianan Li
2023 J jnl
IEEE Trans. Geosci. Remote. Sens.
Yinhe Li, Jinchang Ren, Yijun Yan, Qiaoyuan Liu, Ping Ma, Andrei Petrovski, Haijiang Sun
2023 conf
BICS
Yuqi Wu, Xiaowen Zhang, Qiaoyuan Liu, Donglin Xue, Haijiang Sun, Jinchang Ren
2023 J jnl
Remote. Sens.
Xiaowen Zhang, Qiaoyuan Liu, Hongliang Chang, Haijiang Sun
2023 conf
BICS
Yinhe Li, Yijun Yan, Jinchang Ren, Qiaoyuan Liu, Haijiang Sun
2023 J jnl
IEEE Geosci. Remote. Sens. Lett.
Yijun Yan, Jinchang Ren, Qiaoyuan Liu, Huimin Zhao, Haijiang Sun, Jaime Zabalza
2023 J jnl
Remote. Sens.
Qiaoyuan Liu, Donglin Xue, Yanhui Tang, Yongxian Zhao, Jinchang Ren, Haijiang Sun
2023 J jnl
Sensors
Mingqing Li, Yuqing Wang, Haijiang Sun
2023 J jnl
Remote. Sens.
Xiangdong Xu, Jiarong Wang, Ming Zhu, Haijiang Sun, Zhenyuan Wu, Yao Wang, Shenyi Cao, Sanzai Liu
2022 J jnl
Remote. Sens.
Jiaqi Sun, Jiarong Wang, Zhicheng Hao, Ming Zhu, Haijiang Sun, Ming Wei, Kun Dong
2021 J jnl
Sensors
Ruifeng Bai, Shan Jiang, Haijiang Sun, Yifan Yang, Guiju Li
2021 J jnl
Pattern Recognit.
Qiaoyuan Liu, Jinchang Ren, Yuru wang, Yuanbo Wu, Haijiang Sun, Huimin Zhao
2021 J jnl
IEEE J. Sel. Top. Appl. Earth Obs. Remote. Sens.
Haijiang Sun, Qiaoyuan Liu, Jiacheng Wang, Jinchang Ren, Yanfeng Wu, Huimin Zhao, Huakang Li
2021 J jnl
IEEE Access
Yifan Yang, Yuqing Wang, Chenhao Zhu, Ming Zhu, Haijiang Sun, Tianze Yan
2019 J jnl
Sensors
Baolin Lv, Shoufeng Tong, Qiaoyuan Liu, Haijiang Sun
2019 J jnl
IEEE Access
Qiaoyuan Liu, Weiwei Liu, Yuru wang, Jinchang Ren, Qiao Du, Yinghua Lv, Haijiang Sun
2018 J jnl
Int. J. Wavelets Multiresolution Inf. Process.
Yanfeng Wu, Haijiang Sun, Peixun Liu
tests/unit/test_apk_method_extractor.py
← Index tests/unit/test_apk_method_extractor.py python
"""
Unit tests for APK method-level content extraction, hashing, and similarity.

Tests SHA-256 normalization, ssdeep/TLSH computation, obfuscation detection,
and Dalvik-to-Java type conversion.
"""
import pytest

pytestmark = [pytest.mark.unit, pytest.mark.apk, pytest.mark.decompile]


class TestHashingFunctions:
    """Tests for hashing utility functions."""

    def test_sha256_deterministic(self):
        from redb.extractors.decompiler.apk.method_extractor import compute_sha256
        h1 = compute_sha256("invoke-virtual {p0}, Lcom/Foo;->bar()V")
        h2 = compute_sha256("invoke-virtual {p0}, Lcom/Foo;->bar()V")
        assert h1 == h2

    def test_sha256_hex_length(self):
        from redb.extractors.decompiler.apk.method_extractor import compute_sha256
        assert len(compute_sha256("test")) == 64

    def test_sha256_different_inputs(self):
        from redb.extractors.decompiler.apk.method_extractor import compute_sha256
        assert compute_sha256("aaa") != compute_sha256("bbb")

    def test_ssdeep_none_for_short(self):
        from redb.extractors.decompiler.apk.method_extractor import compute_ssdeep
        assert compute_ssdeep("short") is None

    def test_tlsh_none_for_short(self):
        from redb.extractors.decompiler.apk.method_extractor import compute_tlsh
        assert compute_tlsh("x") is None


class TestObfuscationDetection:
    """Tests for obfuscation indicator detection."""

    def test_short_method_name_single_char(self):
        from redb.extractors.decompiler.apk.method_extractor import detect_obfuscation_indicators
        r = detect_obfuscation_indicators("a", "Lcom/Foo;", "", 10)
        assert r["short_method_name"] is True

    def test_short_method_name_two_chars(self):
        from redb.extractors.decompiler.apk.method_extractor import detect_obfuscation_indicators
        r = detect_obfuscation_indicators("ab", "Lcom/Foo;", "", 10)
        assert r["short_method_name"] is True

    def test_normal_method_name(self):
        from redb.extractors.decompiler.apk.method_extractor import detect_obfuscation_indicators
        r = detect_obfuscation_indicators("onCreate", "Lcom/Foo;", "", 10)
        assert r["short_method_name"] is False

    def test_short_class_name(self):
        from redb.extractors.decompiler.apk.method_extractor import detect_obfuscation_indicators
        r = detect_obfuscation_indicators("foo", "Lcom/a;", "", 10)
        assert r["short_class_name"] is True

    def test_normal_class_name(self):
        from redb.extractors.decompiler.apk.method_extractor import detect_obfuscation_indicators
        r = detect_obfuscation_indicators("foo", "Lcom/example/MainActivity;", "", 10)
        assert r["short_class_name"] is False

    def test_string_encryption_detected(self):
        from redb.extractors.decompiler.apk.method_extractor import detect_obfuscation_indicators
        smali = (
            'const-string v0, "xyz"\n'
            'invoke-static {v0}, Lcom/Enc;->decrypt(Ljava/lang/String;)Ljava/lang/String;\n'
        )
        r = detect_obfuscation_indicators("m", "Lcom/Foo;", smali, 10)
        assert r["has_string_encryption"] is True

    def test_no_string_encryption(self):
        from redb.extractors.decompiler.apk.method_extractor import detect_obfuscation_indicators
        smali = 'const-string v0, "hello"\ninvoke-virtual {v0}, Ljava/lang/String;->length()I'
        r = detect_obfuscation_indicators("m", "Lcom/Foo;", smali, 10)
        assert r["has_string_encryption"] is False

    def test_reflection_detected(self):
        from redb.extractors.decompiler.apk.method_extractor import detect_obfuscation_indicators
        smali = 'invoke-virtual {v0, v1}, Ljava/lang/Class;->forName(Ljava/lang/String;)Ljava/lang/Class;'
        r = detect_obfuscation_indicators("m", "Lcom/Foo;", smali, 10)
        assert r["has_reflection_calls"] is True

    def test_no_reflection(self):
        from redb.extractors.decompiler.apk.method_extractor import detect_obfuscation_indicators
        smali = 'invoke-virtual {p0}, Lcom/Foo;->bar()V'
        r = detect_obfuscation_indicators("m", "Lcom/Foo;", smali, 10)
        assert r["has_reflection_calls"] is False

    def test_excessive_goto_detected(self):
        from redb.extractors.decompiler.apk.method_extractor import detect_obfuscation_indicators
        smali = "\n".join(["goto :label"] * 10)
        # threshold = max(5, 20*0.15=3) = 5, 10 > 5
        r = detect_obfuscation_indicators("m", "Lcom/Foo;", smali, 20)
        assert r["excessive_goto_count"] is True

    def test_no_excessive_goto(self):
        from redb.extractors.decompiler.apk.method_extractor import detect_obfuscation_indicators
        smali = "goto :label\nreturn-void"
        r = detect_obfuscation_indicators("m", "Lcom/Foo;", smali, 100)
        assert r["excessive_goto_count"] is False

    def test_goto_16_counted(self):
        from redb.extractors.decompiler.apk.method_extractor import detect_obfuscation_indicators
        smali = "\n".join(["goto/16 :label"] * 10)
        r = detect_obfuscation_indicators("m", "Lcom/Foo;", smali, 20)
        assert r["excessive_goto_count"] is True


class TestDalvikTypeConversion:
    """Tests for Dalvik-to-Java type conversion."""

    def test_void(self):
        from redb.extractors.decompiler.apk.method_extractor import dalvik_type_to_java
        assert dalvik_type_to_java("V") == "void"

    def test_primitives(self):
        from redb.extractors.decompiler.apk.method_extractor import dalvik_type_to_java
        assert dalvik_type_to_java("I") == "int"
        assert dalvik_type_to_java("Z") == "boolean"
        assert dalvik_type_to_java("J") == "long"
        assert dalvik_type_to_java("F") == "float"
        assert dalvik_type_to_java("D") == "double"
        assert dalvik_type_to_java("B") == "byte"
        assert dalvik_type_to_java("S") == "short"
        assert dalvik_type_to_java("C") == "char"

    def test_object_type(self):
        from redb.extractors.decompiler.apk.method_extractor import dalvik_type_to_java
        assert dalvik_type_to_java("Ljava/lang/String;") == "String"
        assert dalvik_type_to_java("Lcom/example/Foo;") == "Foo"

    def test_array_type(self):
        from redb.extractors.decompiler.apk.method_extractor import dalvik_type_to_java
        assert dalvik_type_to_java("[I") == "int[]"
        assert dalvik_type_to_java("[Ljava/lang/String;") == "String[]"

    def test_empty_returns_void(self):
        from redb.extractors.decompiler.apk.method_extractor import dalvik_type_to_java
        assert dalvik_type_to_java("") == "void"


class TestJavaPrototypeConversion:
    """Tests for method signature to Java prototype conversion."""

    def test_simple_method(self):
        from redb.extractors.decompiler.apk.method_extractor import dalvik_to_java_prototype
        assert dalvik_to_java_prototype("foo", "()V") == "void foo()"

    def test_method_with_params(self):
        from redb.extractors.decompiler.apk.method_extractor import dalvik_to_java_prototype
        result = dalvik_to_java_prototype("bar", "(ILjava/lang/String;)Z")
        assert result == "boolean bar(int, String)"

    def test_method_returning_object(self):
        from redb.extractors.decompiler.apk.method_extractor import dalvik_to_java_prototype
        result = dalvik_to_java_prototype("create", "()Lcom/example/Foo;")
        assert result == "Foo create()"

    def test_empty_signature(self):
        from redb.extractors.decompiler.apk.method_extractor import dalvik_to_java_prototype
        result = dalvik_to_java_prototype("m", "")
        assert "m()" in result


class TestDalvikParamParsing:
    """Tests for parsing Dalvik parameter descriptors."""

    def test_empty(self):
        from redb.extractors.decompiler.apk.method_extractor import _parse_dalvik_params
        assert _parse_dalvik_params("") == []

    def test_single_primitive(self):
        from redb.extractors.decompiler.apk.method_extractor import _parse_dalvik_params
        assert _parse_dalvik_params("I") == ["I"]

    def test_multiple_primitives(self):
        from redb.extractors.decompiler.apk.method_extractor import _parse_dalvik_params
        assert _parse_dalvik_params("IZJ") == ["I", "Z", "J"]

    def test_single_object(self):
        from redb.extractors.decompiler.apk.method_extractor import _parse_dalvik_params
        assert _parse_dalvik_params("Ljava/lang/String;") == ["Ljava/lang/String;"]

    def test_mixed(self):
        from redb.extractors.decompiler.apk.method_extractor import _parse_dalvik_params
        result = _parse_dalvik_params("ILjava/lang/String;Z")
        assert result == ["I", "Ljava/lang/String;", "Z"]

    def test_arrays(self):
        from redb.extractors.decompiler.apk.method_extractor import _parse_dalvik_params
        result = _parse_dalvik_params("[I[Ljava/lang/String;")
        assert result == ["[I", "[Ljava/lang/String;"]

    def test_two_objects(self):
        from redb.extractors.decompiler.apk.method_extractor import _parse_dalvik_params
        result = _parse_dalvik_params("Landroid/os/Bundle;Ljava/lang/String;")
        assert len(result) == 2