Weiping Zhang

65 papers A* 1A 1C 2Journal 48Unranked 13
YearRankTypeTitle / Venue / Authors
2026 J jnl
CoRR
Xiang Fu, Shiman Meng, Weiping Zhang, Luanzheng Guo, Kento Sato, Dong H. Ahn, Ignacio Laguna, Gregory L. Lee, Martin Schulz
2026 J jnl
Comput. Stat. Data Anal.
Zhi Zheng, Weiping Zhang, Yu Chen
2026 J jnl
Comput. Stat. Data Anal.
Jiaqi Wu, Weiping Zhang
2026 J jnl
CoRR
Xin Huang, Weiping Zhang, Shiman Meng, Wubiao Xu, Xiang Fu, Luanzheng Guo, Kento Sato
2025 J jnl
J. Syst. Sci. Complex.
Mengxi Wei, Zhi Zheng, Weiping Zhang
2025 conf
SIGSOFT FSE Companion
Bo Jiang, Fancheng Shu, Yuyang Cui, Xiangjie Wang, Peng Tang, Lei Wang, Weiping Zhang, Yong Wang, Guobin Wu
2025 J jnl
Inf.
Rui Xu, Renzhong Mao, Yihui Yang, Weiping Zhang, Yiteng Lin, Yining Zhang
2025 J jnl
Stat. Comput.
Jiaqi Wu, Weiping Zhang
2025 J jnl
CoRR
Jinyi Liu, Guoyang Zhao, Lijun Liu, Yiguang Hong, Weiping Zhang, Shuming Cheng
2024 conf
ICARM
Pengwen Xiong, Yuerou Wang, Weiping Zhang, Changcheng Wu
2024 conf
SC Workshops
Wubiao Xu, Xin Huang, Shiman Meng, Weiping Zhang, Luanzheng Guo, Kento Sato
2024 A conf
SC
Xiang Fu, Weiping Zhang, Shiman Meng, Xin Huang, Wubiao Xu, Luanzheng Guo, Kento Sato
2024 J jnl
CoRR
Xiang Fu, Weiping Zhang, Xin Huang, Shiman Meng, Wubiao Xu, Luanzheng Guo, Kento Sato
2024 conf
IPDPS (Workshops)
Xiang Fu, Xin Huang, Wubiao Xu, Weiping Zhang, Shiman Meng, Luanzheng Guo, Kento Sato
2024 J jnl
BMC Medical Imaging
Weiping Zhang, Jingling Wang, Li Chen
2024 C conf
CLUSTER
Xiang Fu, Shiman Meng, Weiping Zhang, Luanzheng Guo, Kento Sato, Dong H. Ahn, Ignacio Laguna, Gregory L. Lee, Martin Schulz
2024 J jnl
Stat. Comput.
Weitao Hu, Weiping Zhang
2024 J jnl
Comput. Stat. Data Anal.
Lihui Shao, Jiaqi Wu, Weiping Zhang, Yu Chen
2024 J jnl
J. Comput. Graph. Stat.
Jie Hu, Xiao Chen, Yu Chen, Weiping Zhang
2024 J jnl
Symmetry
Quan Liao, Hongmei Ma, Liqing Chen, Weiping Zhang, Chun-Hua Yuan
2024 conf
SC Workshops
Xin Huang, Wubiao Xu, Shiman Meng, Weiping Zhang, Xiang Fu, Luanzheng Guo, Kento Sato
2024 J jnl
Comput. Stat.
Huicong Yu, Jiaqi Wu, Weiping Zhang
2023 conf
IPDPS Workshops
Xiang Fu, Hao Tang, Huimin Liao, Xin Huang, Wubiao Xu, Shiman Meng, Weiping Zhang, Luanzheng Guo, Kento Sato
2023 J jnl
J. Syst. Sci. Complex.
Xiaolin Bo, Weiping Zhang
2023 J jnl
J. Multivar. Anal.
Tingnan Gong, Weiping Zhang, Yu Chen
2022 J jnl
Symmetry
Xinyun Liang, Zhifei Yu, Chun-Hua Yuan, Weiping Zhang, Liqing Chen
2022 J jnl
J. Multivar. Anal.
Lei Shu, Yu Chen, Weiping Zhang, Xueqin Wang
2021 conf
SmartIoT
Wenshan Huang, Ruhan Wang, Weiping Zhang, Junqi Guo
2021 J jnl
Remote. Sens.
Dongfeng Jia, Weiping Zhang, Yuhao Wang, Yanping Liu
2021 J jnl
SIAM J. Imaging Sci.
Xuefei Yan, David J. Brady, Weiping Zhang, Changzhi Yu, Yulin Jiang, Jianqiang Wang, Chao Huang, Zian Li, Zhan Ma
2021 J jnl
J. Medical Imaging Health Informatics
Keyong Zhao, Jing Tian, Lina Luo, Weiping Zhang, Jing Guo
2021 J jnl
IEEE Trans. Signal Inf. Process. over Networks
Yue Wang, Weiping Zhang, Heng Lian
2021 conf
DIONE
Yanping Zhang, Weiping Zhang
2021 J jnl
Complex.
Junfeng Yin, Haimeng Liu, Peiji Shi, Weiping Zhang
2021 J jnl
Comput. Methods Programs Biomed.
Hongqiang Xie, Tongtong Zhang, Weiwei Song, Shoujun Wang, Hongchang Zhu, Rumin Zhang, Weiping Zhang, Yong Yu, Yan Zhao
2021 J jnl
Remote. Sens.
Dongfeng Jia, Weiping Zhang, Yanping Liu
2020 J jnl
Comput. Stat.
Weiping Zhang, Feiyue Xie, Jiaxin Tan
2019 J jnl
IEEE Access
Weiping Zhang, Ziqiang Xu, Yu Chen, Jing Yang
2019 J jnl
J. Syst. Sci. Complex.
Jiangli Wang, Yu Chen, Weiping Zhang
2019 J jnl
J. Multivar. Anal.
Hongmei Lin, Xuejun Jiang, Heng Lian, Weiping Zhang
2019 J jnl
IEEE Access
Ye Tian, Weiping Zhang
2018 J jnl
J. Intell. Manuf.
Chao Liu, Peifeng Niu, Guoqiang Li, Yunpeng Ma, Weiping Zhang, Ke Chen
2018 J jnl
CoRR
Ye Tian, Weiping Zhang
2018 J jnl
计算机科学
Qian Lei, Cunming Hao, Weiping Zhang
2017 J jnl
Neural Process. Lett.
Chao Liu, Peifeng Niu, Guoqiang Li, Xia You, Yunpeng Ma, Weiping Zhang
2017 C conf
IECON
Weiping Zhang, Jie Li, Peng Mao
2017 J jnl
IEEE Geosci. Remote. Sens. Lett.
Chonglei Wang, Fukun Bi, Weiping Zhang, Liang Chen
2016 J jnl
BioData Min.
Yile Zhang, Yau Shu Wong, Jian Deng, Cristina Anton, Stephan Gabos, Weiping Zhang, Dorothy Yu Huang, Can Jin
2016 J jnl
J. Bioinform. Comput. Biol.
Jiao Chen, Tianhong Pan, Tianqing Pu, Biao Huang, Dorothy Yu Huang, Weiping Zhang, Stephan Gabos, Can Jin
2015 conf
WASA
Hao Qu, Longjiang Guo, Weiping Zhang, Jinbao Li, Meirui Ren
2014 J jnl
Comput. Biol. Chem.
Zhankun Xi, Swanand R. Khare, Aaron Cheung, Biao Huang, Tianhong Pan, Weiping Zhang, Fadi Ibrahim, Can Jin, Stephan Gabos
2014 J jnl
Stat. Comput.
Chenlei Leng, Weiping Zhang
2014 J jnl
Knowl. Based Syst.
Guoqiang Li, Peifeng Niu, Yunpeng Ma, Hongbin Wang, Weiping Zhang
2013 conf
IScIDE
Jiannan Chi, Lei Liu, Jiwei Liu, Changyin Sun, Weiping Zhang
2013 J jnl
Knowl. Based Syst.
Weiping Zhang, Peifeng Niu, Guoqiang Li, Pengfei Li
2013 J jnl
Comput. Biol. Chem.
Tianhong Pan, Swanand R. Khare, Fred Ackah, Biao Huang, Weiping Zhang, Stephan Gabos, Can Jin, Melinda Stampfl
2012 J jnl
Knowl. Based Syst.
Guoqiang Li, Peifeng Niu, Weiping Zhang, Yang Zhang
2012 J jnl
Appl. Soft Comput.
Guoqiang Li, Peifeng Niu, Chao Liu, Weiping Zhang
2012 J jnl
Neurocomputing
Peifeng Niu, Weiping Zhang
2011 J jnl
J. Syst. Sci. Complex.
Weiping Zhang, Laisheng Wei, Yu Chen
2010 J jnl
Bioinform.
Daniel L. Mace, Nicole Varnado, Weiping Zhang, Erwin Frise, Uwe Ohler
2010 A* conf
ICDE
Yi Zhang, Weiping Zhang, Jun Yang
2008 conf
ICYCS
Xiaoli Xiao, Min Huang, Weiping Zhang
2006 conf
IMSCCS (2)
Dan Yu, Weiping Zhang, Xinmeng Chen
1994 conf
ICMCS
Sha Guo, Wei Sun, Yi Deng, Wei Li, Qing Liu, Weiping Zhang
redb/extractors/apk_extractors/apk_resources.py
← Index redb/extractors/apk_extractors/apk_resources.py python
import hashlib
import inspect
import os
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 APKResource


