Wan-Hsun Hu

18 papers A 1C 7Unranked 10
YearRankTypeTitle / Venue / Authors
2023 conf
APWCS
Albert Budi Christian, Yi-Qi Zhong, Wan-Hsun Hu, Chia-Hsuan Yu, Chih-Yu Lin
2022 conf
IoTaIS
Albert Budi Christian, Chih-Yu Lin, Yu-Chee Tseng, Lan-Da Van, Wan-Hsun Hu, Chia-Hsuan Yu
2020 A conf
ICS
Jean Jimmy Julien, Fuchun Joseph Lin, Chiao-Hsuan Yu, Wan-Hsun Hu
2019 conf
ICCE-TW
Albert Budi Christian, Cheng-Wei Wu, Wan-Hsun Hu, Yung-Ju Chang, Yu-Chee Tseng
2019 C conf
APNOMS
Jean Jimmy Julien, Fuchun Joseph Lin, Chia-Hsuan Yu, Wan-Hsun Hu
2018 conf
ICIOT
Fuchun J. Lin, Kun-Lun Tsai, Shih-Ying Song, Wen-Cheng Hsu, Yueh-Ting Lai, Wan-Hsun Hu
2018 conf
MISNC
Wan-Hsun Hu, Shih-Hsien Tang, Yin-Che Chen, Chia-Hsuan Yu, Wen-Cheng Hsu
2017 conf
AINA Workshops
Wan-Hsun Hu, Ying-Che Chen, Fang-Sun Lu, Jeu-Yih Jeng
2017 conf
Canadian AI
Yi-Chia Tsai, Yu-Da Cheng, Cheng-Wei Wu, Yueh-Ting Lai, Wan-Hsun Hu, Jeu-Yih Jeng, Yu-Chee Tseng
2016 conf
MISNC
Wan-Hsun Hu, Bo-Ting Lin, Fang-Sun Lu, Jeu-Yih Jeng
2016 conf
WF-IoT
Fuchun Joseph Lin, Bo-Yan Chen, Bo-Ting Lin, Wan-Hsun Hu
2016 C conf
APNOMS
Fuchun Joseph Lin, Wan-Du Tsai, Bo-Ting Lin, Wan-Hsun Hu
2015 C conf
APNOMS
Jo-Ching Wu, Yi-Bing Lin, Yun-Wei Lin, Yung-Ching Wang, Bo-Ting Lin, Wan-Hsun Hu
2015 C conf
APNOMS
Huai-Sheng Huang, Po-Han Lee, Yu-Chee Tseng, Bo-Ting Lin, Wan-Hsun Hu
2015 conf
WF-IoT
Fuchun Joseph Lin, Wan-Du Tsai, Eduardo Cerritos, Bo-Ting Lin, Wan-Hsun Hu
2014 C conf
APNOMS
Huai-Sheng Huang, Tzu-Chung Su, Jo-Ching Wu, Wan-Du Tsai, Yu-Chee Tseng, Fuchun Joseph Lin, Bo-Ting Lin, Wan-Hsun Hu
2014 C conf
APNOMS
Chia Chun Shih, Chi-Chang Huang, Bo-Ting Lin, Chao-Wen Huang, Wan-Hsun Hu, Chien-Wei Cheng
2013 C conf
APNOMS
Chao-Wen Huang, Wan-Hsun Hu, Chia Chun Shih, Bo-Ting Lin, Chien-Wei Cheng
redb/extractors/decompiler/apk/library_filter.py
← Index redb/extractors/decompiler/apk/library_filter.py python
"""Package-based library filtering for APK DEX code analysis.

Determines whether a method belongs to a known library/framework package
and should be filtered out of content tables. This is the Android equivalent
of is_lib_or_thunk() in the Binary Ninja pipeline.
"""

import os
from typing import Dict, List


DEFAULT_LIBRARY_PREFIXES = [
    "android.",
    "androidx.",
    "com.google.android.",
    "com.google.firebase.",
    "com.google.gson.",
    "com.google.protobuf.",
    "kotlin.",
    "kotlinx.",
    "org.apache.",
    "com.squareup.",
    "io.reactivex.",
    "org.reactivestreams.",
    "com.facebook.",
    "com.crashlytics.",
    "io.fabric.",
    "org.junit.",
    "org.mockito.",
]


class LibraryFilter:
    """Filters library/framework classes from APK analysis."""

    def __init__(self, prefixes: List[str] = None):
        env_prefixes = os.getenv("APK_LIBRARY_PREFIXES")
        if env_prefixes:
            self._prefixes = [p.strip() for p in env_prefixes.split(",") if p.strip()]
        elif prefixes is not None:
            self._prefixes = prefixes
        else:
            self._prefixes = DEFAULT_LIBRARY_PREFIXES

        # Convert Dalvik-style prefixes to both formats for matching
        self._dot_prefixes = tuple(self._prefixes)

        self._stats = {"library": 0, "user": 0}

    def is_library(self, class_name: str) -> bool:
        """Check if a class belongs to a known library/framework package.

        Accepts both Java dot notation (com.example.Foo) and Dalvik
        descriptor notation (Lcom/example/Foo;).
        """
        # Normalize Dalvik descriptor to dot notation
        normalized = self._normalize_class_name(class_name)

        is_lib = normalized.startswith(self._dot_prefixes)
        if is_lib:
            self._stats["library"] += 1
        else:
            self._stats["user"] += 1
        return is_lib

    def get_filter_stats(self) -> Dict[str, int]:
        """Return counts of filtered vs. retained classes."""
        return dict(self._stats)

    @staticmethod
    def _normalize_class_name(class_name: str) -> str:
        """Convert Dalvik descriptor to dot notation.

        Lcom/example/Foo; -> com.example.Foo
        com.example.Foo -> com.example.Foo
        """
        if class_name.startswith("L") and class_name.endswith(";"):
            return class_name[1:-1].replace("/", ".")
        return class_name.replace("/", ".")