Weihong Ren

63 papers A* 7A 3B 1Journal 31Unranked 14
YearRankTypeTitle / Venue / Authors
2026 J jnl
IEEE Trans. Circuits Syst. Video Technol.
Shiben Liu, Huijie Fan, Qiang Wang, Weihong Ren, Yandong Tang, Yang Cong
2026 A* conf
AAAI
Yu Gao, Haoyu Ji, Zhiyong Wang, Wenze Huang, Qian Dong, Zhihao Yang, Xueting Liu, Weihong Ren, Honghai Liu
2026 ed.
ICIRA (1)
Takayuki Matsuno, Honghai Liu, Lianqing Liu, Zhouping Yin, Xiangyang Zhu, Weihong Ren, Zhiyong Wang, Yixuan Sheng
2026 ed.
ICIRA (2)
Takayuki Matsuno, Honghai Liu, Lianqing Liu, Zhouping Yin, Xiangyang Zhu, Weihong Ren, Zhiyong Wang, Yixuan Sheng
2026 ed.
ICIRA (3)
Takayuki Matsuno, Honghai Liu, Lianqing Liu, Zhouping Yin, Xiangyang Zhu, Weihong Ren, Zhiyong Wang, Yixuan Sheng
2026 J jnl
CoRR
Haoyu Ji, Xueting Liu, Yu Gao, Wenze Huang, Zhihao Yang, Weihong Ren, Zhiyong Wang, Honghai Liu
2026 J jnl
CoRR
Haoyu Ji, Bowen Chen, Zhihao Yang, Wenze Huang, Yu Gao, Xueting Liu, Weihong Ren, Zhiyong Wang, Honghai Liu
2025 A* conf
AAAI
Pengxin Guo, Shuang Zeng, Wenhao Chen, Xiaodan Zhang, Weihong Ren, Yuyin Zhou, Liangqiong Qu
2025 conf
ICIRA (3)
Wenze Huang, Haoyu Ji, Zhihao Yang, Bowen Chen, Zimo Jiang, Zhiyong Wang, Weihong Ren, Honghai Liu
2025 conf
ICIRA (3)
Zhihao Yang, Haoyu Ji, Wenze Huang, Bowen Chen, Zimo Jiang, Weihong Ren, Zhiyong Wang, Honghai Liu
2025 J jnl
IEEE Trans. Cogn. Dev. Syst.
Bowen Chen, Haoyu Ji, Hanwei Ma, Ruihan Lin, Wei Nie, Weihong Ren, Zhiyong Wang, Honghai Liu
2025 J jnl
IEEE Trans Autom. Sci. Eng.
Weihong Ren, Yu Gao, Xi'ai Chen, Zhi Han, Zhiyong Wang, Jiaole Wang, Honghai Liu
2025 J jnl
IEEE Trans. Cybern.
Weibo Jiang, Weihong Ren, Jiandong Tian, Hanwei Ma, Bowen Chen, Honghai Liu
2025 J jnl
IEEE Trans. Image Process.
Wei Nie, Zhiyong Wang, Weihong Ren, Hanlin Zhang, Honghai Liu
2025 J jnl
IEEE Trans. Affect. Comput.
Yu Gao, Weihong Ren, Weibo Jiang, Qian Dong, Wei Nie, Wenhao Wu, Honghai Liu
2025 J jnl
IEEE Trans. Ind. Informatics
Shijun Zhou, Yiming Su, Doneyue Wang, Weihong Ren, Jiandong Tian
2025 J jnl
IEEE Trans. Cybern.
Bowen Chen, Wei Nie, Haoyu Ji, Weihong Ren, Qiyi Tong, Zhiyong Wang, Honghai Liu
2025 J jnl
CoRR
Peican Lin, Gan Sun, Chenxi Liu, Fazeng Li, Weihong Ren, Yang Cong
2025 J jnl
IEEE Trans. Neural Networks Learn. Syst.
Haoyu Ji, Bowen Chen, Wenze Huang, Weihong Ren, Zhiyong Wang, Honghai Liu
2025 J jnl
CoRR
Haoyu Ji, Bowen Chen, Weihong Ren, Wenze Huang, Zhihao Yang, Zhiyong Wang, Honghai Liu
2025 J jnl
Biomed. Signal Process. Control.
Wenhao Wu, Lei Bi, Zilong Wang, Wei Nie, Boyu Ying, Weihong Ren, Sufang Li, Zhiyong Wang
2024 J jnl
CoRR
Pengxin Guo, Shuang Zeng, Wenhao Chen, Xiaodan Zhang, Weihong Ren, Yuyin Zhou, Liangqiong Qu
2024 J jnl
CoRR
Shiben Liu, Huijie Fan, Qiang Wang, Weihong Ren, Yandong Tang
2024 J jnl
IEEE Trans. Emerg. Top. Comput. Intell.
Xudong Wang, Xiai Chen, Weihong Ren, Zhi Han, Huijie Fan, Yandong Tang, Lianqing Liu
2024 A* conf
CVPR
Jinguo Luo, Weihong Ren, Weibo Jiang, Xi'ai Chen, Qiang Wang, Zhi Han, Honghai Liu
2024 J jnl
IEEE Trans. Cybern.
Xinming Wang, Hanlin Zhang, Zhiyong Wang, Wei Nie, Zhihao Yang, Weihong Ren, Qiong Xu, Xiu Xu, Honghai Liu
2024 J jnl
IEEE Robotics Autom. Lett.
Xinglong Xu, Weihong Ren, Xiai Chen, Huijie Fan, Zhi Han, Honghai Liu
2024 A* conf
AAAI
Weibo Jiang, Weihong Ren, Jiandong Tian, Liangqiong Qu, Zhiyong Wang, Honghai Liu
2024 J jnl
CoRR
Weibo Jiang, Weihong Ren, Jiandong Tian, Liangqiong Qu, Zhiyong Wang, Honghai Liu
2024 A conf
IROS
Xinglong Xu, Weihong Ren, Gan Sun, Haoyu Ji, Yu Gao, Honghai Liu
2024 J jnl
CoRR
Bowen Chen, Haoyu Ji, Zhiyong Wang, Benjamin Filtjens, Chunzhuo Wang, Weihong Ren, Bart Vanrumste, Honghai Liu
2024 conf
ECCV (54)
Haoyu Ji, Bowen Chen, Xinglong Xu, Weihong Ren, Zhiyong Wang, Honghai Liu
2024 J jnl
IEEE Trans. Circuits Syst. Video Technol.
Weihong Ren, Jinguo Luo, Weibo Jiang, Liangqiong Qu, Zhi Han, Jiandong Tian, Honghai Liu
2024 A conf
IROS
Yu Gao, Weihong Ren, Xinglong Xu, Yan Wang, Zhiyong Wang, Honghai Liu
2024 conf
ICIRA (5)
Boyu Ying, Wenze Huang, Zhiyong Wang, Weihong Ren, Senming Zhong, Honghai Liu
2024 A* conf
ACM Multimedia
Xudong Wang, Weihong Ren, Xi'ai Chen, Huijie Fan, Yandong Tang, Zhi Han
2023 J jnl
IEEE Signal Process. Lett.
Qian Dong, Weihong Ren, Yu Gao, Weibo Jiang, Honghai Liu
2023 conf
ICIRA (4)
Feifan Wang, Xi'ai Chen, Xudong Wang, Weihong Ren, Yandong Tang
2023 A conf
IROS
Wei Nie, Bowen Chen, Wenhao Wu, Xiu Xu, Weihong Ren, Honghai Liu
2022 conf
ICIRA (1)
Xinming Wang, Zhihao Yang, Hanlin Zhang, Zuode Liu, Weihong Ren, Xiu Xu, Qiong Xu, Honghai Liu
2022 conf
ICIRA (1)
Hanwei Ma, Bowen Chen, Weihong Ren, Ziheng Wang, Zhiyong Wang, Weibo Jiang, Ruihan Lin, Honghai Liu
2022 B conf
ICPR
Bowen Chen, Weihong Ren, Honghai Liu, Huiping Li, Xiu Xu, Bingrui Zhou, Qiong Xu
2022 J jnl
CoRR
Weihong Ren, Bowen Chen, Yuhang Shi, Weibo Jiang, Honghai Liu
2022 conf
ICIRA (4)
Wenhao Wu, Lei Bi, Weihong Ren, Wei Nie, Ruihan Lin, Zuode Liu, Sufang Li, Xi Lin, Honghai Liu
2022 conf
ICIRA (4)
Weibo Jiang, Weihong Ren, Bowen Chen, Yuhang Shi, Hanwei Ma, Xiu Xu, Qiong Xu, Honghai Liu
2022 ed.
ICIRA (1)
Honghai Liu, Zhouping Yin, Lianqing Liu, Li Jiang, Guoying Gu, Xinyu Wu, Weihong Ren
2022 ed.
ICIRA (2)
Honghai Liu, Zhouping Yin, Lianqing Liu, Li Jiang, Guoying Gu, Xinyu Wu, Weihong Ren
2022 ed.
ICIRA (3)
Honghai Liu, Zhouping Yin, Lianqing Liu, Li Jiang, Guoying Gu, Xinyu Wu, Weihong Ren
2022 ed.
ICIRA (4)
Honghai Liu, Zhouping Yin, Lianqing Liu, Li Jiang, Guoying Gu, Xinyu Wu, Weihong Ren
2022 conf
ICIRA (1)
Ruihan Lin, Hanlin Zhang, Xinming Wang, Weihong Ren, Wenhao Wu, Zuode Liu, Xiu Xu, Qiong Xu, Honghai Liu
2022 conf
ICIRA (4)
Zuode Liu, Honghai Liu, Weihong Ren, Hui Chang, Yuhang Shi, Ruihan Lin, Wenhao Wu
2022 conf
ICIRA (1)
Hanlin Zhang, Xinming Wang, Weihong Ren, Ruihan Lin, Honghai Liu
2022 conf
ICIRA (1)
Bowen Chen, Jiamin Zhang, Zuode Liu, Ruihan Lin, Weihong Ren, Luodi Yu, Honghai Liu
2022 conf
ICIRA (1)
Yuhang Shi, Weihong Ren, Weibo Jiang, Qiong Xu, Xiu Xu, Honghai Liu
2021 J jnl
IEEE Trans. Multim.
Qiang Wang, Huijie Fan, Gan Sun, Weihong Ren, Yandong Tang
2021 J jnl
IEEE Trans. Image Process.
Weihong Ren, Xinchao Wang, Jiandong Tian, Yandong Tang, Antoni B. Chan
2020 J jnl
IEEE Signal Process. Lett.
Weihong Ren, Jiandong Tian, Qiang Wang, Yandong Tang
2020 J jnl
CoRR
Weihong Ren, Xinchao Wang, Jiandong Tian, Yandong Tang, Antoni B. Chan
2018 A* conf
CVPR
Weihong Ren, Di Kang, Yandong Tang, Antoni B. Chan
2018 J jnl
IEEE Trans. Multim.
Jiandong Tian, Zhi Han, Weihong Ren, Xiai Chen, Yandong Tang
2017 J jnl
IEEE Trans. Image Process.
Weihong Ren, Jiandong Tian, Yandong Tang
2017 A* conf
CVPR
Weihong Ren, Jiandong Tian, Zhi Han, Antoni B. Chan, Yandong Tang
2016 J jnl
IEEE Signal Process. Lett.
Weihong Ren, Jiandong Tian, Yandong Tang
redb/extractors/apk_extractors/apk_inconsistency_tests.py
← Index redb/extractors/apk_extractors/apk_inconsistency_tests.py python
import inspect
import re
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 APKInconsistencyTests

