Xavier Fernando

32 papers B 4Journal 12Unranked 13
YearRankTypeTitle / Venue / Authors
2026 J jnl
IEEE Trans. Netw. Serv. Manag.
Amin Mohajer, Abbas Mirzaei, Mostafa Darabi, Xavier Fernando
2025 ed.
ICCCSP
Aravindan Chandrabose, Xavier Fernando, Eunika Mercier-Laurent
2025 conf
ICC Workshops
Syed Ammad Ali Shah, Xavier Fernando, Rasha F. Kashef
2025 conf
ICC Workshops
Abhishek Gupta, Xavier Fernando
2024 J jnl
IEEE Trans. Veh. Technol.
Anitha Saravana Kumar, Lian Zhao, Xavier Fernando
2024 J jnl
J. Opt. Commun. Netw.
Md. Nooruzzaman, Xavier Fernando
2024 conf
SysCon
Syed Ammad Ali Shah, Xavier Fernando, Rasha F. Kashef
2023 B conf
PIMRC
Abhishek Gupta, Xavier Fernando
2023 ed.
ICCCSP
Eunika Mercier-Laurent, Xavier Fernando, Aravindan Chandrabose
2023 conf
BlackSeaCom
Arif Obaid, Muhammad Jaseemuddin, Xavier Fernando
2023 J jnl
Future Internet
Satyanand Singh, Joanna Rosak-Szyrocka, István Drotár, Xavier Fernando
2023 J jnl
Sensors
Xavier Fernando, George Lazaroiu
2023 J jnl
IEEE Trans. Veh. Technol.
Anitha Saravana Kumar, Lian Zhao, Xavier Fernando
2023 B conf
PIMRC
Noha Hassan, Xavier Fernando, Isaac Woungang, Alagan Anpalagan
2023 J jnl
Future Internet
Noha Hassan, Xavier Fernando, Isaac Woungang, Alagan Anpalagan
2022 conf
VTC Spring
Abhishek Gupta, Xavier Fernando
2022 ed.
ICCCSP
Erich J. Neuhold, Xavier Fernando, Joan Lu, Selwyn Piramuthu, Aravindan Chandrabose
2022 conf
HEALTHINF
Karl Magtibay, Xavier Fernando, Karthikeyan Umapathy
2022 J jnl
Future Internet
Ajmery Sultana, Xavier Fernando
2022 J jnl
IEEE Trans. Veh. Technol.
Anitha Saravana Kumar, Lian Zhao, Xavier Fernando
2022 conf
VTC Spring
Abhishek Gupta, Kandasamy Illanko, Xavier Fernando
2021 J jnl
IET Wirel. Sens. Syst.
Arif Obaid, Xavier Fernando, Muhammad Jaseemuddin
2021 conf
VTC Spring
Kandasamy Illanko, Xavier Fernando
2021 conf
VTC Spring
Arif Obaid, Muhammad Jaseemuddin, Xavier Fernando
2021 conf
VTC Fall
Syed Ammad Ali Shah, Kandasamy Illanko, Xavier Fernando
2021 B conf
IWCMC
Abhishek Gupta, Xavier Fernando
2021 J jnl
IEEE Commun. Mag.
Md. Nooruzzaman, Xavier Fernando
2021 conf
OFC
Md. Nooruzzaman, Xavier Fernando
2021 conf
ICC
Anitha Saravana Kumar, Lian Zhao, Xavier Fernando
2021 conf
ICC
Kandasamy Illanko, Xavier Fernando
2021 B conf
IWCMC
Abhishek Gupta, Xavier Fernando, Olivia Das
2021 J jnl
Int. J. Commun. Syst.
V. Suma, Xavier Fernando, Ram Palanisamy, Robert Bestak
redb/extractors/apk_extractors/apk_native_libs.py
← Index redb/extractors/apk_extractors/apk_native_libs.py python
import fnmatch
import hashlib
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 APKNativeLib

# Known packer/protector native library names
KNOWN_PACKER_LIBS = {
    # Jiagu (360/Qihoo)
    "libjiagu.so", "libjiagu_a64.so", "libjiagu_x86.so", "libjiagu_x64.so",
    # Bangcle/SecNeo
    "libsecexe.so", "libsecmain.so", "libSecShell.so",
    # Baidu
    "libbaiduprotect.so",
    # Tencent (Legu)
    "libtxAppProtect.so", "libBugly.so",
    # iJiami
    "libexec.so", "libexecmain.so",
    # Alibaba
    "libmobisec.so", "libaliprotect.so",
    # APKProtect
    "libAPKProtect.so",
    # Pangxie (Pangolin)
    "libdexjni.so",
    # DexProtector
    "libdexprotector.so",
    # AppSolid
    "libAppSolid.so",
    # Kiwisec
    "libkwscmm.so",
    # DingXiang
    "libx3g.so",
    # NQ Shield
    "libnqshield.so",
    # Generic / other
    "libprotectClass.so",
    "libDexHelper.so",
    "libdexloader.so",
    "libfdog.so",
}

# Glob-style patterns for packer libs (e.g. libshella-*.so)
KNOWN_PACKER_PATTERNS = [
    "libshella-*.so",
    "libshell-super.*.so",
]


def is_known_packer_lib(filename):
    """Check if a native library filename matches known packer signatures."""
    if filename in KNOWN_PACKER_LIBS:
        return True
    for pattern in KNOWN_PACKER_PATTERNS:
        if fnmatch.fnmatch(filename, pattern):
            return True
    return False


class APKNativeLibExtractor(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.native_libs = []
        self.abis = set()
        self.log.debug(inspect.currentframe().f_code.co_name)

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

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

        self.native_libs = []
        self.abis = set()

        zf = self._get_zip_file()
        if not zf:
            return None

        with zf:
            for info in zf.infolist():
                if not (info.filename.startswith("lib/") and info.filename.endswith(".so")):
                    continue
                parts = info.filename.split("/")
                if len(parts) < 3:
                    continue

                abi = parts[1]
                filename = parts[-1]
                self.abis.add(abi)

                try:
                    data = zf.read(info.filename)
                    lib_sha256 = hashlib.sha256(data).hexdigest()
                except Exception as e:
                    self.log.warning(f"Error reading native lib {info.filename}: {e}")
                    continue

                self.native_libs.append(APKNativeLib(
                    abi=abi,
                    filename=filename,
                    size=info.file_size,
                    sha256=lib_sha256,
                    is_known_packer=is_known_packer_lib(filename),
                ))

        if not self.native_libs:
            return None

        return {
            "native_lib_count": len(self.native_libs),
            "abis": sorted(self.abis),
            "native_libs": self.native_libs,
            "known_packer_libs": [
                lib for lib in self.native_libs if lib.is_known_packer
            ],
        }

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

            current_time = datetime.now(timezone.utc)
            data = []
            for lib in self.native_libs:
                data.append([
                    self.sha256,
                    lib.abi,
                    lib.filename,
                    lib.size,
                    lib.sha256,
                    int(lib.is_known_packer),
                    current_time,
                ])

            column_names = [
                'sha256', 'lib_abi', 'lib_filename', 'lib_size',
                'lib_sha256', 'lib_is_known_packer', 'analysis_date',
            ]

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

            return (data, column_names, column_type_names)

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