Hainan Zhang

19 papers Journal 13Unranked 6
YearRankTypeTitle / Venue / Authors
2026 J jnl
IEEE Trans. Consumer Electron.
Hualong Wu, Weizhe Zhang, Desheng Wang, Arun Kumar Sangaiah, Hainan Zhang, Wei Gao
2026 J jnl
Swarm Evol. Comput.
Haoxiang Qin, Yi Xiang, Hainan Zhang, Yuyan Han, Yuting Wang, Xinrui Tao, Yiping Liu
2026 J jnl
IEEE Trans. Ind. Electron.
Hainan Zhang, Changchun Hua, Jiannan Chen, Xi Luo, Jing Wei
2026 J jnl
Appl. Netw. Sci.
Wei Gao, Carlo Cattani, Haci Mehmet Baskonus, Hainan Zhang
2025 J jnl
RAIRO Theor. Informatics Appl.
Yaojun Chen, Hainan Zhang, Wei Gao
2025 J jnl
IEEE Trans. Syst. Man Cybern. Syst.
Changchun Hua, Hainan Zhang, Jiannan Chen, Xi Luo
2024 J jnl
Swarm Evol. Comput.
Hainan Zhang, Jianhou Gan, Juxiang Zhou, Wei Gao
2024 J jnl
Eng. Appl. Artif. Intell.
Hainan Zhang, Jianhou Gan, Juxiang Zhou, Wei Gao
2021 J jnl
Genom. Proteom. Bioinform.
Zhaowei Xu, Yang Li, Qing Lei, Likun Huang, Danyun Lai, Shujuan Guo, Hewei Jiang, Hongyan Hou, Yunxiao Zheng, Xuening Wang, Jiaoxiang Wu, Mingliang Ma, Bo Zhang, Hong Chen, Caizheng Yu, Junbiao Xue, Hainan Zhang, Huan Qi, Siqi Yu, Mingxi Lin, Yandi Zhang, Xiaosong Lin, Zongjie Yao, Huiming Sheng, Ziyong Sun, Feng Wang, Xionglin Fan, Sheng-ce Tao
2021 conf
NEMS
Yao Huang, Hainan Zhang, Guanhua Dun, Yuhua Li, Renrong Liang, Yi Yang, Dan Xie, He Tian, Tianling Ren
2021 J jnl
IEEE Trans. Syst. Man Cybern. Syst.
Mouquan Shen, Hainan Zhang, Sing Kiong Nguang, Choon Ki Ahn
2020 conf
IVSP
Hainan Zhang, Fang Meng, Yawen Han
2019 conf
IEEE SENSORS
Zheyu Li, Qiannan Xue, Qikun Wang, Hainan Zhang, Xuexin Duan
2019 J jnl
IEEE Access
Hainan Zhang, Xiaoming You
2019 conf
IEEE SENSORS
Cheng Zhou, Xiaoshuang Zhang, Hainan Zhang, Xuexin Duan
2018 J jnl
IEICE Trans. Inf. Syst.
Hainan Zhang, Yanjing Sun, Song Li, Wenjuan Shi, Chenglong Feng
2014 conf
TREC
Lei Chen, Hainan Zhang, Siying Li, Zhiyuan Ji, Qian Liu, Yue Liu, Dayong Wu, Xueqi Cheng
2012 J jnl
CoRR
Josh Ericson, Pietro Poggi-Corradini, Hainan Zhang
2012 conf
CCTA (2)
Hongxin Cao, Yuwang Yang, Zhiyuan Pei, Wenyu Zhang, Daokuo Ge, Yiran Sha, Weixin Zhang, Kunya Fu, Yan Liu, Yuli Chen, Hongjun Dai, Hainan Zhang
redb/extractors/apk_extractors/apk_native_libs.py
← Index redb/extractors/apk_extractors/apk_native_libs.py python
import fnmatch
import hashlib
import inspect
from datetime import datetime, timezone
from typing import Any

from redb.extractors.enum import Tag
from redb.extractors.apk_extractor import APKExtractor
from redb.models.dataclasses import APKNativeLib

