Xiang Wen

50 papers A* 5B 2C 2Journal 33Unranked 8
YearRankTypeTitle / Venue / Authors
2026 J jnl
Ann. Oper. Res.
Sihua Chen, Xiang Wen, Wei He
2026 J jnl
IEICE Trans. Fundam. Electron. Commun. Comput. Sci.
Xiang Wen, Yuhang Yang, Haobo Wang, Ke Chen, Tianlei Hu, Gang Chen
2026 J jnl
IEEE Trans. Intell. Transp. Syst.
Jingtian Ma, Jingyuan Wang, Wayne Xin Zhao, Guoping Liu, Xiang Wen
2025 J jnl
Knowl. Based Syst.
Xiang Wen, Kai Sun, Tao Chen, Zhao Wang, Jiangfeng She, Qiang Zhao, Yuzheng Guan, Shusheng Zhang, Jiakuan Han
2025 J jnl
Frontiers Inf. Technol. Electron. Eng.
Xiang Wen, Haobo Wang, Ke Chen, Tianlei Hu, Gang Chen
2025 J jnl
Comput. Graph. Forum
Hao He, Yixun Liang, Luozhou Wang, Yuanhao Cai, Xinli Xu, Haoxiang Guo, Xiang Wen, Yingcong Chen
2025 A* conf
ICML
Zhenghai Xue, Lang Feng, Jiacheng Xu, Kang Kang, Xiang Wen, Bo An, Shuicheng Yan
2025 J jnl
CoRR
Zhenghai Xue, Lang Feng, Jiacheng Xu, Kang Kang, Xiang Wen, Bo An, Shuicheng Yan
2025 J jnl
CoRR
Di Qiu, Zhengcong Fei, Rui Wang, Jialin Bai, Changqian Yu, Mingyuan Fan, Guibin Chen, Xiang Wen
2025 J jnl
CoRR
Jingtian Ma, Jingyuan Wang, Wayne Xin Zhao, Guoping Liu, Xiang Wen
2025 J jnl
Neurocomputing
Lina Wang, Jiangfeng She, Qiang Zhao, Xiang Wen, Yuzheng Guan
2024 J jnl
ISPRS Int. J. Geo Inf.
Qifeng Wan, Yuzheng Guan, Qiang Zhao, Xiang Wen, Jiangfeng She
2024 J jnl
CoRR
Jiaxiang Tang, Ruijie Lu, Xiaokang Chen, Xiang Wen, Gang Zeng, Ziwei Liu
2024 J jnl
Multim. Syst.
Lina Wang, Jiangfeng She, Qiang Zhao, Xiang Wen, Qifeng Wan, Shuangpin Wu
2024 J jnl
CoRR
Hao He, Yixun Liang, Luozhou Wang, Yuanhao Cai, Xinli Xu, Hao-Xiang Guo, Xiang Wen, Yingcong Chen
2024 J jnl
CoRR
Di Qiu, Chengyu Zheng, Rui Wang, Mingyuan Fan, Changqian Yu, Junshi Huan, Xiang Wen
2024 J jnl
CoRR
Jing Tang, Quanlu Jia, Yuqiang Xie, Zeyu Gong, Xiang Wen, Jiayi Zhang, Yalong Guo, Guibin Chen, Jiangping Yang
2024 J jnl
Int. J. Prod. Res.
Sihua Chen, Weidong Wang, Xiang Wen, Han Qiu, Wei He, Mikko T. Siponen, Xiaoming Zhang
2024 B conf
AVSS
Meng Li, Jinrong Hu, Xin Wang, Hao Chen, Xiang Wen, Anqi Chen
2024 J jnl
CoRR
Qi Wen, Xiang Wen, Hao Jiang, Siqi Yang, Bingfeng Han, Tianlei Hu, Gang Chen, Shuang Li
2024 J jnl
CoRR
Zhengcong Fei, Di Qiu, Changqian Yu, Debang Li, Mingyuan Fan, Xiang Wen
2023 J jnl
IEEE J. Sel. Top. Appl. Earth Obs. Remote. Sens.
Xiang Wen, Xing Li, Wenquan Han, Erzhu Li, Wei Liu, Lianpeng Zhang, Yihu Zhu, Shengli Wang, Sibao Hao
2023 conf
ITSC
Jie Zhao, Chao Chen, Linli Jiang, Chengwu Liao, Kaiqiang An, Yuanjie Li, Guoping Liu, Xiang Wen, Runbo Hu, Hua Chai
2023 J jnl
IEEE Trans. Multim.
Xiang Wen, Shiwei Zhao, Haobo Wang, Runze Wu, Manhu Qu, Tianlei Hu, Gang Chen, Jianrong Tao, Changjie Fan
2023 A* conf
ACM Multimedia
Haozhe Wu, Songtao Zhou, Jia Jia, Junliang Xing, Qi Wen, Xiang Wen
2023 J jnl
CoRR
Haozhe Wu, Songtao Zhou, Jia Jia, Junliang Xing, Qi Wen, Xiang Wen
2023 A* conf
KDD
Jiasheng Zhang, Kaiqiang An, Guoping Liu, Xiang Wen, Runbo Hu, Jie Shao
2023 conf
ICONIP (1)
Xiang Wen, Yanming Chen, Li Liu, Choonghyun Lee, Yi Zhao, Yong Gong
2022 A* conf
SIGGRAPH Asia
Shen Sang, Tiancheng Zhi, Guoxian Song, Minghao Liu, Chun-Pong Lai, Jing Liu, Xiang Wen, James Davis, Linjie Luo
2022 J jnl
CoRR
Shen Sang, Tiancheng Zhi, Guoxian Song, Minghao Liu, Chun-Pong Lai, Jing Liu, Xiang Wen, James Davis, Linjie Luo
2022 J jnl
ISPRS Int. J. Geo Inf.
Chi Zhang, Hong-Yu Zhou, Qiang Qiu, Zhichun Jian, Daoye Zhu, Chengqi Cheng, Liesong He, Guoping Liu, Xiang Wen, Runbo Hu
2022 J jnl
Knowl. Based Syst.
Yanming Chen, Xiang Wen, Yiwen Zhang, Qiang He
2021 J jnl
Neurocomputing
Yanming Chen, Xiang Wen, Yiwen Zhang, Weisong Shi
2021 J jnl
Remote. Sens.
Xiang Wen, Xing Li, Ce Zhang, Wenquan Han, Erzhu Li, Wei Liu, Lianpeng Zhang
2020 J jnl
Comput. Commun.
Yanming Chen, Chao Li, Luqi Gong, Xiang Wen, Yiwen Zhang, Weisong Shi
2020 J jnl
IEEE Access
Haiquan Wang, Jiachen Feng, Leilei Sun, Kaiqiang An, Guoping Liu, Xiang Wen, Runbo Hu, Hua Chai
2020 A* conf
ICDE
Lisheng Zhao, Jiali Mao, Min Pu, Guoping Liu, Cheqing Jin, Weining Qian, Aoying Zhou, Xiang Wen, Runbo Hu, Hua Chai
2020 J jnl
CoRR
Yinglin Duan, Tianyang Shi, Zhengxia Zou, Jia Qin, Yifei Zhao, Yi Yuan, Jie Hou, Xiang Wen, Changjie Fan
2019 J jnl
ACM Trans. Spatial Algorithms Syst.
Haiquan Wang, Yilin Li, Guoping Liu, Xiang Wen, Xiaohu Qie
2018 J jnl
Sensors
Kexin Wang, Xiang Wen, Dibo Hou, Dezhan Tu, Naifu Zhu, Pingjie Huang, Guangxin Zhang, Hongjian Zhang
2016 conf
GRMSE (1)
Lijuan Lu, Bin Zhou, Xiang Wen, Shuiping Shi, Chunheng Yan, Sha Li, Peilan Guo
2016 conf
I2MTC
Xiang Wen, Dibo Hou, Tianheng Feng, Pingjie Huang, Guangxin Zhang
2015 conf
WCSP
Jun Du, Xiang Wen, Ligang Shang, Shan Zou, Bangning Zhang, Daoxing Guo, Yihe Song
2015 conf
GRMSE
Xiang Wen, Hua Zhang, Bin Zhou, Huining Huang, Yongdong Yuan
2015 conf
WCSP
Gang Wu, Bangning Zhang, Xiang Wen, Daoxing Guo
2014 conf
GRMSE
Xiang Wen, Chonggang Miao, Lijuan Lu, Hua Zhang, Fan Zhang, Xirong Bi
2012 B conf
TrustCom
Xiaolin Wang, Xiang Wen, Yechen Li, Yingwei Luo, Xiaoming Li, Zhenlin Wang
2012 J jnl
Frontiers Comput. Sci.
Xiaolin Wang, Xiang Wen, Yechen Li, Zhenlin Wang, Yingwei Luo, Xiaoming Li
2009 C conf
ISPA
Xinxin Jin, Haogang Chen, Xiaolin Wang, Zhenlin Wang, Xiang Wen, Yingwei Luo, Xiaoming Li
2009 C conf
ISPA
Haogang Chen, Xiaolin Wang, Zhenlin Wang, Xiang Wen, Xinxin Jin, Yingwei Luo, Xiaoming Li
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"