Xiaohong Chen

55 papers A 4B 7C 12Misc 6Journal 16Unranked 10
YearRankTypeTitle / Venue / Authors
2025 J jnl
ACM Trans. Comput. Hum. Interact.
Xiaohong Chen, Shi Chen, Zhi Jin, Han Bian, Zihan Chen, Haotian Li
2025 A conf
RE
Tong Xu, Zheng Zhou, Xiaohong Chen, Zhiyi Xue, Yi Zhao, Min Zhang, Zhi Jin
2025 J jnl
IEEE Trans. Software Eng.
Xiaohong Chen, Shi Chen, Zhi Jin, Zihan Chen, Mingsong Chen
2024 J jnl
IEEE Trans. Intell. Transp. Syst.
Xiaohong Chen, Zhi Jin, Min Zhang, Frédéric Mallet, Xiaoshan Liu, Tingliang Zhou
2024 conf
ICSE Companion
Zhiyi Xue, Liangguo Li, Senyue Tian, Xiaohong Chen, Pingping Li, Liangyu Chen, Tingting Jiang, Min Zhang
2024 C conf
QRS
Zhen Yao, Jing Liu, Xiaohong Chen, Li Han, Haiying Sun
2024 conf
RE Workshops
Yike Huang, Xiaohong Chen, Zhi Jin, Tingliang Zhou
2024 A conf
ISSTA
Zhiyi Xue, Liangguo Li, Senyue Tian, Xiaohong Chen, Pingping Li, Liangyu Chen, Tingting Jiang, Min Zhang
2024 J jnl
IEEE Internet Things J.
Liangyu Chen, Chen Wang, Cheng Chen, Caidie Huang, Xiaohong Chen, Min Zhang
2023 J jnl
IEEE Trans. Comput. Aided Des. Integr. Circuits Syst.
Ming Hu, E. Cao, Hongbing Huang, Min Zhang, Xiaohong Chen, Mingsong Chen
2023 J jnl
IEEE Trans. Comput. Aided Des. Integr. Circuits Syst.
Ming Hu, Jun Xia, Min Zhang, Xiaohong Chen, Frédéric Mallet, Mingsong Chen
2023 J jnl
IEEE Trans. Intell. Transp. Syst.
Xiaohong Chen, Juan Zhang, Zhi Jin, Min Zhang, Tong Li, Xiang Chen, Tingliang Zhou
2023 B conf
ICECCS
Qian Wang, Jing Liu, John Zhang, Hui Dou, Haiying Sun, Hongtao Chen, Xiaohong Chen, Jifeng He
2022 C conf
SEKE
Qian Wang, Jing Liu, John Zhang, Hui Dou, Haiying Sun, Hongtao Chen, Xiaohong Chen, Jifeng He
2022 conf
HPCC/DSS/SmartCity/DependSys
Shaobin Liu, Xiaohong Chen, Zhi Jin, Min Zhang
2022 J jnl
Sci. Comput. Program.
Xiaohong Chen, Qianqian Liu, Frédéric Mallet, Qin Li, Shubin Cai, Zhi Jin
2021 J jnl
Int. J. Softw. Informatics
Bian Han, Xiaohong Chen, Zhi Jin, Min Zhang
2021 B conf
TrustCom
Runhao Wang, Jiexiang Kang, Wei Yin, Hui Wang, Haiying Sun, Xiaohong Chen, Zhongjie Gao, Shuning Wang, Jing Liu
2021 Misc conf
TASE
Jiajia Yang, Xiaohong Chen, Ling Yin
2021 Misc conf
TASE
Shiling Feng, Xiaohong Chen, Qin Li, Yongxin Zhao
2021 J jnl
Mob. Networks Appl.
Tengfei Li, Jing Liu, Haiying Sun, Xiaohong Chen, Ling Yin, Xia Mao, Junfeng Sun
2021 A conf
RE
Bian Han, Xiaohong Chen, Zhi Jin, Lin Liu
2020 J jnl
J. Cloud Comput.
Pan Fan, Jing Liu, Wei Yin, Hui Wang, Xiaohong Chen, Haiying Sun
2020 Misc conf
TASE
Xiaohong Chen, Frédéric Mallet, Xiaoshan Liu
2020 C conf
APSEC
Tengfei Li, Jing Liu, Jiexiang Kang, Haiying Sun, Xiaohong Chen, Li Han
2020 B conf
TrustCom
Tengfei Li, Xiaohong Chen, Haiying Sun, Jing Liu, Jiajia Yang, Chenchen Yang, Junfeng Sun
2020 C conf
APSEC
Qian Liu, Robert de Simone, Xiaohong Chen, Jiexiang Kang, Jing Liu, Wei Yin, Hui Wang
2020 Misc conf
EMSOFT
Qian Liu, Robert de Simone, Xiaohong Chen, Jing Liu
2020 C conf
QRS
Tengfei Li, Jing Liu, Jiexiang Kang, Haiying Sun, Wei Yin, Xiaohong Chen, Hui Wang
2020 J jnl
J. Syst. Softw.
Dongdong An, Jing Liu, Min Zhang, Xiaohong Chen, Mingsong Chen, Haiying Sun
2019 C conf
ICFEM
Dongdong An, Jing Liu, Xiaohong Chen, Tengfei Li, Ling Yin
2019 A conf
RE
Xiaohong Chen, Zhiwei Zhong, Zhi Jin, Min Zhang, Tong Li, Xiang Chen, Tingliang Zhou
2019 B conf
FASE
Min Zhang, Fu Song, Frédéric Mallet, Xiaohong Chen
2019 J jnl
Int. J. Softw. Sci. Comput. Intell.
Hao Zhou, Mengyao Zhao, Linbo Wu, Xiaohong Chen
2019 Misc conf
TASE
Xiaohong Chen, Xi Wu, Mengyao Zhao, Haiying Sun
2018 J jnl
Frontiers Comput. Sci.
Jie Liu, Jing Liu, Miaomiao Zhang, Haiying Sun, Xiaohong Chen, Dehui Du, Mingsong Chen
2018 J jnl
IEEE Trans. Intell. Transp. Syst.
Zhengheng Yuan, Xiaohong Chen, Jing Liu, Yijun Yu, Haiying Sun, Tingliang Zhou, Zhi Jin
2017 conf
COMPSAC (1)
Jie Liu, Jing Liu, Miaomiao Zhang, Haiying Sun, Xiaohong Chen, Dehui Du, Mingsong Chen
2016 C conf
SEKE
Yuanyang Wang, Xiaohong Chen, Haiying Sun, Mingsong Chen
2016 B conf
COMPSAC
Li Han, Jing Liu, Tingliang Zhou, Junfeng Sun, Xiaohong Chen
2016 conf
RE Workshops
Xiaohong Chen, Li Han, Jing Liu, Haiying Sun
2015 B conf
COMPSAC
Xiaohong Chen, Fan Gu, Mingsong Chen, Dehui Du, Jing Liu, Haiying Sun
2015 C conf
QRS
Lulu Yao, Jing Liu, Yan Zhang, Yuejun Wang, Haiying Sun, Qingsheng Wang, Dehui Du, Xiaohong Chen
2015 conf
Ershov Memorial Conference
Zhengheng Yuan, Tingliang Zhou, Jing Liu, Juan Luo, Yi Zhang, Xiaohong Chen
2015 C conf
APSEC
Haiying Sun, Jing Liu, Xiaohong Chen, Dehui Du
2014 conf
APSEC (1)
Tingliang Zhou, Haiying Sun, Jing Liu, Xiaohong Chen, Dehui Du
2013 B conf
COMPSAC
Xiaohong Chen, Ronghua Ye, Haiying Sun, Hong Lu
2013 conf
Internetware
Yuqing Qian, Jing Liu, Xiaohong Chen
2013 conf
APSEC (1)
Xiaohong Chen, Haiying Sun, Ronghua Ye, Jing Liu
2013 J jnl
Sci. China Inf. Sci.
Xiaohong Chen, Jing Liu, Zhiming Liu
2013 Misc conf
TASE
Zhucheng Shao, Jing Liu, Xiaohong Chen, Zuohua Ding, Zhengheng Yuan
2012 conf
Internetware
Zhike Wu, Jing Liu, Xiaohong Chen, Mingsong Chen
2012 C conf
SEKE
Xiaohong Chen, Jing Liu
2011 C conf
APSEC
Xiaohong Chen, Jing Liu, Frédéric Mallet, Zhi Jin
2011 C conf
KSEM
Xiaohong Chen, Jing Liu, Zuohua Ding
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"