Xiangrui Meng

74 papers A* 4A 3B 2C 2Journal 50Unranked 13
YearRankTypeTitle / Venue / Authors
2026 J jnl
Multim. Syst.
Huaping Zhou, Jin Wu, Xiangrui Meng, Kelei Sun, Tao Wu, Bing Deng
2026 J jnl
Digit. Commun. Networks
Guangfu Wu, Xiangrui Meng, Changlin Chen, Biqun Xiang
2026 J jnl
Inf. Process. Manag.
Chunkai Zhang, Xiangrui Meng, Huaijin Hao
2025 J jnl
CoRR
Xiangrui Meng, Ying Tan
2025 conf
ICSI (1)
Xiangrui Meng, Ying Tan
2025 C conf
ICCD
Qiyang Zheng, Hao Hu, Hao Huang, Yanqi Pan, Yifeng Zhang, Wen Xia, Xiangrui Meng, Xudong Li
2025 J jnl
Adv. Math. Commun.
Xiangrui Meng, Jian Gao, Fang-Wei Fu
2025 J jnl
Cryptogr. Commun.
Xiangdi Zeng, Xiangrui Meng, Jian Gao, Fang-Wei Fu
2025 J jnl
Comput. Appl. Math.
Daotong Qiu, Xiaotong Hou, Xiangrui Meng, Jian Gao, Jiafu Mi, Fang-Wei Fu, Lei Jian
2025 J jnl
Neurocomputing
Xianhe Cheng, Peng Zhai, Dingkang Yang, Xiangrui Meng, Yang Xia, Lihua Zhang
2025 J jnl
Inf. Fusion
Haoqian Chang, Xiangqian Wang, Alexandra I. Cristea, Xiangrui Meng, Zuxiang Hu, Ziqi Pan
2025 J jnl
Reliab. Eng. Syst. Saf.
Xiangrui Meng, Li Tian, Juncai Liu, Qingtong Jin
2025 J jnl
IEEE Trans. Inf. Theory
Xiangrui Meng, Jian Gao, Qingxiang Cui, Fang-Wei Fu
2025 B conf
IWQoS
Jiarui Wang, Xiangyu Zou, Wen Xia, Hao Hu, Xiangrui Meng, Xudong Li
2024 J jnl
IEEE J. Sel. Top. Appl. Earth Obs. Remote. Sens.
Yuhao Wen, Zhimin Zhang, Xiangrui Meng, Zongsen Lv, Zhen Chen, Yifei Liu, Huaitao Fan, Lei Zhang
2024 J jnl
Reliab. Eng. Syst. Saf.
Xiangrui Meng, Li Tian, Chao Li, Juncai Liu
2024 J jnl
CoRR
Yuheng Cheng, Ceyao Zhang, Zhengwen Zhang, Xiangrui Meng, Sirui Hong, Wenhao Li, Zihao Wang, Zekai Wang, Feng Yin, Junhua Zhao, Xiuqiang He
2024 J jnl
IEEE Trans. Geosci. Remote. Sens.
Zhaobo Chen, Wei Wang, Yongwei Zhang, Yunkai Deng, Zhimin Zhang, Xiangrui Meng
2024 J jnl
Int. J. Mach. Learn. Cybern.
Xiangqian Wang, Ningke Xu, Xiangrui Meng
2024 J jnl
Appl. Intell.
Xiangrui Meng, Huan Zhao, Ting Shu, Junhua Zhao, Qilin Wan
2024 J jnl
Swarm Evol. Comput.
Xiangrui Meng, Ying Tan
2024 J jnl
Discret. Math.
Xiangrui Meng, Jian Gao, Fang-Wei Fu
2024 A* conf
AAAI
Xiangrui Meng, Ying Tan
2024 J jnl
Reliab. Eng. Syst. Saf.
Juncai Liu, Li Tian, Meng Yang, Xiangrui Meng
2024 J jnl
Finite Fields Their Appl.
Xiangrui Meng, Jian Gao, Fang-Wei Fu
2023 J jnl
IEEE Geosci. Remote. Sens. Lett.
Xiangrui Meng, Zhimin Zhang, Wei Wang, Jinsong Qiu, Zhen Chen, Huaitao Fan
2023 A conf
AAMAS
Xiangrui Meng, Ying Tan
2023 J jnl
Discret. Math.
Jian Gao, Yaozong Zhang, Xiangrui Meng, Fang-Wei Fu
2023 J jnl
Des. Codes Cryptogr.
Xiangrui Meng, Jian Gao, Fang-Wei Fu, Fanghui Ma
2023 J jnl
Finite Fields Their Appl.
Jian Gao, Xiangrui Meng, Fang-Wei Fu
2023 J jnl
J. Appl. Math. Comput.
Shuyao Wang, Jian Gao, Xiangrui Meng, Fanghui Ma
2022 J jnl
Remote. Sens.
Jinsong Qiu, Zhimin Zhang, Zhen Chen, Shuo Han, Wei Wang, Yuhao Wen, Xiangrui Meng, Huaitao Fan
2022 J jnl
Remote. Sens.
Yuhao Wen, Zhimin Zhang, Zhen Chen, Jinsong Qiu, Mingshan Ren, Xiangrui Meng
2022 J jnl
Int. J. Inf. Coding Theory
Xiangrui Meng, Vidya Sagar, Ritumoni Sarma
2022 J jnl
Adv. Math. Commun.
Xiangrui Meng, Jian Gao
2022 J jnl
IEEE Geosci. Remote. Sens. Lett.
Xiangrui Meng, Zhimin Zhang, Wei Wang, Chuanzhao Han, Zhen Chen, Jinsong Qiu, Yuhao Wen
2022 conf
ICCSIE
Shuo Zhang, Xiangrui Meng
2022 J jnl
Sensors
Ningke Xu, Xiangqian Wang, Xiangrui Meng, Haoqian Chang
2022 J jnl
CoRR
Jian Gao, Xiangrui Meng, Fang-Wei Fu
2022 J jnl
IEEE Geosci. Remote. Sens. Lett.
Zhen Chen, Zhimin Zhang, Wei Wang, Qingchao Zhao, Yuhao Wen, Xiangrui Meng
2022 J jnl
Des. Codes Cryptogr.
Jian Gao, Xiangrui Meng, Fang-Wei Fu
2021 J jnl
IEEE Access
Xiaotong Hou, Xiangrui Meng, Jian Gao
2021 conf
ROBIO
Xiangrui Meng, Shuang Liang, Zhiqiang Cao, Zhonghui Li, Shuo Wang
2020 conf
PRCV (1)
Rong Wang, Wenzhong Zha, Xiangrui Meng, Fanle Meng, Yuhang Wu, Jianjun Ge, Dongbing Gu
2019 J jnl
IEEE Access
Zhixia Cui, Xiangrui Meng, Xiangqian Wang, Keliang Wang
2019 conf
ROBIO
Kang Li, Wenzhong Zha, Xiangrui Meng, Xiaoguang Zhao
2018 C conf
IECON
Xiangrui Meng, Jun Cai, Yelan Wu, Shuang Liang, Zhiqiang Cao, Shuo Wang
2017 A conf
CIKM
Ariyam Das, Ishan Upadhyaya, Xiangrui Meng, Ameet Talwalkar
2016 conf
ROBIO
Xiangrui Meng, Chao Zhou, Zhiqiang Cao, Leijie Zhang, Xilong Liu, Shuo Wang
2016 J jnl
Commun. ACM
Matei Zaharia, Reynold S. Xin, Patrick Wendell, Tathagata Das, Michael Armbrust, Ankur Dave, Xiangrui Meng, Josh Rosen, Shivaram Venkataraman, Michael J. Franklin, Ali Ghodsi, Joseph Gonzalez, Scott Shenker, Ion Stoica
2016 B conf
ASONAM
Huan Gui, Haishan Liu, Xiangrui Meng, Anmol Bhasin, Jiawei Han
2016 J jnl
Proc. IEEE
Jiyan Yang, Xiangrui Meng, Michael W. Mahoney
2016 J jnl
J. Mach. Learn. Res.
Xiangrui Meng, Joseph K. Bradley, Burak Yavuz, Evan Randall Sparks, Shivaram Venkataraman, Davies Liu, Jeremy Freeman, D. B. Tsai, Manish Amde, Sean Owen, Doris Xin, Reynold Xin, Michael J. Franklin, Reza Zadeh, Matei Zaharia, Ameet Talwalkar
2016 A* conf
KDD
Reza Bosagh Zadeh, Xiangrui Meng, Alexander Ulanov, Burak Yavuz, Li Pu, Shivaram Venkataraman, Evan Randall Sparks, Aaron Staple, Matei Zaharia
2016 conf
SIGMOD Conference
Shivaram Venkataraman, Zongheng Yang, Davies Liu, Eric Liang, Hossein Falaki, Xiangrui Meng, Reynold Xin, Ali Ghodsi, Michael J. Franklin, Ion Stoica, Matei Zaharia
2016 J jnl
SIAM J. Comput.
Kenneth L. Clarkson, Petros Drineas, Malik Magdon-Ismail, Michael W. Mahoney, Xiangrui Meng, David P. Woodruff
2015 J jnl
CoRR
Jiyan Yang, Xiangrui Meng, Michael W. Mahoney
2015 J jnl
CoRR
Xiangrui Meng, Joseph K. Bradley, Burak Yavuz, Evan Randall Sparks, Shivaram Venkataraman, Davies Liu, Jeremy Freeman, D. B. Tsai, Manish Amde, Sean Owen, Doris Xin, Reynold Xin, Michael J. Franklin, Reza Zadeh, Matei Zaharia, Ameet Talwalkar
2015 conf
SIGMOD Conference
Michael Armbrust, Reynold S. Xin, Cheng Lian, Yin Huai, Davies Liu, Joseph K. Bradley, Xiangrui Meng, Tomer Kaftan, Michael J. Franklin, Ali Ghodsi, Matei Zaharia
2015 J jnl
CoRR
Reza Bosagh Zadeh, Xiangrui Meng, Burak Yavuz, Aaron Staple, Li Pu, Shivaram Venkataraman, Evan Randall Sparks, Alexander Ulanov, Matei Zaharia
2014 J jnl
SIAM J. Sci. Comput.
Xiangrui Meng, Michael A. Saunders, Michael W. Mahoney
2014 J jnl
SIAM J. Sci. Comput.
Jiyan Yang, Xiangrui Meng, Michael W. Mahoney
2013 A* conf
STOC
Xiangrui Meng, Michael W. Mahoney
2013 J jnl
CoRR
Jiyan Yang, Xiangrui Meng, Michael W. Mahoney
2013 conf
ICML (3)
Jiyan Yang, Xiangrui Meng, Michael W. Mahoney
2013 conf
ICML (3)
Xiangrui Meng, Michael W. Mahoney
2013 conf
ICML (3)
Xiangrui Meng
2013 conf
AsiaSim
Xiangrui Meng, Linxuan Zhang, Mian Wang
2013 A* conf
SODA
Kenneth L. Clarkson, Petros Drineas, Malik Magdon-Ismail, Michael W. Mahoney, Xiangrui Meng, David P. Woodruff
2012 J jnl
CoRR
Xiangrui Meng, Michael W. Mahoney
2012 J jnl
CoRR
Kenneth L. Clarkson, Petros Drineas, Malik Magdon-Ismail, Michael W. Mahoney, Xiangrui Meng, David P. Woodruff
2011 J jnl
CoRR
Xiangrui Meng, Michael A. Saunders, Michael W. Mahoney
2011 A conf
RecSys
Nathan Nan Liu, Xiangrui Meng, Chao Liu, Qiang Yang
2006 conf
ICC
Xiangrui Meng, Kun Tan, Qian 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"