Kangkang Sun

61 papers C 1Journal 48Unranked 12
YearRankTypeTitle / Venue / Authors
2026 J jnl
IEEE Trans. Very Large Scale Integr. Syst.
Jian Guan, Jingjing Liu, Wenji Mo, Feng Yan, Kangkang Sun, Weijie Ge, Zhipeng Li
2026 J jnl
CoRR
Kangkang Sun, Jun Wu, Jianhua Li, Minyi Guo, Xiuzhen Che, Jianwei Huang
2026 J jnl
Commun. Nonlinear Sci. Numer. Simul.
Da Chen, Kaibo Shi, Oh-Min Kwon, Xiao Cai, Yanbin Sun, Shiping Wen, Kangkang Sun
2026 J jnl
CoRR
Kangkang Sun, Jianhua Li, Xiuzhen Chen, Minyi Guo
2026 J jnl
IEEE Trans Autom. Sci. Eng.
Liguo Tan, Yongcheng Xiong, Guanghui Wen, Kangkang Sun, Keyou You
2026 J jnl
IEEE Trans. Cybern.
Wenhai Qi, Feiyue Shen, Guangdeng Zong, Shun-Feng Su, Jinde Cao, Kangkang Sun
2026 J jnl
IEEE Trans. Aerosp. Electron. Syst.
Kangkang Sun, Qi Zheng, Yuhan Liu, Jianbin Qiu
2026 J jnl
CoRR
Kangkang Sun, Jianhua Li, Xiuzhen Chen, Weizhi Meng, Minyi Guo
2025 J jnl
IEEE Trans. Very Large Scale Integr. Syst.
Kangkang Sun, Jingjing Liu, Feng Yan, Yuan Ren, Ruihuang Wu, Bingjun Xiong, Zhipeng Li, Jian Guan
2025 J jnl
IEEE Trans. Very Large Scale Integr. Syst.
Jingjing Liu, Yuxuan Huang, Weijie Ge, Wenji Mo, Yuchen Wang, Feng Yan, Kangkang Sun, Bingjun Xiong, Zhipeng Li, Jian Guan
2025 J jnl
IEEE Trans. Biomed. Circuits Syst.
Kangkang Sun, Jingjing Liu, Feng Yan, Haoning Sun, Yafei Zhang, Yuan Ren, Linfei Huang, Yao Pi, Wanqing Wu, Jian Guan
2025 conf
ICIRA (3)
Yiren Huang, Xu Liang, Guotao Li, Tingting Su, Hui Li, Kangkang Sun, Zihe Feng, Xinuo Zhang, Yong Hai
2025 J jnl
IEEE Trans. Very Large Scale Integr. Syst.
Jingjing Liu, Ruihuang Wu, Haoning Sun, Bingjun Xiong, Feng Yan, Kangkang Sun, Zhipeng Li, Jian Guan
2025 J jnl
CoRR
Kangkang Sun, Jun Wu, Minyi Guo, Jianhua Li, Jianwei Huang
2025 J jnl
CoRR
Duoxun Tang, Xi Xiao, Guangwu Hu, Kangkang Sun, Xiao Yang, Dongyang Chen, Qing Li, Yongjie Yin, Jiyao Wang
2025 J jnl
IEEE Trans. Syst. Man Cybern. Syst.
Yannan Bi, Feng Peng, Kangkang Sun, Tong Wang, Jianbin Qiu
2025 J jnl
Comput. Methods Programs Biomed.
Nannan Cao, Qilin Li, Kangkang Sun, Heng Zhang, Jiangyi Ding, Ziyi Wang, Wei Chen, Liugang Gao, Jiawei Sun, Kai Xie, Xinye Ni
2025 J jnl
J. Frankl. Inst.
Kaisheng Zhang, Yujie Zhang, Qiang Li, Dongmei Fan, Kangkang Sun
2025 J jnl
IEEE Trans. Aerosp. Electron. Syst.
Kangkang Sun, Qi Zheng, Rongyu Jin
2025 J jnl
IEEE Trans Autom. Sci. Eng.
Kangkang Sun, Xiaochun Zhang
2024 C conf
ISCAS
Feng Yan, Bingjun Xiong, Wenji Mo, Kangkang Sun, Jian Guan, Jingjing Liu
2024 J jnl
Int. J. Circuit Theory Appl.
Yuxuan Huang, Jingjing Liu, Feng Yan, Yuchen Wang, Kangkang Sun, Weijie Ge
2024 conf
BioCAS
Haoning Sun, Kangkang Sun, Yuchen Wang, Wenji Mo, Feng Yan, Jingjing Liu
2024 conf
MLNLP
Xiaoli Zheng, Yonghong Tian, Chang Ma, Kangkang Sun
2024 conf
IALP
Kangkang Sun, Yonghong Tian, Xiaoli Zheng, Chang Ma
2024 J jnl
IEEE Internet Things J.
Kangkang Sun, Hansong Xu, Kun Hua, Xi Lin, Gaolei Li, Tigang Jiang, Jianhua Li
2024 J jnl
IEEE Internet Things J.
Kangkang Sun, Lizheng Liu, Qianqian Pan, Jianhua Li, Jun Wu
2024 J jnl
IEEE Trans. Veh. Technol.
Kangkang Sun, Jun Wu, Qianqian Pan, Xi Zheng, Jianhua Li, Shui Yu
2024 J jnl
BMC Medical Imaging
Wei Chen, Qixuan Li, Heng Zhang, Kangkang Sun, Wei Sun, Zhuqing Jiao, Xinye Ni
2024 J jnl
Autom.
Runsheng Guo, Jianbin Qiu, Tong Wang, Kangkang Sun
2024 J jnl
IEEE Internet Things J.
Kangkang Sun, Jun Wu, Ali Kashif Bashir, Jianhua Li, Hansong Xu, Qianqian Pan, Yasser D. Al-Otaibi
2024 conf
SmartCloud
Kangkang Sun, Jun Wu, Jianhua Li
2024 conf
CSAI
Chang Ma, Hong Yong Tian, Li Xiao Zheng, Kangkang Sun
2023 conf
APCCAS
Kangkang Sun, Feng Yan, Huan Wu, Jingjing Liu
2023 conf
APCCAS
Feng Yan, Kangkang Sun, Zhipeng Li, Jian Guan, Bingjun Xiong, Jingjing Liu
2023 conf
APCCAS
Yuxuan Huang, Feng Yan, Kangkang Sun, Jingjing Liu
2023 conf
ICECS
Kangkang Sun, Hua Wu, Jian Guan, Zhipeng Li, Jingjing Liu
2023 conf
EISA
Kangkang Sun, Xiaojin Zhang, Xi Lin, Gaolei Li, Jing Wang, Jianhua Li
2023 J jnl
CoRR
Kangkang Sun, Xiaojin Zhang, Xi Lin, Gaolei Li, Jing Wang, Jianhua Li
2022 J jnl
IEEE Trans. Fuzzy Syst.
Jianbin Qiu, Tong Wang, Kangkang Sun, Imre J. Rudas, Huijun Gao
2022 J jnl
IEEE Trans. Cybern.
Kangkang Sun, Runsheng Guo, Jianbin Qiu
2021 J jnl
IEEE Trans. Syst. Man Cybern. Syst.
Kangkang Sun, Jianbin Qiu, Hamid Reza Karimi, Huijun Gao
2021 J jnl
IEEE Trans. Fuzzy Syst.
Min Ma, Kangkang Sun, Tong Wang, Jianbin Qiu
2021 J jnl
IEEE Trans. Fuzzy Syst.
Kangkang Sun, Jianbin Qiu, Hamid Reza Karimi, Yili Fu
2021 J jnl
Inf. Sci.
Kangkang Sun, Hamid Reza Karimi, Jianbin Qiu
2021 J jnl
IEEE Trans. Fuzzy Syst.
Kangkang Sun, Lu Liu, Jianbin Qiu, Gang Feng
2021 J jnl
Neural Networks
Kangkang Sun, Jianbin Qiu, Hamid Reza Karimi
2021 J jnl
Neural Networks
Daoguang Yang, Hamid Reza Karimi, Kangkang Sun
2020 J jnl
IEICE Electron. Express
Yongsheng Yin, Kangkang Sun, Hongmei Chen, Xiaolei Wang, Lu Liu, Honghui Deng, Xu Meng, Kun Li, Zhongfeng Wang
2020 J jnl
Wirel. Commun. Mob. Comput.
Na Ye, Xin Qin, Lili Dong, Xiang Zhang, Kangkang Sun
2020 J jnl
IEEE Trans. Cybern.
Jianbin Qiu, Kangkang Sun, Imre J. Rudas, Huijun Gao
2020 conf
ICACI
Kangkang Sun, Runsheng Guo, Jianbin Qiu
2020 J jnl
Reliab. Eng. Syst. Saf.
Da Cui, Guoqiang Wang, Yanpeng Lu, Kangkang Sun
2019 J jnl
IEEE Trans. Fuzzy Syst.
Kangkang Sun, Shaoshuai Mou, Jianbin Qiu, Tong Wang, Huijun Gao
2019 J jnl
IEEE Trans. Cybern.
Yongming Li, Kangkang Sun, Shaocheng Tong
2019 J jnl
IEEE Trans. Fuzzy Syst.
Jianbin Qiu, Kangkang Sun, Tong Wang, Huijun Gao
2018 J jnl
IEEE Trans. Fuzzy Syst.
Yongming Li, Kangkang Sun, Shaocheng Tong
2018 J jnl
IEEE Trans. Cybern.
Kangkang Sun, Shuai Sui, Shaocheng Tong
2018 J jnl
IEEE Trans. Fuzzy Syst.
Shaocheng Tong, Kangkang Sun, Shuai Sui
2017 J jnl
IEEE Trans. Syst. Man Cybern. Syst.
Kangkang Sun, Yongming Li, Shaocheng Tong
2017 J jnl
Fuzzy Sets Syst.
Kangkang Sun, Shuai Sui, Shaocheng Tong
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"