Raimundo Sampaio Neto

116 papers B 11C 1Misc 4Journal 65Unranked 35
YearRankTypeTitle / Venue / Authors
2025 J jnl
IET Commun.
Jose Luis Calpa Juajinoy, João Cal-Braz, Raimundo Sampaio Neto
2022 B conf
IWCMC
Alvaro Javier Ortega, Raimundo Sampaio Neto, Rodrigo Pereira David
2021 C conf
APCC
Juan P. Mayoral Arteaga, Rodrigo Pereira David, Raimundo Sampaio Neto
2021 conf
EuCNC/6G Summit
Jose Luis Calpa Juajinoy, Raimundo Sampaio Neto, João Cal-Braz
2020 J jnl
IET Commun.
Alvaro Javier Ortega, Raimundo Sampaio Neto, Rodrigo Pereira David
2020 conf
LATINCOM
Alvaro Javier Ortega, Raimundo Sampaio Neto, Rodrigo Pereira David
2019 Misc conf
ICNC
Alvaro Javier Ortega, Raimundo Sampaio Neto, Rodrigo Pereira David
2019 conf
LATINCOM
Alvaro Javier Ortega, Raimundo Sampaio Neto, Rodrigo Pereira David
2019 J jnl
CoRR
Alvaro Javier Ortega, Raimundo Sampaio Neto, Rodrigo Pereira David
2019 J jnl
IEEE Access
Alexander Beremiz Hilario Tacuri, José Mauro P. Fortes, Raimundo Sampaio Neto, Leonel Soncco, Diego Donaires, Juan Borja
2018 conf
LATINCOM
Alexander Beremiz Hilario Tacuri, José Mauro P. Fortes, Raimundo Sampaio Neto
2018 conf
ISWCS
Azucena Duarte, Joao Cal-Braz, Raimundo Sampaio Neto
2018 J jnl
Trans. Emerg. Telecommun. Technol.
Alexandre Amorim Pereira Jr., Raimundo Sampaio Neto
2018 J jnl
Trans. Emerg. Telecommun. Technol.
Aline de Oliveira, Raimundo Sampaio Neto, José Mauro P. Fortes
2017 J jnl
IEEE Trans. Aerosp. Electron. Syst.
Cesar Augusto Medina Sotomayor, Rodrigo Pereira David, Raimundo Sampaio Neto
2017 J jnl
EURASIP J. Wirel. Commun. Netw.
Leonel Arevalo, Rodrigo C. de Lamare, Martin Haardt, Raimundo Sampaio Neto
2017 J jnl
IEEE Trans. Veh. Technol.
Leonel Arevalo, Rodrigo C. de Lamare, Raimundo Sampaio Neto
2016 J jnl
CoRR
Leonel Arevalo, Rodrigo C. de Lamare, Martin Haardt, Raimundo Sampaio Neto
2016 conf
SAM
Aline de Oliveira, Raimundo Sampaio Neto, José Mauro P. Fortes, Fabian D. Backx
2016 conf
SAM
Aline de Oliveira, Raimundo Sampaio Neto, José Mauro P. Fortes
2016 J jnl
IEEE Trans. Aerosp. Electron. Syst.
Raimundo Sampaio Neto, César A. Medina
2015 conf
WSA
Alexandre Amorim Pereira Jr., Raimundo Sampaio Neto
2015 Misc conf
ICNC
Alexandre de M. Torturela, Rodrigo C. de Lamare, César A. Medina, Raimundo Sampaio Neto
2015 conf
WSA
Leonel Arevalo, Rodrigo C. de Lamare, Raimundo Sampaio Neto
2015 conf
ISWCS
Joao Cal-Braz, Raimundo Sampaio Neto
2015 conf
VTC Spring
Leonel Arevalo, César A. Medina, Raimundo Sampaio Neto
2015 J jnl
IEEE Commun. Lett.
Joao Cal-Braz, Raimundo Sampaio Neto
2015 J jnl
CoRR
João Cal-Braz, Raimundo Sampaio Neto
2015 conf
CAMSAP
Leonel Arevalo, Rodrigo C. de Lamare, Martin Haardt, Raimundo Sampaio Neto
2014 J jnl
CoRR
A. Amorim Pereira Jr., Raimundo Sampaio Neto
2014 conf
ISWCS
Rodrigo Pereira David, Raimundo Sampaio Neto, César A. Medina
2014 J jnl
CoRR
Rodrigo C. de Lamare, Raimundo Sampaio Neto
2014 J jnl
CoRR
Rodrigo C. de Lamare, Raimundo Sampaio Neto
2014 J jnl
IEEE Commun. Lett.
Joao Cal-Braz, Raimundo Sampaio Neto
2014 J jnl
CoRR
Leonel Arevalo, Rodrigo C. de Lamare, Raimundo Sampaio Neto
2014 conf
ISWCS
Leonel Arevalo, Rodrigo C. de Lamare, Keke Zu, Raimundo Sampaio Neto
2014 J jnl
IEEE Commun. Lett.
Joao Cal-Braz, Raimundo Sampaio Neto
2014 J jnl
IEEE Signal Process. Lett.
Rodrigo C. de Lamare, Raimundo Sampaio Neto
2014 J jnl
CoRR
Rodrigo C. de Lamare, Raimundo Sampaio Neto
2013 J jnl
CoRR
Rodrigo C. de Lamare, Are Hjørungnes, Raimundo Sampaio Neto
2013 J jnl
CoRR
Rodrigo C. de Lamare, Are Hjørungnes, Raimundo Sampaio Neto
2013 J jnl
CoRR
Rodrigo C. de Lamare, Raimundo Sampaio Neto
2013 J jnl
CoRR
Rodrigo C. de Lamare, Raimundo Sampaio Neto
2013 J jnl
CoRR
Rodrigo C. de Lamare, Raimundo Sampaio Neto
2013 J jnl
CoRR
Rodrigo C. de Lamare, Raimundo Sampaio Neto
2013 J jnl
CoRR
Rodrigo C. de Lamare, Raimundo Sampaio Neto
2013 J jnl
Signal Process.
César A. Medina, Raimundo Sampaio Neto
2013 J jnl
CoRR
Rodrigo C. de Lamare, Raimundo Sampaio Neto
2013 J jnl
CoRR
Rodrigo C. de Lamare, Raimundo Sampaio Neto, Martin Haardt
2013 conf
ISWCS
Leonel Arevalo, José Antonio Apolinário, Marcello L. R. de Campos, Raimundo Sampaio Neto
2013 conf
ISWCS
Rodrigo Pereira David, Raimundo Sampaio Neto, César A. Medina
2013 conf
ISWCS
Joao Cal-Braz, César A. Medina, Raimundo Sampaio Neto
2013 J jnl
CoRR
Rodrigo C. de Lamare, Raimundo Sampaio Neto
2013 conf
ISWCS
Alexandre de M. Torturela, Rodrigo C. de Lamare, César A. Medina, Raimundo Sampaio Neto
2012 J jnl
CoRR
Rodrigo C. de Lamare, Raimundo Sampaio Neto
2012 conf
ISWCS
Aline de Oliveira, Raimundo Sampaio Neto, César A. Medina
2012 J jnl
CoRR
Rodrigo C. de Lamare, Raimundo Sampaio Neto
2012 J jnl
CoRR
Rodrigo C. de Lamare, Raimundo Sampaio Neto
2011 J jnl
IEEE Trans. Veh. Technol.
Rodrigo C. de Lamare, Raimundo Sampaio Neto
2011 J jnl
IET Commun.
Rodrigo B. Moraes, Raimundo Sampaio Neto
2011 J jnl
IEEE Trans. Signal Process.
Rodrigo C. de Lamare, Raimundo Sampaio Neto, Martin Haardt
2011 conf
ISWCS
César A. Medina, Raimundo Sampaio Neto
2011 J jnl
EURASIP J. Wirel. Commun. Netw.
César A. Medina, Raimundo Sampaio Neto
2010 conf
ISWCS
César A. Medina, Raimundo Sampaio Neto
2010 conf
ISWCS
César A. Medina, Tiago T. V. Vinhoza, Raimundo Sampaio Neto
2010 J jnl
IEEE Trans. Commun.
Rodrigo C. de Lamare, Raimundo Sampaio Neto
2010 J jnl
IEEE Trans. Veh. Technol.
Rodrigo C. de Lamare, Raimundo Sampaio Neto
2009 conf
ICC
César A. Medina, Tiago T. V. Vinhoza, Raimundo Sampaio Neto
2009 J jnl
IEEE Trans. Signal Process.
Rodrigo C. de Lamare, Raimundo Sampaio Neto
2008 B conf
WCNC
Rodrigo C. de Lamare, Are Hjørungnes, Raimundo Sampaio Neto
2008 conf
VTC Spring
Rodrigo C. de Lamare, Are Hjørungnes, Raimundo Sampaio Neto
2008 Misc conf
ICASSP
Rodrigo C. de Lamare, Raimundo Sampaio Neto
2008 J jnl
IEEE Trans. Signal Process.
Rodrigo C. de Lamare, Martin Haardt, Raimundo Sampaio Neto
2008 J jnl
IET Commun.
Tiago T. V. Vinhoza, Rodrigo C. de Lamare, Raimundo Sampaio Neto
2008 Misc conf
ICASSP
Rodrigo C. de Lamare, Raimundo Sampaio Neto, Martin Haardt
2008 conf
VTC Fall
César A. Medina, Raimundo Sampaio Neto
2008 J jnl
IEEE Trans. Speech Audio Process.
Masahiro Yukawa, Rodrigo C. de Lamare, Raimundo Sampaio Neto
2008 B conf
WCNC
Rodrigo C. de Lamare, Raimundo Sampaio Neto
2008 J jnl
IEEE Trans. Commun.
Rodrigo C. de Lamare, Raimundo Sampaio Neto
2008 J jnl
IEEE Trans. Neural Networks
Rodrigo C. de Lamare, Raimundo Sampaio Neto
2008 J jnl
IET Commun.
Rodrigo C. de Lamare, Raimundo Sampaio Neto
2007 conf
DSP
Masahiro Yukawa, Rodrigo C. de Lamare, Raimundo Sampaio Neto
2007 J jnl
IEEE Trans. Veh. Technol.
Rodrigo C. de Lamare, Raimundo Sampaio Neto
2007 conf
DSP
Rodrigo C. de Lamare, Raimundo Sampaio Neto
2007 conf
ICASSP (3)
Rodrigo C. de Lamare, Raimundo Sampaio Neto
2007 conf
ICC
Rodrigo C. de Lamare, Raimundo Sampaio Neto
2007 conf
ISWCS
Rodrigo C. de Lamare, Martin Haardt, Raimundo Sampaio Neto
2007 J jnl
IEEE Trans. Veh. Technol.
Rodrigo C. de Lamare, Raimundo Sampaio Neto
2007 conf
VTC Fall
Fabian D. Backx, Tiago T. V. Vinhoza, Raimundo Sampaio Neto
2007 conf
ICASSP (3)
Rodrigo C. de Lamare, Martin Haardt, Raimundo Sampaio Neto
2007 J jnl
IEEE Commun. Lett.
Rodrigo C. de Lamare, Raimundo Sampaio Neto, Are Hjørungnes
2007 conf
ISWCS
Rodrigo C. de Lamare, Raimundo Sampaio Neto
2007 B conf
PIMRC
Fabian D. Backx, Tiago T. V. Vinhoza, Raimundo Sampaio Neto
2007 J jnl
IEEE Signal Process. Lett.
Rodrigo C. de Lamare, Raimundo Sampaio Neto
2006 conf
ICASSP (3)
Tiago T. V. Vinhoza, Rodrigo C. de Lamare, Raimundo Sampaio Neto
2006 J jnl
IEEE Trans. Signal Process.
Rodrigo C. de Lamare, Raimundo Sampaio Neto
2006 B conf
WCNC
Rodrigo C. de Lamare, Raimundo Sampaio Neto
2005 J jnl
IEEE Signal Process. Lett.
Rodrigo C. de Lamare, Raimundo Sampaio Neto
2005 B conf
GLOBECOM
Rodrigo C. de Lamare, Raimundo Sampaio Neto
2005 J jnl
IEEE Commun. Lett.
Rodrigo C. de Lamare, Raimundo Sampaio Neto
2005 J jnl
IEEE Commun. Lett.
Rodrigo C. de Lamare, Raimundo Sampaio Neto
2004 conf
ICT
Rodrigo C. de Lamare, Raimundo Sampaio Neto
2004 B conf
PIMRC
Rodrigo C. de Lamare, Raimundo Sampaio Neto
2004 B conf
GLOBECOM
Rodrigo C. de Lamare, Raimundo Sampaio Neto
2004 B conf
PIMRC
Rodrigo C. de Lamare, Raimundo Sampaio Neto
2003 J jnl
IEEE Commun. Lett.
Rodrigo Caiado de Lamare, Raimundo Sampaio Neto
2003 J jnl
Int. J. Satell. Commun. Netw.
José Mauro P. Fortes, Raimundo Sampaio Neto
2002 B conf
PIMRC
Rodrigo C. de Lamare, Raimundo Sampaio Neto
2002 B conf
PIMRC
Rodrigo C. de Lamare, Raimundo Sampaio Neto
1999 J jnl
Int. J. Satell. Commun. Netw.
José Mauro P. Fortes, Raimundo Sampaio Neto, Jorge E. Amores Maldonado
1997 J jnl
IEEE Trans. Commun.
Eduardo S. Esteves, Raimundo Sampaio Neto
1986 J jnl
IEEE Trans. Commun.
José Mauro P. Fortes, Raimundo Sampaio Neto
1986 J jnl
IEEE Trans. Commun.
Raimundo Sampaio Neto, Andreas Polydoros, Robert A. Scholtz
1985 J jnl
IEEE J. Sel. Areas Commun.
Raimundo Sampaio Neto, Robert A. Scholtz
1984 J jnl
IEEE Trans. Inf. Theory
Raimundo Sampaio Neto
1981 J jnl
IEEE Trans. Commun.
Raimundo Sampaio Neto, José Paulo A. Albuquerque
redb/extractors/apk_extractors/apk_resources.py
← Index redb/extractors/apk_extractors/apk_resources.py python
import hashlib
import inspect
import os
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 APKResource


