Chaichan Pothisarn

16 papers C 2Journal 3Unranked 11
YearRankTypeTitle / Venue / Authors
2025 C conf
IAS
Chaichan Pothisarn, Theerasak Patcharoen, Panu Srisuksai, Atthapol Ngaopitakkul, Anantawat Kunakorn, Santipont Ananwattanaporn
2025 J jnl
IEEE Access
Pathomthat Chiradeja, Praikanok Lertwanitrot, Panapong Songsukthawan, Suntiti Yoomak, Atthapol Ngaopitakkul, Chaichan Pothisarn
2025 J jnl
IEEE Access
Surakit Thongsuk, Praikanok Lertwanitrot, Panapong Songsukthawan, Santipont Ananwattanaporn, Atthapol Ngaopitakkul, Suntiti Yoomak, Chaichan Pothisarn
2024 conf
IIAI-AAI
Theerasak Patcharoen, Chaichan Pothisarn, Atthapol Ngaopitakkul, Santipont Ananwattanaporn, Praikanok Lertwanitrot, Suntiti Yoomak
2022 J jnl
J. Electr. Comput. Eng.
Chaichan Pothisarn, Atthapol Ngaopitakkul, Monthon Leelajindakrairerk, Natthanon Phannil, Sulee Bunjongjit, Surakit Thongsuk, Bancha Sreewirote
2022 C conf
IAS
Pathomthat Chiradeja, Chaichan Pothisarn, Panu Srisuksai, Suntiti Yoomak, Atthapol Ngaopitakkul, Natthanon Phannil
2017 conf
EUSFLAT/IWIFSGN (3)
Suntiti Yoomak, Chaichan Pothisarn, Chaiyan Jettanasen, Atthapol Ngaopitakkul
2017 conf
IIAI-AAI
Santipont Ananwattanaporn, Monthon Leelajindakrairerk, Chaiyan Jettanasen, Chaichan Pothisarn, Atthapol Ngaopitakkul, Dimas Anton Asfani
2017 conf
EUSFLAT/IWIFSGN (3)
Suntiti Yoomak, Chaichan Pothisarn, Chaiyan Jettanasen, Atthapol Ngaopitakkul
2012 conf
IBICA
Atthapol Ngaopitakkul, Chaichan Pothisarn, Sulee Bunjongjit, Boonlert Suechoey
2012 conf
IBICA
C. Apisit, Chaichan Pothisarn, Atthapol Ngaopitakkul
2012 conf
IBICA
Chaichan Pothisarn, Atthapol Ngaopitakkul
2012 conf
SCIS&ISIS
Atthapol Ngaopitakkul, Chaiyan Jettanasen, Jittiphong Klomjit, Chaichan Pothisarn, Buncha Seewirote, Nuchtita Suttisinthong
2012 conf
SCIS&ISIS
Atthapol Ngaopitakkul, Chaichan Pothisarn, Sulee Bunjongjit, Jittiphong Klomjit, Boonlert Suechoey
2012 conf
SCIS&ISIS
Chaiyan Jettanasen, Chaichan Pothisarn, Sulee Bunjongjit, Atthapol Ngaopitakkul, Boonlert Suechoey
2008 conf
ROBIO
Atthapol Ngaopitakkul, Chaichan Pothisarn
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("/", ".")