# Emulator detection indicator strings
EMULATOR_INDICATORS = {
    "generic", "sdk", "google_sdk", "Emulator",
    "goldfish", "ranchu", "Andy", "Genymotion",
    "BlueStacks", "nox", "ttVM_Hdragon",
}

# Root detection indicator strings
ROOT_INDICATORS = {
    "/system/app/Superuser.apk",
    "/system/xbin/su",
    "/system/bin/su",
    "com.noshufou.android.su",
    "com.thirdparty.superuser",
    "eu.chainfire.supersu",
    "com.koushikdutta.superuser",
    "com.topjohnwu.magisk",
}

# Standard DEX filename pattern
STANDARD_DEX_PATTERN = re.compile(r"^classes\d*\.dex$")


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

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

    def _test_zip_bomb(self):
        """Check if any ZIP entry has compression ratio > 100:1."""
        try:
            zf = self._get_zip_file()
            if not zf:
                return None
            with zf:
                for info in zf.infolist():
                    if info.compress_size > 0:
                        ratio = info.file_size / info.compress_size
                        if ratio > 100:
                            return True
            return False
        except Exception as e:
            self.log.warning(f"Error in zip bomb test: {e}")
            return None

    def _test_zip_duplicate_entries(self):
        """Check for duplicate filenames in ZIP directory."""
        try:
            zf = self._get_zip_file()
            if not zf:
                return None
            with zf:
                names = [info.filename for info in zf.infolist()]
                return len(names) != len(set(names))
        except Exception as e:
            self.log.warning(f"Error in duplicate entries test: {e}")
            return None

    def _test_zip_path_traversal(self):
        """Check for path traversal (../) in ZIP entry names."""
        try:
            for f in self._list_files():
                if ".." in f or f.startswith("/"):
                    return True
            return False
        except Exception as e:
            self.log.warning(f"Error in path traversal test: {e}")
            return None

    def _test_zip_suspicious_timestamps(self):
        """Check for timestamps at epoch (1980) or in the future."""
        try:
            zf = self._get_zip_file()
            if not zf:
                return None
            now = datetime.now()
            with zf:
                for info in zf.infolist():
                    try:
                        dt = datetime(*info.date_time)
                        if dt.year <= 1980 or dt > now:
                            return True
                    except (ValueError, TypeError):
                        continue
            return False
        except Exception as e:
            self.log.warning(f"Error in suspicious timestamps test: {e}")
            return None

    def _test_hidden_dex_files(self):
        """Check for DEX files not matching classes*.dex pattern."""
        try:
            for f in self._list_files():
                if f.endswith(".dex"):
                    basename = f.split("/")[-1]
                    if not STANDARD_DEX_PATTERN.match(basename):
                        return True
            return False
        except Exception as e:
            self.log.warning(f"Error in hidden DEX files test: {e}")
            return None

    def _test_manifest_component_mismatch(self):
        """Check for declared components that don't exist in DEX."""
        try:
            if not self._is_valid_apk():
                return None

            # Get all class names from DEX
            dex_classes = set()
            try:
                from androguard.core.dex import DEX
                for dex_data in (self.apk.get_all_dex() or []):
                    try:
                        d = DEX(dex_data)
                        for cls in d.get_classes():
                            name = cls.get_name()
                            if name:
                                # Convert "Lcom/example/Foo;" to "com.example.Foo"
                                dex_classes.add(
                                    name[1:-1].replace("/", ".") if name.startswith("L") else name
                                )
                    except Exception:
                        continue
            except Exception:
                return None

            if not dex_classes:
                return None

            # Check manifest components against DEX classes
            components = []
            try:
                components.extend(self.apk.get_activities() or [])
                components.extend(self.apk.get_services() or [])
                components.extend(self.apk.get_receivers() or [])
                components.extend(self.apk.get_providers() or [])
            except Exception:
                return None

            for comp in components:
                if comp and comp not in dex_classes:
                    # Component might use a shorthand; check with package prefix
                    package = self.apk.get_package() or ""
                    full_name = package + comp if comp.startswith(".") else comp
                    if full_name not in dex_classes:
                        return True

            return False
        except Exception as e:
            self.log.warning(f"Error in manifest component mismatch test: {e}")
            return None

    def _test_debuggable_release(self):
        """Check android:debuggable=true combined with a release signature."""
        try:
            if not self._is_valid_apk():
                return None

            is_debuggable = self.apk.get_attribute_value(
                "application", "debuggable"
            ) == "true"

            if not is_debuggable:
                return False

            # Check if it has a signing certificate (release builds have certs)
            try:
                certs = self.apk.get_certificates()
                if certs and len(certs) > 0:
                    return True
            except Exception:
                pass

            return False
        except Exception as e:
            self.log.warning(f"Error in debuggable release test: {e}")
            return None

    def _get_dex_strings(self):
        """Get all string constants from DEX files."""
        all_strings = set()
        try:
            from androguard.core.dex import DEX
            for dex_data in (self.apk.get_all_dex() or []):
                try:
                    d = DEX(dex_data)
                    for s in d.get_strings():
                        if s:
                            all_strings.add(s)
                except Exception:
                    continue
        except Exception:
            pass
        return all_strings

    def _test_emulator_detection_strings(self):
        """Check for emulator detection patterns in DEX strings."""
        try:
            if not self._is_valid_apk():
                return None

            dex_strings = self._get_dex_strings()
            for indicator in EMULATOR_INDICATORS:
                for s in dex_strings:
                    if indicator in s:
                        return True
            return False
        except Exception as e:
            self.log.warning(f"Error in emulator detection test: {e}")
            return None

    def _test_debugger_detection(self):
        """Check for debugger detection API calls in DEX."""
        try:
            if not self._is_valid_apk():
                return None

            dex_strings = self._get_dex_strings()
            debugger_patterns = {
                "isDebuggerConnected",
                "waitingForDebugger",
                "Debug.isDebuggerConnected",
            }
            for pattern in debugger_patterns:
                for s in dex_strings:
                    if pattern in s:
                        return True
            return False
        except Exception as e:
            self.log.warning(f"Error in debugger detection test: {e}")
            return None

    def _test_root_detection(self):
        """Check for root detection patterns in DEX."""
        try:
            if not self._is_valid_apk():
                return None

            dex_strings = self._get_dex_strings()
            for indicator in ROOT_INDICATORS:
                for s in dex_strings:
                    if indicator in s:
                        return True
            return False
        except Exception as e:
            self.log.warning(f"Error in root detection test: {e}")
            return None

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

        self.test_results = APKInconsistencyTests(
            test_zip_bomb=self._test_zip_bomb(),
            test_zip_duplicate_entries=self._test_zip_duplicate_entries(),
            test_zip_path_traversal=self._test_zip_path_traversal(),
            test_zip_suspicious_timestamps=self._test_zip_suspicious_timestamps(),
            test_hidden_dex_files=self._test_hidden_dex_files(),
            test_manifest_component_mismatch=self._test_manifest_component_mismatch(),
            test_debuggable_release=self._test_debuggable_release(),
            test_emulator_detection_strings=self._test_emulator_detection_strings(),
            test_debugger_detection=self._test_debugger_detection(),
            test_root_detection=self._test_root_detection(),
        )
        return self.test_results

    def _bool_to_nullable(self, val):
        """Convert bool/None to ClickHouse Nullable(UInt8)."""
        if val is None:
            return None
        return int(val)

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

            current_time = datetime.now(timezone.utc)
            t = self.test_results

            data = [[
                self.sha256,
                self._bool_to_nullable(t.test_zip_bomb),
                self._bool_to_nullable(t.test_zip_duplicate_entries),
                self._bool_to_nullable(t.test_zip_path_traversal),
                self._bool_to_nullable(t.test_zip_suspicious_timestamps),
                self._bool_to_nullable(t.test_hidden_dex_files),
                self._bool_to_nullable(t.test_manifest_component_mismatch),
                self._bool_to_nullable(t.test_debuggable_release),
                self._bool_to_nullable(t.test_emulator_detection_strings),
                self._bool_to_nullable(t.test_debugger_detection),
                self._bool_to_nullable(t.test_root_detection),
                current_time,
            ]]

            column_names = [
                'sha256',
                'test_zip_bomb', 'test_zip_duplicate_entries',
                'test_zip_path_traversal', 'test_zip_suspicious_timestamps',
                'test_hidden_dex_files', 'test_manifest_component_mismatch',
                'test_debuggable_release', 'test_emulator_detection_strings',
                'test_debugger_detection', 'test_root_detection',
                'analysis_date',
            ]

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

            return (data, column_names, column_type_names)

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