Wancheng Zhang

49 papers B 3C 1Misc 2Journal 24Unranked 19
YearRankTypeTitle / Venue / Authors
2025 B conf
IWCMC
Zecheng Tian, Yan Zhang, Kaien Zhang, Jiupeng Song, Zunwen He, Hua Wang, Wancheng Zhang
2025 J jnl
IEEE Trans. Veh. Technol.
Haoyu Zhao, Yan Zhang, Yang Ke, Wancheng Zhang, Zesong Fei
2025 J jnl
IEEE Trans. Veh. Technol.
Yang Ke, Wancheng Zhang, Yan Zhang, Haoyu Zhao, Zesong Fei
2025 J jnl
IEEE Trans. Signal Inf. Process. over Networks
Saier Wang, Yan Zhang, Mingyu Chen, Wancheng Zhang, Zunwen He
2024 conf
VTC Fall
Jiaming Wu, Yan Zhang, Kaien Zhang, Zunwen He, Wancheng Zhang
2024 conf
ICCIP
Haoyu Zhao, Yan Zhang, Yang Ke, Wancheng Zhang
2024 conf
ICCIP
Yang Ke, Wancheng Zhang, Yan Zhang, Haoyu Zhao
2024 J jnl
Comput. Commun.
Yan Zhang, Mingyu Chen, Meng Yuan, Wancheng Zhang, Luis Alberto Lago
2023 J jnl
Frontiers Inf. Technol. Electron. Eng.
Zunwen He, Yue Li, Yan Zhang, Wancheng Zhang, Kaien Zhang, Liu Guo, Haiming Wang
2023 C conf
APCC
Tianyu Zhao, Zunwen He, Mingyu Chen, Yan Zhang, Hongji Yang, Wancheng Zhang
2023 J jnl
IEEE Trans. Intell. Transp. Syst.
Yan Zhang, Kaien Zhang, Ammar Ghazal, Wancheng Zhang, Zijie Ji, Limin Xiao
2023 B conf
PIMRC
Hongji Yang, Yan Zhang, Tianyu Zhao, Wancheng Zhang, Zunwen He
2022 conf
ICCT
Nuo Li, Wancheng Zhang, Zunwen He, Yan Zhang
2022 J jnl
IEEE Trans. Signal Inf. Process. over Networks
Zhaojun Dai, Yan Zhang, Wancheng Zhang, Xinran Luo, Zunwen He
2022 conf
GLOBECOM (Workshops)
Meng Yuan, Wancheng Zhang, Kaien Zhang, Yan Zhang
2022 conf
ICCCS
Yue Li, Zunwen He, Yan Zhang, Wancheng Zhang, Liu Guo, Chuan Du
2022 conf
ICCC Workshops
Yuechen Wang, Zunwen He, Mingjun Ma, Yan Zhang, Shanping Yu, Wancheng Zhang
2021 conf
APSIPA ASC
Xinyang Feng, Nuo Li, Zunwen He, Yan Zhang, Wancheng Zhang
2021 conf
ChinaCom
Shuai Zhang, Yan Zhang, Mingjun Ma, Zunwen He, Wancheng Zhang
2021 conf
ChinaCom
Pengcheng Liu, Yan Zhang, Mingjun Ma, Zunwen He, Wancheng Zhang
2021 J jnl
Vis. Comput.
Wancheng Zhang, Yongzhao Du, Zhi Chen, Jianhua Deng, Peizhong Liu
2020 J jnl
IEEE Access
Shiyao Chen, Yan Zhang, Zunwen He, Jinbo Nie, Wancheng Zhang
2020 conf
IoTaaS
Yang Liu, Zunwen He, Yan Zhang, Wancheng Zhang
2019 J jnl
Algorithms
Wancheng Zhang, Yanmin Luo, Zhi Chen, Yongzhao Du, Daxin Zhu, Peizhong Liu
2019 J jnl
IEEE Access
Jinbo Nie, Yan Zhang, Zunwen He, Shiyao Chen, Shouliang Gong, Wancheng Zhang
2019 conf
IoTaaS
Jianfeng Guan, Wancheng Zhang
2019 J jnl
IEEE Access
Jinxiao Wen, Yan Zhang, Guanshu Yang, Zunwen He, Wancheng Zhang
2018 J jnl
Comput. Ind. Eng.
Yejun Xu, Xiaowei Wen, Wancheng Zhang
2018 J jnl
Inf.
Zhi Chen, Peizhong Liu, Yongzhao Du, Yanmin Luo, Wancheng Zhang
2016 J jnl
Int. J. Syst. Sci.
Wancheng Zhang, Yejun Xu, Huimin Wang
2016 conf
IWAENC
Wancheng Zhang, Patrick A. Naylor
2016 conf
IWAENC
Wancheng Zhang, Patrick A. Naylor, Zunwen He, Yan Zhang
2015 J jnl
Knowl. Based Syst.
Yejun Xu, Wancheng Zhang, Huimin Wang
2015 conf
DSP
Wancheng Zhang, Yiming Yan, Tianyi Wang, Zunwen He
2014 B conf
SMC
Yejun Xu, Wancheng Zhang, Weijun Xu, Huimin Wang
2014 J jnl
IEEE ACM Trans. Audio Speech Lang. Process.
Felicia Lim, Wancheng Zhang, Emanuël A. P. Habets, Patrick A. Naylor
2011 J jnl
IEEE J. Solid State Circuits
Wancheng Zhang, Qiuyu Fu, Nan-Jian Wu
2010 Misc conf
ICASSP
Wancheng Zhang, Emanuël A. P. Habets, Patrick A. Naylor
2009 J jnl
Sensors
Qingyu Lin, Wei Miao, Wancheng Zhang, Qiuyu Fu, Nan-Jian Wu
2009 conf
EUSIPCO
Wancheng Zhang, Andy W. H. Khong, Patrick A. Naylor
2009 conf
EUSIPCO
Wancheng Zhang, Patrick A. Naylor
2009 J jnl
Microelectron. J.
Wancheng Zhang, Nan-Jian Wu
2009 conf
ISMVL
Wancheng Zhang, Nan-Jian Wu, Tamotsu Hashizume, Seiya Kasai
2008 J jnl
IEEE J. Solid State Circuits
Wei Miao, Qingyu Lin, Wancheng Zhang, Nan-Jian Wu
2008 conf
ACSCC
Wancheng Zhang, Andy W. H. Khong, Patrick A. Naylor
2008 J jnl
J. Electr. Comput. Eng.
Wancheng Zhang, Patrick A. Naylor
2008 Misc conf
ICASSP
Wancheng Zhang, Nikolay D. Gaubitch, Patrick A. Naylor
2007 J jnl
IEEE Trans. Circuits Syst. I Regul. Pap.
Wancheng Zhang, Nan-Jian Wu
2007 J jnl
IEICE Trans. Electron.
Wancheng Zhang, Katsuhiko Nishiguchi, Yukinori Ono, Akira Fujiwara, Hiroshi Yamaguchi, Hiroshi Inokawa, Yasuo Takahashi, Nan-Jian Wu
redb/extractors/apk_extractors/apk_permissions.py
← Index redb/extractors/apk_extractors/apk_permissions.py python
import inspect
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 APKPermissions, APKPermission

