Xiaojian Ding

52 papers A* 4B 1Misc 1Journal 39Unranked 7
YearRankTypeTitle / Venue / Authors
2026 J jnl
Inf. Sci.
Xiaojian Ding, Xian Li, Lin Zhao, Xiaoying Zhu
2026 J jnl
Pattern Recognit.
Xiaojian Ding, Xin Wang, Shilin Chen, Kaixiang Wang
2026 J jnl
Eur. J. Oper. Res.
Xiaojian Ding, Xin Wang, Pengcheng Shi
2026 J jnl
Neurocomputing
Yuanzhi Zhao, Fan Yang, Haoyu Hu, Zhen Su, Xiaojian Ding, Yufeng Liu, Zhiwang Zhang
2026 J jnl
IEEE Trans. Comput. Biol. Bioinform.
Xiaojian Ding, Pengcheng Shi, Xin Wang, Hui Cao
2026 J jnl
Numer. Algorithms
Xiaojian Ding, Baohua Huang
2026 J jnl
ACM Trans. Knowl. Discov. Data
Xiaojian Ding, Xiaoying Zhu, Fumin Ma
2025 J jnl
IEEE Trans. Artif. Intell.
Xiaojian Ding, Zihan Xu, Yi Li, Fumin Ma, Shilin Chen
2025 J jnl
Appl. Math. Lett.
Xiaojian Ding, Baohua Huang
2025 J jnl
Neurocomputing
Xiaojian Ding, Menghan Cui, Kaixiang Wang
2025 A* conf
IJCAI
Kaixiang Wang, Xiaojian Ding, Fan Yang
2025 J jnl
CoRR
Xiaojian Ding, Lin Zhao, Xian Li, Xiaoying Zhu
2025 A* conf
ACM Multimedia
Kaixiang Wang, Xiaojian Ding, Wanqi Yang, Ming Yang
2025 J jnl
Pattern Recognit.
Fan Yang, Xinqi Liu, Fumin Ma, Xiaojian Ding, Kaixiang Wang
2025 J jnl
Expert Syst. Appl.
Fan Yang, Haoyu Hu, Fumin Ma, Xiaojian Ding, Qiaoxi Zhang, Xinqi Liu
2025 conf
ROBIO
Jing Tang, Jian Zhou, Xin Liu, Xiaobing Li, Xiaojian Ding, Tianming Huang, Jinqi You
2025 J jnl
Neurocomputing
Xiaojian Ding, Xin Wang, Zihan Xu, Pengcheng Shi, Kaixiang Wang
2024 J jnl
Expert Syst. Appl.
Xiaojian Ding, Menghan Cui, Yi Li, Shilin Chen
2024 J jnl
IEEE Trans. Circuits Syst. Video Technol.
Fan Yang, Meng Han, Fumin Ma, Yufeng Liu, Xiaojian Ding, Deyu Tong
2024 J jnl
Multim. Tools Appl.
Fan Yang, Xiaojian Ding, Yufeng Liu, Fumin Ma
2024 J jnl
Neural Networks
Xiaojian Ding, Yi Li, Shilin Chen
2024 A* conf
AAAI
Xiaojian Ding, Fan Yang
2024 J jnl
Inf. Fusion
Zihan Xu, Xiaojian Ding, Menghan Cui, Xin Wang, Pengcheng Shi
2024 J jnl
Knowl. Based Syst.
Menghan Cui, Kaixiang Wang, Xiaojian Ding, Zihan Xu, Xin Wang, Pengcheng Shi
2024 A* conf
ACM Multimedia
Kaixiang Wang, Xiaojian Ding, Fan Yang
2023 J jnl
IEEE ACM Trans. Comput. Biol. Bioinform.
Xiaojian Ding, Fan Yang, Fumin Ma, Shilin Chen
2023 J jnl
Inf. Process. Manag.
Fan Yang, Xiaojian Ding, Fumin Ma, Deyu Tong, Jie Cao
2023 J jnl
Inf. Sci.
Fan Yang, Qiaoxi Zhang, Fumin Ma, Xiaojian Ding, Yufeng Liu, Deyu Tong
2023 J jnl
Eng. Appl. Artif. Intell.
Fan Yang, Meng Han, Fumin Ma, Xiaojian Ding, Qiaoxi Zhang
2023 J jnl
Appl. Intell.
Fan Yang, Qiao-Xi Zhang, Xiaojian Ding, Fumin Ma, Jie Cao, Deyu Tong
2022 J jnl
IEEE ACM Trans. Comput. Biol. Bioinform.
Xiaojian Ding, Fan Yang, Yaoyi Zhong, Jie Cao
2022 J jnl
J. Frankl. Inst.
Xiaojian Ding, Sheng Jin, Ming Lei, Fan Yang
2022 J jnl
J. Biomed. Informatics
Xiaojian Ding, Fan Yang, Fumin Ma
2022 J jnl
Pattern Recognit.
Fan Yang, Yufeng Liu, Xiaojian Ding, Fumin Ma, Jie Cao
2022 B conf
SMC
Fan Yang, Qiao-Xi Zhang, Xiaojian Ding, Deyu Tong, Fumin Ma, Jie Cao
2022 J jnl
Knowl. Based Syst.
Fan Yang, Xiaojian Ding, Yufeng Liu, Fumin Ma, Jie Cao
2021 J jnl
Comput. Biol. Medicine
Xiaojian Ding, Fan Yang, Sheng Jin, Jie Cao
2021 J jnl
Knowl. Based Syst.
Xiaojian Ding, Jian Liu, Fan Yang, Jie Cao
2021 J jnl
J. Frankl. Inst.
Xiaojian Ding, Jian Liu, Fan Yang, Jie Cao
2020 conf
WSSE
Xuan Zhang, Xiaojian Ding, Kaiwei Wang
2020 J jnl
Appl. Artif. Intell.
Xiaojian Ding, Fan Yang, Jian Liu, Jie Cao
2020 J jnl
Commun. Nonlinear Sci. Numer. Simul.
Jian Liu, Bing Hu, Fan Yang, Chuanlai Zang, Xiaojian Ding
2019 J jnl
EURASIP J. Wirel. Commun. Netw.
Bing Hu, Xiaojian Ding, Fan Yang, Jian Liu
2019 conf
ROBIO
Haibo An, Wei Liang, Xiaojian Ding, Yinlong Zhang, Jindong Tan
2019 conf
ROBIO
Yinlong Zhang, Haibo An, Xiaojian Ding, Wei Liang, Mingze Yuan, Chunyang Ji, Jindong Tan
2018 conf
ICSRS
Zhou Jian, Yuan-Hang Wang, Linghui Meng, Xiaojian Ding, Jian-Feng Yang, Xiaobing Li
2017 J jnl
Neurocomputing
Xiaojian Ding, Yuan Lan, Zhi-feng Zhang, Xin Xu
2016 conf
URAI
Yuan Lan, Weiwei Zong, Xiaojian Ding, Xiaoyan Xiong, XiaoHang Han, Jiahai Huang, Bing Ma
2016 Misc conf
SAC
Xiaojian Ding, Xiao-Guang Liu, Xin Xu
2012 J jnl
IEEE Trans. Syst. Man Cybern. Part B
Guang-Bin Huang, Hongming Zhou, Xiaojian Ding, Rui Zhang
2010 J jnl
Neurocomputing
Guang-Bin Huang, Xiaojian Ding, Hongming Zhou
2008 conf
ICEBE
Xiaojian Ding, Yuancheng Li, Yinliang Zhao
redb/extractors/apk_extractors/apk_manifest.py
← Index redb/extractors/apk_extractors/apk_manifest.py python
import inspect
import json
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 APKManifest, APKManifestComponent


