Rafael Fernandes

12 papers Journal 4Unranked 8
YearRankTypeTitle / Venue / Authors
2026 conf
SIGCSE (1)
Rafael Fernandes, Alexander Wiß, Andreas Schneider, Angélica Herrera Loyo, Dennis Komm, Jacqueline Staub
2024 J jnl
SN Comput. Sci.
Manuel Augusto M. Vieira, Manuela Vieira, Paula Louro, Pedro Vieira, Rafael Fernandes
2024 conf
AMTA (2)
Rafael Fernandes, Marcos Lopes
2024 conf
PROPOR (1)
Rafael Fernandes, Rodrigo Souza, Marcos Lopes, Paulo Santos, Thomas Finbow
2023 J jnl
Sci. Robotics
Khalil B. Ramadi, James C. McRae, George Selsing, Arnold Su, Rafael Fernandes, Maela Hickling, Brandon Rios, Sahab Babaee, Seokkee Min, Declan Gwynne, Neil Zixun Jia, Aleyah Aragon, Keiko Ishida, Johannes Kuosmanen, Josh Jenkins, Alison Hayward, Ken Kamrin, Giovanni Traverso
2023 conf
EMBC
Rafael Fernandes, Helena R. Torres, Bruno Oliveira, João Azevedo, Karen Fan, Alex P. Lee, João L. Vilaça, Pedro Morais
2022 J jnl
IEEE Trans Autom. Sci. Eng.
Gilmar P. Cruz Júnior, Adriano M. C. Rezende, Victor R. F. Miranda, Rafael Fernandes, Héctor Azpúrua, Armando Alves Neto, Gustavo Pessin, Gustavo Medeiros Freitas
2021 conf
ARTECH
Cristina Sylla, Maitê Gil, Douglas Menegazzi, Rafael Fernandes, Cristiana Araújo, Nuno Martins
2021 J jnl
J. Intell. Robotic Syst.
Héctor Azpúrua, Adriano M. C. Rezende, Guilherme A. Potje, Gilmar Pereira da Cruz Júnior, Rafael Fernandes, Victor R. F. Miranda, Levi Welington de Resende Filho, Jacó Domingues, Filipe Rocha, Frederico Luiz Martins de Sousa, Luiz Guilherme Dias de Barros, Erickson R. Nascimento, Douglas G. Macharet, Gustavo Pessin, Gustavo Medeiros Freitas
2020 conf
CASE
Adriano M. C. Rezende, Gilmar Pereira da Cruz Júnior, Rafael Fernandes, Victor R. F. Miranda, Héctor Azpúrua, Gustavo Pessin, Gustavo Medeiros Freitas
2020 conf
LARS/SBR/WRE
Rafael Fernandes, Thiago Lages Rocha, Héctor Azpúrua, Gustavo Pessin, Armando Alves Neto, Gustavo Medeiros Freitas
2017 conf
LARS/SBR
Rafael Fernandes, Manuel Moises Bessa, Alexandre Santos Brandão
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"