# Known packer/protector native library names
KNOWN_PACKER_LIBS = {
    # Jiagu (360/Qihoo)
    "libjiagu.so", "libjiagu_a64.so", "libjiagu_x86.so", "libjiagu_x64.so",
    # Bangcle/SecNeo
    "libsecexe.so", "libsecmain.so", "libSecShell.so",
    # Baidu
    "libbaiduprotect.so",
    # Tencent (Legu)
    "libtxAppProtect.so", "libBugly.so",
    # iJiami
    "libexec.so", "libexecmain.so",
    # Alibaba
    "libmobisec.so", "libaliprotect.so",
    # APKProtect
    "libAPKProtect.so",
    # Pangxie (Pangolin)
    "libdexjni.so",
    # DexProtector
    "libdexprotector.so",
    # AppSolid
    "libAppSolid.so",
    # Kiwisec
    "libkwscmm.so",
    # DingXiang
    "libx3g.so",
    # NQ Shield
    "libnqshield.so",
    # Generic / other
    "libprotectClass.so",
    "libDexHelper.so",
    "libdexloader.so",
    "libfdog.so",
}

# Glob-style patterns for packer libs (e.g. libshella-*.so)
KNOWN_PACKER_PATTERNS = [
    "libshella-*.so",
    "libshell-super.*.so",
]


def is_known_packer_lib(filename):
    """Check if a native library filename matches known packer signatures."""
    if filename in KNOWN_PACKER_LIBS:
        return True
    for pattern in KNOWN_PACKER_PATTERNS:
        if fnmatch.fnmatch(filename, pattern):
            return True
    return False


class APKNativeLibExtractor(APKExtractor):

    def __init__(
        self, filepath, log, exporters=None, index_prefix=None,
        known_benign=False, known_malicious=False,
        apk=None,
    ):
        super().__init__(
            filepath, log, exporters, index_prefix,
            known_benign, known_malicious, apk,
        )
        self.native_libs = []
        self.abis = set()
        self.log.debug(inspect.currentframe().f_code.co_name)

    def tag(self):
        return Tag.APK_NATIVE_LIBS.value

    def extract(self):
        if not self._is_valid_apk():
            self.log.error(f"Invalid APK for {self.hash.sha256}")
            return None

        self.native_libs = []
        self.abis = set()

        zf = self._get_zip_file()
        if not zf:
            return None

        with zf:
            for info in zf.infolist():
                if not (info.filename.startswith("lib/") and info.filename.endswith(".so")):
                    continue
                parts = info.filename.split("/")
                if len(parts) < 3:
                    continue

                abi = parts[1]
                filename = parts[-1]
                self.abis.add(abi)

                try:
                    data = zf.read(info.filename)
                    lib_sha256 = hashlib.sha256(data).hexdigest()
                except Exception as e:
                    self.log.warning(f"Error reading native lib {info.filename}: {e}")
                    continue

                self.native_libs.append(APKNativeLib(
                    abi=abi,
                    filename=filename,
                    size=info.file_size,
                    sha256=lib_sha256,
                    is_known_packer=is_known_packer_lib(filename),
                ))

        if not self.native_libs:
            return None

        return {
            "native_lib_count": len(self.native_libs),
            "abis": sorted(self.abis),
            "native_libs": self.native_libs,
            "known_packer_libs": [
                lib for lib in self.native_libs if lib.is_known_packer
            ],
        }

    def prepare_export_data(self, exporter_type: str) -> Any:
        if exporter_type == "ClickHouseExporter":
            if not self.native_libs:
                return None

            current_time = datetime.now(timezone.utc)
            data = []
            for lib in self.native_libs:
                data.append([
                    self.sha256,
                    lib.abi,
                    lib.filename,
                    lib.size,
                    lib.sha256,
                    int(lib.is_known_packer),
                    current_time,
                ])

            column_names = [
                'sha256', 'lib_abi', 'lib_filename', 'lib_size',
                'lib_sha256', 'lib_is_known_packer', 'analysis_date',
            ]

            column_type_names = [
                'FixedString(64)', 'LowCardinality(String)', 'String', 'UInt64',
                'FixedString(64)', 'UInt8', "DateTime64(3, 'UTC')",
            ]

            return (data, column_names, column_type_names)

    def get_clickhouse_table(self) -> str:
        return "redb_apk_native_libs"