class APKManifestExtractor(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.manifest = None
        self.components = []
        self.log.debug(inspect.currentframe().f_code.co_name)

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

    def _is_component_exported(self, component_type, component_name):
        """Determine if a component is exported.

        Pre-API 31: exported is implicitly True if intent filters exist.
        API 31+: android:exported must be explicit; default is False.
        """
        try:
            exported_attr = None
            # Try to get the exported attribute directly from the XML
            axml = self.apk.get_android_manifest_xml()
            if axml is not None:
                for node in axml.getElementsByTagName(component_type):
                    name = node.getAttributeNS(
                        "http://schemas.android.com/apk/res/android", "name"
                    )
                    if name == component_name:
                        exported_attr = node.getAttributeNS(
                            "http://schemas.android.com/apk/res/android", "exported"
                        )
                        break
        except Exception:
            exported_attr = None

        if exported_attr == "true":
            return True
        if exported_attr == "false":
            return False

        # If not explicitly set, check for intent filters (pre-API 31 behavior)
        try:
            intent_filters = self.apk.get_intent_filters(component_type, component_name)
            if intent_filters:
                actions = intent_filters.get("action", [])
                if actions:
                    return True
        except Exception:
            pass

        return False

    def _get_intent_filters_for_component(self, component_type, component_name):
        """Get intent filters for a specific component."""
        actions = []
        categories = []
        try:
            intent_filters = self.apk.get_intent_filters(component_type, component_name)
            if intent_filters:
                actions = intent_filters.get("action", [])
                categories = intent_filters.get("category", [])
        except Exception:
            pass
        return actions, categories

    def _safe_extract(self, field_name, func, default=None):
        """Extract a single field, logging and returning default on failure."""
        try:
            return func()
        except Exception as e:
            self.log.warning(
                f"Error extracting APK manifest field '{field_name}' for "
                f"{self.hash.sha256}: {e}"
            )
            return default

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

        activities = self._safe_extract(
            "activities", lambda: list(self.apk.get_activities() or []), []
        )
        services = self._safe_extract(
            "services", lambda: list(self.apk.get_services() or []), []
        )
        receivers = self._safe_extract(
            "receivers", lambda: list(self.apk.get_receivers() or []), []
        )
        providers = self._safe_extract(
            "providers", lambda: list(self.apk.get_providers() or []), []
        )

        # Build component list with intent filter info
        self.components = []
        all_actions = set()
        all_categories = set()
        exported_components = []

        component_map = [
            ("activity", activities),
            ("service", services),
            ("receiver", receivers),
            ("provider", providers),
        ]

        for comp_type, comp_list in component_map:
            for comp_name in comp_list:
                try:
                    is_exported = self._is_component_exported(comp_type, comp_name)
                    actions, categories = self._get_intent_filters_for_component(
                        comp_type, comp_name
                    )
                    all_actions.update(actions)
                    all_categories.update(categories)
                    if is_exported:
                        exported_components.append(comp_name)

                    self.components.append(APKManifestComponent(
                        component_type=comp_type,
                        class_name=comp_name,
                        is_exported=is_exported,
                        intent_actions=list(actions),
                        intent_categories=list(categories),
                    ))
                except Exception as e:
                    self.log.warning(
                        f"Error processing component '{comp_name}' for "
                        f"{self.hash.sha256}: {e}"
                    )
                    # Still add the component with minimal info
                    self.components.append(APKManifestComponent(
                        component_type=comp_type,
                        class_name=comp_name,
                        is_exported=False,
                        intent_actions=[],
                        intent_categories=[],
                    ))

        # Uses-feature
        uses_features = []
        try:
            uses_features = list(self.apk.get_features() or [])
        except Exception:
            pass

        # Meta-data
        meta_data = None
        try:
            axml = self.apk.get_android_manifest_xml()
            if axml is not None:
                md = {}
                for node in axml.getElementsByTagName("meta-data"):
                    name = node.getAttributeNS(
                        "http://schemas.android.com/apk/res/android", "name"
                    )
                    value = node.getAttributeNS(
                        "http://schemas.android.com/apk/res/android", "value"
                    )
                    resource = node.getAttributeNS(
                        "http://schemas.android.com/apk/res/android", "resource"
                    )
                    if name:
                        md[name] = value or resource or ""
                if md:
                    meta_data = md
        except Exception:
            pass

        # Full manifest XML
        manifest_xml = None
        try:
            axml = self.apk.get_android_manifest_xml()
            if axml is not None:
                manifest_xml = axml.toxml()
        except Exception:
            try:
                manifest_xml = self.apk.get_android_manifest_axml().get_xml()
                if isinstance(manifest_xml, bytes):
                    manifest_xml = manifest_xml.decode("utf-8", errors="replace")
            except Exception:
                pass

        self.manifest = APKManifest(
            activity_count=len(activities),
            service_count=len(services),
            receiver_count=len(receivers),
            provider_count=len(providers),
            activities=activities,
            services=services,
            receivers=receivers,
            providers=providers,
            exported_components=exported_components,
            intent_filters_by_action=sorted(all_actions),
            intent_filters_by_category=sorted(all_categories),
            uses_features=uses_features,
            meta_data=meta_data,
            manifest_xml=manifest_xml,
        )
        return self.manifest

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

            current_time = datetime.now(timezone.utc)
            m = self.manifest

            # Components table (one row per component)
            components_data = []
            for comp in self.components:
                components_data.append([
                    self.sha256,
                    comp.component_type,
                    comp.class_name,
                    int(comp.is_exported),
                    comp.intent_actions,
                    comp.intent_categories,
                    current_time,
                ])

            # Manifest summary table (one row per APK)
            manifest_data = [[
                self.sha256,
                m.activity_count,
                m.service_count,
                m.receiver_count,
                m.provider_count,
                m.intent_filters_by_action,
                m.intent_filters_by_category,
                m.uses_features,
                m.manifest_xml,
                current_time,
            ]]

            return {
                'multi_table': True,
                'manifest': {
                    'table': 'redb_apk_manifest',
                    'data': manifest_data,
                    'column_names': [
                        'sha256',
                        'activity_count', 'service_count', 'receiver_count', 'provider_count',
                        'intent_filters_by_action', 'intent_filters_by_category',
                        'uses_features', 'manifest_xml', 'analysis_date',
                    ],
                    'column_type_names': [
                        'FixedString(64)',
                        'UInt16', 'UInt16', 'UInt16', 'UInt16',
                        'Array(String)', 'Array(String)',
                        'Array(String)', 'Nullable(String)',
                        "DateTime64(3, 'UTC')",
                    ],
                },
                'components': {
                    'table': 'redb_apk_components',
                    'data': components_data,
                    'column_names': [
                        'sha256', 'component_type', 'class_name', 'is_exported',
                        'intent_actions', 'intent_categories', 'analysis_date',
                    ],
                    'column_type_names': [
                        'FixedString(64)', 'LowCardinality(String)', 'String', 'UInt8',
                        'Array(String)', 'Array(String)',
                        "DateTime64(3, 'UTC')",
                    ],
                },
            }

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