# ─── Suspicious file types ──────────────────────────────────────────────
# File types that are suspicious when found inside res/ or assets/.
# Excludes javascript/html (extremely common in legitimate hybrid apps)
# and common media/font types that are normal APK content.
SUSPICIOUS_TYPES = {
    # Executables — no legitimate reason in assets/res
    "elf", "pebin", "macho", "dex", "apk",
    # Java containers — DexClassLoader target
    "jar",
    # Archives — rare in legitimate assets (~135:1 malware-to-benign ratio)
    "zip", "gzip", "7z", "xz", "tar", "bzip2", "rar", "7zip", "lzma",
    # Scripts with system execution capability
    "shell", "python", "powershell", "batch",
}

# ─── Entropy thresholds ─────────────────────────────────────────────────
# For unrecognized/unknown types: encrypted payloads typically land > 7.0
ENTROPY_HIGH_UNKNOWN = 7.0
# For recognized-but-non-image types: stricter threshold
ENTROPY_EXTREME = 7.85

# ─── Android-specific binary format magic bytes ─────────────────────────
# These formats are common in legitimate APKs but unknown to Magika,
# causing misclassification (e.g., AXML → "gzip", profm → "unknown").
AXML_MAGIC = b'\x03\x00\x08\x00'       # Android Binary XML (compiled res/*.xml)
ARSC_MAGIC = b'\x02\x00\x0c\x00'       # Android compiled resource table
ART_PROF_MAGIC = b'pro\x00'            # ART baseline profile
ART_PROFM_MAGIC = b'prm\x00'           # ART baseline profile metadata