# ─── Suspicious file types ──────────────────────────────────────────────
# File types that are suspicious when found inside res/ or assets/.
# Excludes javascript/html (extremely common in legitimate hybrid apps)
# and common media/font types that are normal APK content.
SUSPICIOUS_TYPES = {
    # Executables — no legitimate reason in assets/res
    "elf", "pebin", "macho", "dex", "apk",
    # Java containers — DexClassLoader target
    "jar",
    # Archives — rare in legitimate assets (~135:1 malware-to-benign ratio)
    "zip", "gzip", "7z", "xz", "tar", "bzip2", "rar", "7zip", "lzma",
    # Scripts with system execution capability
    "shell", "python", "powershell", "batch",
}

# ─── Entropy thresholds ─────────────────────────────────────────────────
# For unrecognized/unknown types: encrypted payloads typically land > 7.0
ENTROPY_HIGH_UNKNOWN = 7.0
# For recognized-but-non-image types: stricter threshold
ENTROPY_EXTREME = 7.85

# ─── Android-specific binary format magic bytes ─────────────────────────
# These formats are common in legitimate APKs but unknown to Magika,
# causing misclassification (e.g., AXML → "gzip", profm → "unknown").
AXML_MAGIC = b'\x03\x00\x08\x00'       # Android Binary XML (compiled res/*.xml)
ARSC_MAGIC = b'\x02\x00\x0c\x00'       # Android compiled resource table
ART_PROF_MAGIC = b'pro\x00'            # ART baseline profile
ART_PROFM_MAGIC = b'prm\x00'           # ART baseline profile metadata