# Known dangerous permissions (Android runtime permissions)
DANGEROUS_PERMISSIONS = {
    "android.permission.READ_CALENDAR",
    "android.permission.WRITE_CALENDAR",
    "android.permission.CAMERA",
    "android.permission.READ_CONTACTS",
    "android.permission.WRITE_CONTACTS",
    "android.permission.GET_ACCOUNTS",
    "android.permission.ACCESS_FINE_LOCATION",
    "android.permission.ACCESS_COARSE_LOCATION",
    "android.permission.ACCESS_BACKGROUND_LOCATION",
    "android.permission.RECORD_AUDIO",
    "android.permission.READ_PHONE_STATE",
    "android.permission.READ_PHONE_NUMBERS",
    "android.permission.CALL_PHONE",
    "android.permission.ANSWER_PHONE_CALLS",
    "android.permission.ADD_VOICEMAIL",
    "android.permission.USE_SIP",
    "android.permission.BODY_SENSORS",
    "android.permission.SEND_SMS",
    "android.permission.RECEIVE_SMS",
    "android.permission.READ_SMS",
    "android.permission.RECEIVE_WAP_PUSH",
    "android.permission.RECEIVE_MMS",
    "android.permission.READ_EXTERNAL_STORAGE",
    "android.permission.WRITE_EXTERNAL_STORAGE",
    "android.permission.READ_MEDIA_IMAGES",
    "android.permission.READ_MEDIA_VIDEO",
    "android.permission.READ_MEDIA_AUDIO",
    "android.permission.POST_NOTIFICATIONS",
    "android.permission.NEARBY_WIFI_DEVICES",
    "android.permission.ACTIVITY_RECOGNITION",
    "android.permission.BLUETOOTH_SCAN",
    "android.permission.BLUETOOTH_ADVERTISE",
    "android.permission.BLUETOOTH_CONNECT",
}