# ─── Allowlisted paths ──────────────────────────────────────────────────
# Fixed, hardcoded paths in the Android build system that are always benign.
# ART profiles at these exact paths are shipped by Jetpack ProfileInstaller.
ALLOWLISTED_PATHS = {
    "assets/dexopt/baseline.prof",
    "assets/dexopt/baseline.profm",
}

# ─── Image handling ─────────────────────────────────────────────────────
# Magika-confirmed image types: high entropy is expected (lossy codecs
# like VP8/JPEG arithmetic-code toward entropy ~7.95-8.0 by design).
IMAGE_MAGIKA_TYPES = {"png", "webp", "jpeg", "gif", "bmp", "tiff", "ico"}
IMAGE_EXTENSIONS = {".png", ".webp", ".jpg", ".jpeg", ".gif", ".bmp", ".tiff", ".ico"}

# ─── Types Magika assigns when it can't identify the content ────────────
UNRECOGNIZED_MAGIKA_TYPES = {"unknown", "empty"}

# ─── Resource scan limits ───────────────────────────────────────────────
MAX_RESOURCE_FILES = 5000


class APKResourceExtractor(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.resources = []
        self.suspicious_files = []
        self.log.debug(inspect.currentframe().f_code.co_name)

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

    # ─── Core classification logic ──────────────────────────────────────

    def _identify_android_format(self, header: bytes) -> str | None:
        """
        Identify Android-specific binary formats that Magika doesn't know.
        Returns a corrected type label, or None to fall through to Magika.
        """
        if len(header) < 4:
            return None

        magic4 = header[:4]

        # Android Binary XML — all res/*.xml in a compiled APK.
        # Magika often misclassifies this as "gzip".
        if magic4 == AXML_MAGIC:
            return "android_binary_xml"

        # Android compiled resource table (resources.arsc chunks)
        if magic4 == ARSC_MAGIC:
            return "android_resource_table"

        # ART baseline profiles — high entropy (zlib inside) but benign.
        # The format is inert (method reference bitmaps/metadata, not
        # executable code) and some build configs place them at varying paths.
        if magic4 == ART_PROF_MAGIC:
            return "android_art_profile"
        if magic4 == ART_PROFM_MAGIC:
            return "android_art_profile_metadata"

        return None

    def _is_suspicious_resource(
        self, path: str, magika_type: str, entropy: float,
        android_type: str | None,
    ) -> bool:
        """
        Determine if a resource file is suspicious.

        Detection layers:
        1. Allowlisted paths → always benign
        2. Android-specific format override → reclassify Magika mislabels
        3. Image extension vs Magika type mismatch → encrypted blob detection
        4. Magika-confirmed images → benign regardless of entropy
        5. Suspicious type match → flag known-dangerous types
        6. High-entropy unknown blobs → likely encrypted payloads
        """

        # ── Layer 1: Allowlisted paths (hardcoded Android build artifacts) ──
        if path in ALLOWLISTED_PATHS:
            return False

        # ── Layer 2: Android-specific format detection ──────────────────────
        # Override Magika's label for formats it doesn't recognize.
        # All Android-specific formats (AXML, ARSC, ART profiles) are
        # legitimate build artifacts — never suspicious.
        if android_type is not None:
            return False

        # ── Layer 3: Image extension / Magika type mismatch ─────────────────
        # If the file extension claims "image" but Magika's content analysis
        # disagrees, this is a strong signal for an encrypted payload with
        # a fake image extension (e.g., ErrorFather's "rbyypivsnw.png").
        ext = os.path.splitext(path)[1].lower()
        if ext in IMAGE_EXTENSIONS and magika_type not in IMAGE_MAGIKA_TYPES:
            # Exception: Magika might label a valid image as "unknown" if
            # the file is very small (< ~16 bytes). Don't flag tiny files.
            if entropy > 5.0:
                return True

        # ── Layer 4: Magika-confirmed images → benign ───────────────────────
        # Lossy codecs (VP8, JPEG) produce entropy up to ~8.0 by design.
        # If Magika confirms image structure, high entropy is expected.
        if magika_type in IMAGE_MAGIKA_TYPES:
            return False

        # ── Layer 5: Known suspicious file types ────────────────────────────
        if magika_type in SUSPICIOUS_TYPES:
            return True

        # ── Layer 6: High-entropy unrecognized blobs ────────────────────────
        # Files Magika can't identify with high entropy are likely encrypted
        # payloads. Most Android malware packers store encrypted DEX/SO
        # payloads as opaque blobs with random names and no valid magic.
        if magika_type in UNRECOGNIZED_MAGIKA_TYPES and entropy > ENTROPY_HIGH_UNKNOWN:
            return True

        # ── Layer 7: Extreme entropy on any non-image recognized type ───────
        # Catches edge cases where Magika assigns a benign label (e.g.,
        # "xml", "txt") but the entropy is impossibly high for that format.
        if magika_type not in IMAGE_MAGIKA_TYPES and entropy > ENTROPY_EXTREME:
            return True

        return False

    # ─── Extraction pipeline ────────────────────────────────────────────

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

        try:
            from magika import Magika
            magika = Magika()
        except Exception as e:
            self.log.error(f"Failed to initialize Magika for {self.hash.sha256}: {e}")
            magika = None

        self.resources = []
        self.suspicious_files = []
        scanned = 0

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

        with zf:
            for info in zf.infolist():
                if info.is_dir():
                    continue
                if not (info.filename.startswith("res/") or
                        info.filename.startswith("assets/")):
                    continue

                if scanned >= MAX_RESOURCE_FILES:
                    self.log.warning(
                        f"Resource scan limit reached ({MAX_RESOURCE_FILES}), "
                        f"stopping resource enumeration"
                    )
                    break
                scanned += 1

                try:
                    data = zf.read(info.filename)
                except Exception as e:
                    self.log.warning(
                        f"Error reading resource {info.filename}: {e}"
                    )
                    continue

                try:
                    file_sha256 = hashlib.sha256(data).hexdigest()
                    file_entropy = round(self.calculate_entropy(data), 3)

                    # Read first bytes for Android-specific format detection
                    header = data[:16] if len(data) >= 16 else data

                    if magika:
                        try:
                            filetype = magika.identify_bytes(data).output.label
                        except Exception:
                            filetype = "unknown"
                    else:
                        filetype = "unknown"

                    # Identify Android-specific formats once, reuse for
                    # both stored type and suspicion classification
                    android_type = self._identify_android_format(header)
                    stored_type = android_type if android_type else filetype

                    suspicious = self._is_suspicious_resource(
                        path=info.filename,
                        magika_type=filetype,
                        entropy=file_entropy,
                        android_type=android_type,
                    )

                    resource = APKResource(
                        path=info.filename,
                        size=info.file_size,
                        sha256=file_sha256,
                        filetype_magika=stored_type,
                        entropy=file_entropy,
                    )

                    if suspicious:
                        resource.is_suspicious = True
                        self.suspicious_files.append(resource)

                    self.resources.append(resource)
                except Exception as e:
                    self.log.warning(
                        f"Error processing resource {info.filename}: {e}"
                    )
                    continue

        if not self.resources:
            return None

        return {
            "total_resource_count": len(self.resources),
            "total_resource_size": sum(r.size for r in self.resources),
            "suspicious_file_count": len(self.suspicious_files),
            "resources": self.resources,
            "suspicious_files": self.suspicious_files,
        }

    # ─── Export ──────────────────────────────────────────────────────────

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

            current_time = datetime.now(timezone.utc)
            data = []
            for res in self.resources:
                data.append([
                    self.sha256,
                    res.path,
                    res.size,
                    res.sha256,
                    res.filetype_magika,
                    res.entropy,
                    int(res.is_suspicious),
                    current_time,
                ])

            column_names = [
                'sha256', 'resource_path', 'resource_size',
                'resource_sha256', 'resource_magika', 'resource_entropy',
                'is_suspicious', 'analysis_date',
            ]

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

            return (data, column_names, column_type_names)

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