# ─── Allowlisted paths ──────────────────────────────────────────────────
# Fixed, hardcoded paths in the Android build system that are always benign.
# ART profiles at these exact paths are shipped by Jetpack ProfileInstaller.
ALLOWLISTED_PATHS = {
    "assets/dexopt/baseline.prof",
    "assets/dexopt/baseline.profm",
}

# ─── Image handling ─────────────────────────────────────────────────────
# Magika-confirmed image types: high entropy is expected (lossy codecs
# like VP8/JPEG arithmetic-code toward entropy ~7.95-8.0 by design).
IMAGE_MAGIKA_TYPES = {"png", "webp", "jpeg", "gif", "bmp", "tiff", "ico"}
IMAGE_EXTENSIONS = {".png", ".webp", ".jpg", ".jpeg", ".gif", ".bmp", ".tiff", ".ico"}

# ─── Types Magika assigns when it can't identify the content ────────────
UNRECOGNIZED_MAGIKA_TYPES = {"unknown", "empty"}

# ─── Resource scan limits ───────────────────────────────────────────────
MAX_RESOURCE_FILES = 5000


class APKResourceExtractor(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.resources = []
        self.suspicious_files = []
        self.log.debug(inspect.currentframe().f_code.co_name)

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

    # ─── Core classification logic ──────────────────────────────────────

    def _identify_android_format(self, header: bytes) -> str | None:
        """
        Identify Android-specific binary formats that Magika doesn't know.
        Returns a corrected type label, or None to fall through to Magika.
        """
        if len(header) < 4:
            return None

        magic4 = header[:4]

        # Android Binary XML — all res/*.xml in a compiled APK.
        # Magika often misclassifies this as "gzip".
        if magic4 == AXML_MAGIC:
            return "android_binary_xml"

        # Android compiled resource table (resources.arsc chunks)
        if magic4 == ARSC_MAGIC:
            return "android_resource_table"

        # ART baseline profiles — high entropy (zlib inside) but benign.
        # The format is inert (method reference bitmaps/metadata, not
        # executable code) and some build configs place them at varying paths.
        if magic4 == ART_PROF_MAGIC:
            return "android_art_profile"
        if magic4 == ART_PROFM_MAGIC:
            return "android_art_profile_metadata"

        return None

    def _is_suspicious_resource(
        self, path: str, magika_type: str, entropy: float,
        android_type: str | None,
    ) -> bool:
        """
        Determine if a resource file is suspicious.

        Detection layers:
        1. Allowlisted paths → always benign
        2. Android-specific format override → reclassify Magika mislabels
        3. Image extension vs Magika type mismatch → encrypted blob detection
        4. Magika-confirmed images → benign regardless of entropy
        5. Suspicious type match → flag known-dangerous types
        6. High-entropy unknown blobs → likely encrypted payloads
        """

        # ── Layer 1: Allowlisted paths (hardcoded Android build artifacts) ──
        if path in ALLOWLISTED_PATHS:
            return False

        # ── Layer 2: Android-specific format detection ──────────────────────
        # Override Magika's label for formats it doesn't recognize.
        # All Android-specific formats (AXML, ARSC, ART profiles) are
        # legitimate build artifacts — never suspicious.
        if android_type is not None:
            return False

        # ── Layer 3: Image extension / Magika type mismatch ─────────────────
        # If the file extension claims "image" but Magika's content analysis
        # disagrees, this is a strong signal for an encrypted payload with
        # a fake image extension (e.g., ErrorFather's "rbyypivsnw.png").
        ext = os.path.splitext(path)[1].lower()
        if ext in IMAGE_EXTENSIONS and magika_type not in IMAGE_MAGIKA_TYPES:
            # Exception: Magika might label a valid image as "unknown" if
            # the file is very small (< ~16 bytes). Don't flag tiny files.
            if entropy > 5.0:
                return True

        # ── Layer 4: Magika-confirmed images → benign ───────────────────────
        # Lossy codecs (VP8, JPEG) produce entropy up to ~8.0 by design.
        # If Magika confirms image structure, high entropy is expected.
        if magika_type in IMAGE_MAGIKA_TYPES:
            return False

        # ── Layer 5: Known suspicious file types ────────────────────────────
        if magika_type in SUSPICIOUS_TYPES:
            return True

        # ── Layer 6: High-entropy unrecognized blobs ────────────────────────
        # Files Magika can't identify with high entropy are likely encrypted
        # payloads. Most Android malware packers store encrypted DEX/SO
        # payloads as opaque blobs with random names and no valid magic.
        if magika_type in UNRECOGNIZED_MAGIKA_TYPES and entropy > ENTROPY_HIGH_UNKNOWN:
            return True

        # ── Layer 7: Extreme entropy on any non-image recognized type ───────
        # Catches edge cases where Magika assigns a benign label (e.g.,
        # "xml", "txt") but the entropy is impossibly high for that format.
        if magika_type not in IMAGE_MAGIKA_TYPES and entropy > ENTROPY_EXTREME:
            return True

        return False

    # ─── Extraction pipeline ────────────────────────────────────────────

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

        try:
            from magika import Magika
            magika = Magika()
        except Exception as e:
            self.log.error(f"Failed to initialize Magika for {self.hash.sha256}: {e}")
            magika = None

        self.resources = []
        self.suspicious_files = []
        scanned = 0

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

        with zf:
            for info in zf.infolist():
                if info.is_dir():
                    continue
                if not (info.filename.startswith("res/") or
                        info.filename.startswith("assets/")):
                    continue

                if scanned >= MAX_RESOURCE_FILES:
                    self.log.warning(
                        f"Resource scan limit reached ({MAX_RESOURCE_FILES}), "
                        f"stopping resource enumeration"
                    )
                    break
                scanned += 1

                try:
                    data = zf.read(info.filename)
                except Exception as e:
                    self.log.warning(
                        f"Error reading resource {info.filename}: {e}"
                    )
                    continue

                try:
                    file_sha256 = hashlib.sha256(data).hexdigest()
                    file_entropy = round(self.calculate_entropy(data), 3)

                    # Read first bytes for Android-specific format detection
                    header = data[:16] if len(data) >= 16 else data

                    if magika:
                        try:
                            filetype = magika.identify_bytes(data).output.label
                        except Exception:
                            filetype = "unknown"
                    else:
                        filetype = "unknown"

                    # Identify Android-specific formats once, reuse for
                    # both stored type and suspicion classification
                    android_type = self._identify_android_format(header)
                    stored_type = android_type if android_type else filetype

                    suspicious = self._is_suspicious_resource(
                        path=info.filename,
                        magika_type=filetype,
                        entropy=file_entropy,
                        android_type=android_type,
                    )

                    resource = APKResource(
                        path=info.filename,
                        size=info.file_size,
                        sha256=file_sha256,
                        filetype_magika=stored_type,
                        entropy=file_entropy,
                    )

                    if suspicious:
                        resource.is_suspicious = True
                        self.suspicious_files.append(resource)

                    self.resources.append(resource)
                except Exception as e:
                    self.log.warning(
                        f"Error processing resource {info.filename}: {e}"
                    )
                    continue

        if not self.resources:
            return None

        return {
            "total_resource_count": len(self.resources),
            "total_resource_size": sum(r.size for r in self.resources),
            "suspicious_file_count": len(self.suspicious_files),
            "resources": self.resources,
            "suspicious_files": self.suspicious_files,
        }

    # ─── Export ──────────────────────────────────────────────────────────

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

            current_time = datetime.now(timezone.utc)
            data = []
            for res in self.resources:
                data.append([
                    self.sha256,
                    res.path,
                    res.size,
                    res.sha256,
                    res.filetype_magika,
                    res.entropy,
                    int(res.is_suspicious),
                    current_time,
                ])

            column_names = [
                'sha256', 'resource_path', 'resource_size',
                'resource_sha256', 'resource_magika', 'resource_entropy',
                'is_suspicious', 'analysis_date',
            ]

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

            return (data, column_names, column_type_names)

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