class APKPermissionsExtractor(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.permissions_data = None
        self.log.debug(inspect.currentframe().f_code.co_name)

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

    def _get_protection_level(self, perm_name):
        """Determine the protection level of a permission.

        Uses androguard's permission mappings first, falls back to the
        known dangerous list.
        """
        try:
            from androguard.core.api_specific_resources import load_permission_mappings
            target_sdk = self.apk.get_target_sdk_version()
            sdk = int(target_sdk) if target_sdk else 30
            permission_map = load_permission_mappings(sdk)
            if perm_name in permission_map:
                info = permission_map[perm_name]
                if isinstance(info, dict):
                    return info.get("protectionLevel", "unknown")
                return "unknown"
        except Exception:
            pass

        # Fallback to known dangerous set
        if perm_name in DANGEROUS_PERMISSIONS:
            return "dangerous"
        if perm_name.startswith("android.permission."):
            return "normal"
        return "unknown"

    def _compute_permhash(self):
        """Compute permhash using the permhash library."""
        try:
            from permhash.functions import permhash_apk
            return permhash_apk(self.filepath)
        except Exception as e:
            self.log.warning(f"Failed to compute permhash: {e}")
            return None

    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 permissions 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

        requested_perms = self._safe_extract(
            "requested_permissions",
            lambda: list(self.apk.get_permissions() or []), []
        )
        custom_perms = self._safe_extract(
            "custom_permissions",
            lambda: list(self.apk.get_declared_permissions() or []), []
        )
        custom_perm_set = set(custom_perms)

        permission_details = []
        dangerous_permissions = []

        for perm in requested_perms:
            try:
                protection_level = self._get_protection_level(perm)
                is_custom = perm in custom_perm_set

                permission_details.append(APKPermission(
                    permission_name=perm,
                    protection_level=protection_level,
                    is_custom=is_custom,
                ))

                if protection_level == "dangerous":
                    dangerous_permissions.append(perm)
            except Exception as e:
                self.log.warning(
                    f"Error processing permission '{perm}' for "
                    f"{self.hash.sha256}: {e}"
                )
                permission_details.append(APKPermission(
                    permission_name=perm,
                    protection_level="unknown",
                    is_custom=perm in custom_perm_set,
                ))

        permhash_value = self._compute_permhash()

        self.permissions_data = APKPermissions(
            total_permission_count=len(requested_perms),
            dangerous_permission_count=len(dangerous_permissions),
            permissions=requested_perms,
            dangerous_permissions=dangerous_permissions,
            custom_permissions=custom_perms,
            permission_details=permission_details,
            permhash=permhash_value,
        )
        return self.permissions_data

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

            current_time = datetime.now(timezone.utc)

            # One row per permission
            data = []
            for detail in self.permissions_data.permission_details:
                data.append([
                    self.sha256,
                    detail.permission_name,
                    detail.protection_level,
                    int(detail.is_custom),
                    current_time,
                ])

            if not data:
                return None

            column_names = [
                'sha256', 'permission_name', 'protection_level',
                'is_custom', 'analysis_date',
            ]

            column_type_names = [
                'FixedString(64)', 'String', 'LowCardinality(String)',
                'UInt8', "DateTime64(3, 'UTC')",
            ]

            return (data, column_names, column_type_names)

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