Haitao Sun

32 papers C 2Journal 26Unranked 4
YearRankTypeTitle / Venue / Authors
2026 J jnl
Medical Image Anal.
Bolun Zeng, Yaolin Xu, Peng Wang, Tianyu Lu, Zongyu Xie, Mengsu Zeng, Jianjun Zhou, Liang Liu, Haitao Sun, Xiaojun Chen
2026 J jnl
Autom. Softw. Eng.
Haitao Sun, Ying Wang, Hai Yu, Zhiliang Zhu
2026 J jnl
Neurocomputing
Hao Xu, Xiaohu Song, Haitao Sun, Hai Yu, Zhiliang Zhu
2026 J jnl
IEICE Electron. Express
Zhongye He, Yan Chen, Haitao Sun
2025 J jnl
IEEE Trans. Smart Grid
Qiangang Jia, Wenshu Jiao, Sijie Chen, Zheng Yan, Haitao Sun
2025 J jnl
Complex Intell. Syst.
Min Hu, Zhigang Ren, Zhirui Cao, Yifeng Guo, Haitao Sun, Hongyao Zhou, Yu Guo
2025 J jnl
IEICE Electron. Express
Yutao Fan, Yan Chen, Haitao Sun
2025 J jnl
IEICE Electron. Express
Dayu Wang, Chunyan Ma, Yan Chen, Haitao Sun
2025 J jnl
IEICE Electron. Express
Xiaobin Wang, Yan Chen, Haitao Sun
2025 J jnl
CoRR
Zhuo Xiao, Qinglong Yao, Jingjing Wang, Fugen Zhou, Bo Liu, Haitao Sun, Zhe Ji, Yuliang Jiang, Junjie Wang, Qihui Wu
2025 J jnl
IEEE Trans. Ind. Electron.
Haitao Sun, Zhongye He, Xu Deng, Yan Chen, Woongkul Lee
2025 J jnl
CoRR
Zhuo Xiao, Fugen Zhou, Jingjing Wang, Chongyu He, Bo Liu, Haitao Sun, Zhe Ji, Yuliang Jiang, Junjie Wang, Qiuwen Wu
2025 J jnl
BMC Medical Imaging
Qiying Tang, Lei Li, Zhiwei Pan, Jianbo Li, Xiaolan Huang, Mengsu Zeng, Haitao Sun, Jianjun Zhou
2024 C conf
IECON
Haitao Sun, Dayu Wang, Avinash Dornala, Ali Halawa, Yan Chen, Woongkul Lee
2024 J jnl
IEICE Electron. Express
Yibo Zhang, Yuan Cheng, Yan Chen, Haitao Sun
2024 J jnl
BMC Medical Imaging
Zhina Li, Cheng Wang, Jianbo Li, Xingxing Wang, Xiang Li, Tianzhu Yu, Jianjun Zhou, Xiaolin Wang, Mengsu Zeng, Haitao Sun
2023 J jnl
IEICE Electron. Express
Haitao Sun, Zhenyu Zhao, Yan Chen, Yinke Dou
2023 J jnl
IEICE Electron. Express
Haitao Sun, Yan Chen, Yinke Dou
2023 J jnl
BMC Medical Imaging
Haitao Sun, Shuai Yang, Lijuan Chen, Pingyan Liao, Xiangping Liu, Ying Liu, Ning Wang
2022 C conf
ISCAS
Ziqi Su, Wendong Mao, Zhongfeng Wang, Jun Lin, Wenqiang Wang, Haitao Sun
2022 J jnl
Int. J. Comput. Assist. Radiol. Surg.
Xi-Liang Zhu, Hong-Bin Shen, Haitao Sun, Li-Xia Duan, Ying-Ying Xu
2022 conf
BIC
Le Yu, Zonglin Lei, Yihuan Huang, Bin Li, Haitao Sun, Pengliang Sun
2020 J jnl
Inf. Syst. E Bus. Manag.
Haitao Sun
2020 J jnl
Int. J. Distributed Sens. Networks
Haitao Sun, Chengjie Jin, Xiaohan Helu, Hui Lu, Man Zhang, Zhihong Tian
2017 J jnl
J. Comput. Chem.
Zhubin Hu, Bin Zhou, Zhenrong Sun, Haitao Sun
2016 J jnl
J. Comput. Chem.
Haitao Sun, Shian Zhang, Cheng Zhong, Zhenrong Sun
2016 conf
ISCRAM
Haitao Sun, Zhiru Wang, Guofeng Su, Jianguo Chen
2012 J jnl
Int. J. Geogr. Inf. Sci.
Chaoqing Yu, Xiaotao Cheng, Jim W. Hall, Edward P. Evans, Yanyan Wang, Changwei Hu, Haoyun Wu, Jon Wicks, Mathew Scott, Haitao Sun, Jing Wang, Minglei Ren, Zongxue Xu
2011 J jnl
Speech Commun.
Jianxin Peng, Chengxun Bei, Haitao Sun
2010 conf
ICIRA (1)
Jie Sun, Wenzeng Zhang, Haitao Sun
2009 conf
FSKD (4)
Houjie Li, Jiyin Zhao, Guangqiu Chen, Haitao Sun
1999 J jnl
J. Comput. Chem.
Yuxiang Bu, Haitao Sun, Hongbo Niu
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