Xi Peng

49 papers A* 5B 4Misc 1Journal 34Unranked 5
YearRankTypeTitle / Venue / Authors
2026 J jnl
CoRR
Xi Peng
2026 J jnl
IEEE Trans. Dependable Secur. Comput.
Ximing Fan, Yong Fang, Peng Jia, Hongwei Li, Xi Peng, Yijia Xu, Qinying Wang, Binbin Zhao, Shouling Ji
2025 J jnl
Inf. Softw. Technol.
Hongsheng Zuo, Yong Fang, Peng Jia, Ximing Fan, Xi Peng, Yijia Xu, Rui Pan
2025 J jnl
Inf. Softw. Technol.
Xi Peng, Peng Jia, Ximing Fan, Jiayong Liu
2025 J jnl
Int. J. Appl. Earth Obs. Geoinformation
Xi Peng, Kim Calders, Louise Terryn, Hans Verbeeck
2025 J jnl
CoRR
Zihao Zou, Ziyuan Qu, Xi Peng, Vivek Boominathan, Adithya Pediredla, Praneeth Chakravarthula
2025 J jnl
CoRR
Ricardo Santos, André V. Carreiro, Xi Peng, Hugo Gamboa, Holger Fröhlich
2025 J jnl
Image Vis. Comput.
Wenxin Wang, Boyun Li, Wanli Liu, Xi Peng, Yuanbiao Gou
2025 J jnl
IEEE Trans. Vis. Comput. Graph.
Guaneen Tong, Johnathan Chi-Ho Leung, Xi Peng, Haosheng Shi, Liujie Zheng, Shengze Wang, Arryn Carlos O'Brien, Ashley Paula-Ann Neall, Grace Fei, Martim Gaspar, Praneeth Chakravarthula
2025 A* conf
VR
Xi Peng, Kenneth Chen, Iran Roman, Juan Pablo Bello, Qi Sun, Praneeth Chakravarthula
2025 J jnl
Comput. Mater. Continua
Xi Peng, Peng Jia, Ximing Fan, Jiayong Liu
2025 B conf
SMC
Yandong Liu, Jiangnan Liu, Xi Peng, Shengnan Hu
2025 J jnl
CoRR
Haobin Li, Mouxing Yang, Xi Peng
2025 A* conf
ISMAR
Xi Peng, Colin Groth, Daniel Jiménez Navarro, Zihao Zou, Yan Zhu, Ana Serrano, Karol Myszkowski, Qi Sun, Praneeth Chakravarthula
2024 conf
SIGGRAPH (Conference Paper Track)
Daniel Jiménez Navarro, Xi Peng, Yunxiang Zhang, Karol Myszkowski, Hans-Peter Seidel, Qi Sun, Ana Serrano
2024 J jnl
Remote. Sens.
YuanYuan Li, Shuguang Liu, Maochou Liu, Rui Guo, Yi Shi, Xi Peng, Shuailong Feng
2024 J jnl
BMC Medical Informatics Decis. Mak.
Le Li, Jingyuan Guan, Xi Peng, Likun Zhou, Zhuxin Zhang, Ligang Ding, Lihui Zheng, Lingmin Wu, Zhicheng Hu, Limin Liu, Yan Yao
2024 A* conf
ISMAR
Fengze Zhang, Yunxiang Zhang, Xi Peng, Sky Achitoff, Paul M. Torrens, Qi Sun
2024 J jnl
IEEE Trans. Vis. Comput. Graph.
Xi Peng, Yunxiang Zhang, Daniel Jiménez Navarro, Ana Serrano, Karol Myszkowski, Qi Sun
2023 J jnl
Axioms
Qiuwei Yang, Xi Peng
2023 J jnl
Comput. Secur.
Yan Wang, Peng Jia, Xi Peng, Cheng Huang, Jiayong Liu
2023 conf
ICCAI
Xiaofan Zhao, Qingyu Cai, Xi Peng, Hao Sun, Shijue Zheng
2023 J jnl
IEEE Trans. Mob. Comput.
Jingxiang Liu, Jian Peng, Wenzheng Xu, Weifa Liang, Tang Liu, Xi Peng, Zichuan Xu, Zheng Li, Xiaohua Jia
2023 Misc conf
ISWC
Zhenwei Tang, Shichao Pei, Xi Peng, Fuzhen Zhuang, Xiangliang Zhang, Robert Hoehndorf
2023 J jnl
CoRR
Amani Kiruga, Xi Peng
2023 J jnl
Nucleic Acids Res.
Yangfeng Chen, Xingliang Zhang, Xi Peng, Yicheng Jin, Peiwen Ding, Jiedan Xiao, Changxiao Li, Fei Wang, Ashley Chang, Qizhen Yue, Mingyi Pu, Peixin Chen, Jiayi Shen, Mengrou Li, Tengfei Jia, Haoyu Wang, Li Huang, Guoji Guo, Wensheng Zhang, Hebin Liu, Xiangdong Wang, Dongsheng Chen
2023 B conf
ICPADS
Longxia Huang, Xi Peng, Mengmeng Yang
2023 J jnl
Axioms
Shanshan Cao, Qiuwei Yang, Xi Peng
2022 J jnl
Neurocomputing
Jiaxin Liu, Xucheng Song, Yingjie Zhou, Xi Peng, Yanru Zhang, Pei Liu, Dapeng Wu, Ce Zhu
2022 J jnl
CoRR
Xi Peng, Zhenwei Tang, Maxat Kulmanov, Kexin Niu, Robert Hoehndorf
2022 J jnl
Remote. Sens.
Yamei Shu, Shuguang Liu, Zhao Wang, Jingfeng Xiao, Yi Shi, Xi Peng, Haiqiang Gao, Yingping Wang, Wenping Yuan, Wende Yan, Ying Ning, Qinyuan Li
2022 J jnl
CoRR
Zhenwei Tang, Tilman Hinnerichs, Xi Peng, Xiangliang Zhang, Robert Hoehndorf
2022 J jnl
CoRR
Zhenwei Tang, Shichao Pei, Xi Peng, Fuzhen Zhuang, Xiangliang Zhang, Robert Hoehndorf
2022 J jnl
Inf. Sci.
Chuan Luo, Jian Zheng, Tianrui Li, Hongmei Chen, Yanyong Huang, Xi Peng
2022 J jnl
Symmetry
Qiuwei Yang, Zhikun Ba, Zhuo Zhao, Xi Peng, Yun Sun
2022 A* conf
CVPR
Nathaniel Merrill, Yuliang Guo, Xingxing Zuo, Xinyu Huang, Stefan Leutenegger, Xi Peng, Liu Ren, Guoquan Huang
2022 J jnl
CoRR
Nathaniel Merrill, Yuliang Guo, Xingxing Zuo, Xinyu Huang, Stefan Leutenegger, Xi Peng, Liu Ren, Guoquan Huang
2021 J jnl
Remote. Sens.
Haiqiang Gao, Shuguang Liu, Weizhi Lu, Andrew R. Smith, Ruben Valbuena, Wende Yan, Zhao Wang, Li Xiao, Xi Peng, Qinyuan Li, Yujun Feng, Morag McDonald, Tim Pagella, Juyang Liao, Zhenming Wu, Gui Zhang
2021 conf
DSIE
Xi Peng, Jiu Zhou
2021 B conf
GLOBECOM
Xi Peng, Jianquan Wang, Sa Xiao, Wanbin Tang
2021 J jnl
Remote. Sens.
Zhao Wang, Shuguang Liu, Ying-Ping Wang, Ruben Valbuena, Yiping Wu, Mykola Kutia, Yi Zheng, Weizhi Lu, Yu Zhu, Meifang Zhao, Xi Peng, Haiqiang Gao, Shuailong Feng, Yi Shi
2020 J jnl
IEEE Access
Xi Peng, Liang Liu, Lei Zhang
2020 J jnl
CoRR
Qirui Li, Xiaoming Liu, Chao Shen, Xi Peng, Yadong Zhou, Xiaohong Guan
2020 J jnl
BioData Min.
Qichao Hu, Shizhang Wei, Jianxia Wen, Wenwen Zhang, Yinxiao Jiang, Caiyan Qu, Junbao Xiang, Yanling Zhao, Xi Peng, Xiao Ma
2019 J jnl
CoRR
Jiaxin Liu, Xucheng Song, Yingjie Zhou, Xi Peng, Yanru Zhang, Pei Liu, Dapeng Oliver Wu
2016 conf
ICSAI
Xi Peng, Yongchao Liang, Zhiping Luo, Feilai Pan, Long Li
2016 conf
ICPHM
Xi Peng, Chao Zhang, Yang Yu, Yong Zhou
2016 B conf
ICPR
Xi Peng, Nalini K. Ratha, Sharathchandra Pankanti
2015 A* conf
IJCAI
Zhiding Yu, Weiyang Liu, Wenbo Liu, Xi Peng, Zhuo Hui, B. V. K. Vijaya Kumar
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