Outman El Hichami

11 papers C 1Journal 2Unranked 8
YearRankTypeTitle / Venue / Authors
2025 conf
CiST
Karim Midoul, Badr Eddine El Mohajir, Outman El Hichami, Adnan Souri
2023 conf
CiSt
El Mojahid Roumaissae, Outman El Hichami, Badr Eddine El Mohajir, Mohammed Al Achhab, Adnan Souri, Abdelali Zbakh
2019 J jnl
CoRR
Rachid Oucheikh, Ismail Berrada, Outman El Hichami
2019 conf
BDIoT
Outman El Hichami, Mohamed Naoum, Mohammed Al Achhab, Badr Eddine El Mohajir, Mohamed Lazaar
2016 conf
CIST
Mohamed Naoum, Outman El Hichami, Mohammed Al Achhab, Badr Eddine El Mohajir
2016 conf
NETYS
Rachid Oucheikh, Ismail Berrada, Outman El Hichami
2015 J jnl
Int. J. Recent Contributions Eng. Sci. IT
Outman El Hichami, Mohamed Naoum, Mohammed Al Achhab, Ismail Berrada, Badr Eddine El Mohajir
2015 conf
NETYS
Outman El Hichami, Mohamed Naoum, Mohammed Al Achhab, Ismail Berrada, Badr Eddine El Mohajir
2014 conf
NETYS
Outman El Hichami, Mohammed Al Achhab, Ismail Berrada, Badr Eddine El Mohajir
2014 conf
CIST
Outman El Hichami, Badr Eddine El Mohajir, Mohammed Al Achhab, Ismail Berrada, Rachid Oucheikh
2014 C conf
VECoS
Outman El Hichami, Mohammed Al Achhab, Ismail Berrada, Badr Eddine El Mohajir
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("/", ".")