Ramiro Varela

94 papers A* 5A 1Misc 2Journal 46Unranked 37
YearRankTypeTitle / Venue / Authors
2026 ed.
AIQxQIA@ECAI
Marco Baioletti, Miguel Ángel González, Corrado Loglisci, Angelo Oddi, Riccardo Rasconi, Ramiro Varela
2025 J jnl
Nat. Comput.
Jesús Quesada, Francisco Javier Gil Gala, Marko Durasevic, María R. Sierra, Ramiro Varela
2025 J jnl
Swarm Evol. Comput.
Francisco Javier Gil Gala, Marko Durasevic, Domagoj Jakobovic, Ramiro Varela
2025 ed.
AIQxQIA@AI*IA
Marco Baioletti, Miguel Ángel González, Angelo Oddi, Riccardo Rasconi, Ramiro Varela
2025 J jnl
J. Heuristics
Francisco Javier Gil Gala, Marko Durasevic, María R. Sierra, Ramiro Varela
2024 conf
IWINAC (2)
Jesús Quesada, Francisco Javier Gil Gala, Marko Durasevic, María R. Sierra, Ramiro Varela
2023 conf
GECCO Companion
Jesús Quesada, Francisco Javier Gil Gala, Marko Durasevic, María R. Sierra, Ramiro Varela
2023 J jnl
Inf. Fusion
J. M. Górriz, I. Álvarez Illán, Agustín Álvarez-Marquina, Juan Eloy Arco, Martin Atzmüller, F. Ballarini, Emilia I. Barakova, Guido Bologna, María Paula Bonomini, Germán Castellanos-Domínguez, Diego Castillo-Barnes, S. B. Cho, A. Ricardo Contreras, J. M. Cuadra, Enrique Domínguez, Francisco Domínguez-Mateos, Richard J. Duro, David A. Elizondo, Antonio Fernández-Caballero, Eduardo Fernández, Marco A. Formoso, Nicolás Gallego-Molina, Javier Gamazo, Javier González Jiménez, Jacob Rodriguez-Rivero, Carlos Garre del Olmo, F. Javier Garrigós, Andrés Gómez-Rodellar, Pedro Gómez-Vilda, Manuel Graña, Bernabé Rodríguez-Tapia, Sophie C. F. Hendrikse, Carmen Jimenez-Mesa, Marina Jodra-Chuan, Vicente Julián, G. Gabriela Kotz, Krzysztof Kutt, Matthew Leming, Javier de Lope Asiaín, Beatriz del Cisne Macas Ordónez, V. Marrero-Aguiar, José Javier Martínez, Francisco Jesús Martínez-Murcia, Rafael Martínez-Tomás, Jirí Mekyska, Grzegorz J. Nalepa, Paulo Novais, D. Orellana, Andrés Ortiz, Daniel Palacios-Alonso, José T. Palma, António Pereira, Pedro Pinacho Davidson, María Angélica Pinninghoff, M. Ponticorvo, Alexandra Psarrou, Javier Ramírez, Mariano Rincón, Victoria Rodellar-Biarge, Ignacio Rodríguez-Rodríguez, Peter H. M. P. Roelofsma, José Santos, Diego Salas-Gonzalez, Pedro Salcedo Lagos, Fermín Segovia, Afshin Shoeibi, M. Silva, Dragan Simic, John Suckling, Jan Treur, Athanasios Tsanas, Ramiro Varela, Shui-Hua Wang, Wei Wang, Yu-Dong Zhang, Hengde Zhu, Ziquan Zhu, José Manuel Ferrández-Vicente
2023 J jnl
Inf. Sci.
Francisco Javier Gil Gala, Marko Durasevic, Ramiro Varela, Domagoj Jakobovic
2023 J jnl
Nat. Comput.
Francisco Javier Gil Gala, Marko Durasevic, María R. Sierra, Ramiro Varela
2023 conf
AIQxQIA@AI*IA
Lis Arufe, Riccardo Rasconi, Angelo Oddi, Ramiro Varela, Miguel Ángel González
2023 J jnl
Appl. Soft Comput.
Lis Arufe, Riccardo Rasconi, Angelo Oddi, Ramiro Varela, Miguel A. González
2023 J jnl
Nat. Comput.
José Manuel Ferrández, José Santos, Ramiro Varela
2023 ed.
AIQxQIA@AI*IA
Marco Baioletti, Miguel Ángel González, Angelo Oddi, Riccardo Rasconi, Ramiro Varela
2023 J jnl
Nat. Comput.
Lis Arufe, Riccardo Rasconi, Angelo Oddi, Ramiro Varela, Miguel Ángel González
2023 J jnl
Expert Syst. Appl.
Francisco Javier Gil Gala, María R. Sierra, Carlos Mencía, Ramiro Varela
2022 J jnl
Nat. Comput.
Raúl Mencía, Carlos Mencía, Ramiro Varela
2022 conf
IWINAC (1)
Francisco Javier Gil Gala, Marko Durasevic, María R. Sierra, Ramiro Varela
2022 J jnl
Nat. Comput.
Francisco Javier Gil Gala, María R. Sierra, Carlos Mencía, Ramiro Varela
2022 conf
IWINAC (1)
Lis Arufe, Riccardo Rasconi, Angelo Oddi, Ramiro Varela, Miguel Ángel González
2022 J jnl
Swarm Evol. Comput.
Lis Arufe, Miguel A. González, Angelo Oddi, Riccardo Rasconi, Ramiro Varela
2021 J jnl
Eng. Appl. Artif. Intell.
Raúl Mencía, Carlos Mencía, Ramiro Varela
2021 J jnl
Swarm Evol. Comput.
Francisco Javier Gil Gala, María R. Sierra, Carlos Mencía, Ramiro Varela
2021 J jnl
Integr. Comput. Aided Eng.
Francisco Javier Gil Gala, Carlos Mencía, María R. Sierra, Ramiro Varela
2021 conf
GECCO Companion
Francisco Javier Gil Gala, María R. Sierra, Carlos Mencía, Ramiro Varela
2020 A conf
ECAI
Francisco Javier Gil Gala, Carlos Mencía, María R. Sierra, Ramiro Varela
2019 J jnl
Integr. Comput. Aided Eng.
Carlos Mencía, María R. Sierra, Raúl Mencía, Ramiro Varela
2019 J jnl
Appl. Soft Comput.
Francisco Javier Gil Gala, Carlos Mencía, María R. Sierra, Ramiro Varela
2019 conf
IWINAC (2)
Francisco Javier Gil Gala, Ramiro Varela
2019 J jnl
Nat. Comput.
José Manuel Ferrández, José Santos Reyes, Ramiro Varela
2019 conf
IWINAC (2)
Raúl Mencía, Carlos Mencía, Ramiro Varela
2017 J jnl
Nat. Comput.
José Manuel Ferrández, Ramiro Varela
2017 conf
IWINAC (1)
Jorge García-Álvarez, Miguel A. González, Camino R. Vela, Ramiro Varela
2017 conf
IWINAC (1)
Carlos Mencía, María R. Sierra, Raúl Mencía, Ramiro Varela
2016 J jnl
Integr. Comput. Aided Eng.
Raúl Mencía, María R. Sierra, Carlos Mencía, Ramiro Varela
2016 J jnl
Pattern Recognit. Lett.
Tong Wu, Yanchun Liang, Ramiro Varela, Chunguo Wu, Guozhong Zhao, Xiaosong Han
2015 J jnl
AI Commun.
Miguel A. González, Camino R. Vela, Ramiro Varela, Inés González Rodríguez
2015 J jnl
Comput. Ind. Eng.
Alejandro Hernández-Arauzo, Jorge Puente, Ramiro Varela, Javier Sedano
2015 conf
IWINAC (2)
Raúl Mencía, María R. Sierra, Ramiro Varela
2015 J jnl
Appl. Soft Comput.
Raúl Mencía, María R. Sierra, Carlos Mencía, Ramiro Varela
2015 J jnl
J. Intell. Manuf.
María R. Sierra, Carlos Mencía, Ramiro Varela
2015 J jnl
Eur. J. Oper. Res.
Miguel A. González, Camino R. Vela, Ramiro Varela
2015 J jnl
Comput. Oper. Res.
Miguel A. González, Angelo Oddi, Riccardo Rasconi, Ramiro Varela
2015 A* conf
ICAPS
Raúl Mencía, María R. Sierra, Carlos Mencía, Ramiro Varela
2015 J jnl
AI Commun.
Carlos Mencía, María R. Sierra, Miguel A. Salido, Joan Escamilla, Ramiro Varela
2014 J jnl
Nat. Comput.
Raúl Mencía, María R. Sierra, Carlos Mencía, Ramiro Varela
2014 J jnl
J. Intell. Manuf.
Carlos Mencía, María R. Sierra, Ramiro Varela
2014 J jnl
Nat. Comput.
José Manuel Ferrández, Ramiro Varela
2013 A* conf
ICAPS
Miguel A. González, Camino R. Vela, Ramiro Varela
2013 J jnl
Ann. Oper. Res.
Carlos Mencía, María R. Sierra, Ramiro Varela
2013 J jnl
J. Intell. Manuf.
Miguel A. González, Camino R. Vela, Inés González Rodríguez, Ramiro Varela
2013 conf
KSE (2)
Thanh-Do Tran, Ramiro Varela, Inés González Rodríguez, El-Ghazali Talbi
2012 J jnl
Nat. Comput.
Miguel A. González, Camino R. Vela, Ramiro Varela
2012 J jnl
Soft Comput.
Miguel A. González, Inés González Rodríguez, Camino R. Vela, Ramiro Varela
2012 J jnl
Nat. Comput.
Ramiro Varela, José Manuel Ferrández
2011 conf
IWINAC (2)
Raúl Mencía, María R. Sierra, Carlos Mencía, Ramiro Varela
2011 conf
CAEPIA
María R. Sierra, Carlos Mencía, Ramiro Varela
2011 conf
CAEPIA
Miguel A. González, Camino R. Vela, Ramiro Varela
2010 J jnl
J. Heuristics
Camino R. Vela, Ramiro Varela, Miguel A. González
2010 A* conf
ICAPS
Carlos Mencía, María R. Sierra, Ramiro Varela
2010 J jnl
J. Intell. Manuf.
María R. Sierra, Ramiro Varela
2010 J jnl
Int. J. Reason. based Intell. Syst.
María R. Sierra, Ramiro Varela
2009 conf
CAEPIA
Miguel A. González, Camino R. Vela, Ramiro Varela
2009 J jnl
Ann. Oper. Res.
Ramiro Varela, Camino R. Vela, Jorge Puente, María R. Sierra, Inés González Rodríguez
2009 conf
IWINAC (1)
Miguel A. González, Camino R. Vela, Ramiro Varela
2008 A* conf
ICAPS
Miguel A. González, Camino R. Vela, Ramiro Varela
2008 A* conf
ICAPS
Inés González Rodríguez, Camino R. Vela, Jorge Puente, Ramiro Varela
2008 conf
IBERAMIA
Inés González Rodríguez, Jorge Puente, Ramiro Varela, Camino R. Vela
2008 conf
ICSOFT (PL/DPS/KE)
María R. Sierra, Ramiro Varela
2008 J jnl
IEEE Trans. Syst. Man Cybern. Part A
Inés González Rodríguez, Jorge Puente, Camino R. Vela, Ramiro Varela
2007 conf
ICSOFT (PL/DPS/KE/MUSE)
Ramiro Varela, César Muñoz, María R. Sierra, Inés González Rodríguez
2007 conf
ICSOFT/ENASE (Selected Papers)
Ramiro Varela, César Muñoz, María R. Sierra, Inés González Rodríguez
2007 conf
IWINAC (1)
César Muñoz, María R. Sierra, Jorge Puente, Camino R. Vela, Ramiro Varela
2006 conf
ICSOFT (Selected Papers)
Miguel A. González, María R. Sierra, Camino R. Vela, Ramiro Varela, Jorge Puente
2006 conf
ICSOFT (2)
Miguel A. González, María R. Sierra, Camino R. Vela, Ramiro Varela, Jorge Puente
2006 conf
MICAI
Miguel A. González, Camino R. Vela, María R. Sierra, Inés González Rodríguez, Ramiro Varela
2006 Misc conf
ICAISC
Miguel A. González, Camino R. Vela, Ramiro Varela
2005 conf
CAEPIA
Miguel A. González, María R. Sierra, Camino R. Vela, Ramiro Varela
2005 conf
IWINAC (2)
Ramiro Varela, David Serrano, María R. Sierra
2005 conf
AI*IA
María R. Sierra, Ramiro Varela
2003 J jnl
Eur. J. Oper. Res.
Ramiro Varela, Camino R. Vela, Jorge Puente, Alberto Gómez
2003 J jnl
Inteligencia Artif.
Camino R. Vela, Jorge Puente, César Luis Alonso, Ramiro Varela
2003 conf
CAEPIA
Jorge Puente, Helio R. Díez, Ramiro Varela, Camino R. Vela, Luis P. Hidalgo
2003 conf
IWANN (2)
Jorge Puente, Camino R. Vela, Carlos Prieto, Ramiro Varela
2002 conf
JCIS
Ramiro Varela, Camino R. Vela, Jorge Puente, David Serrano, Ana Suárez
2002 conf
IBERAMIA
Ramiro Varela, Elena Soto
2001 conf
IWANN (1)
Camino R. Vela, Ramiro Varela, Jorge Puente
2001 J jnl
Int. J. Comput. Math.
César Luis Alonso, Camino R. Vela, Ramiro Varela, Jorge Puente
2000 J jnl
Int. J. Parallel Program.
Ramiro Varela, Camino R. Vela, Jorge Puente, César Luis Alonso
1999 conf
IWANN (1)
Ramiro Varela, Alberto Gómez, Camino R. Vela, Jorge Puente, César Luis Alonso
1998 conf
APPIA-GULP-PRODE
Jorge Puente, Ramiro Varela, Camino R. Vela, César Luis Alonso
1997 Misc conf
IWANN
Camino R. Vela, César Luis Alonso, Ramiro Varela, Jorge Puente
1996 conf
APPIA-GULP-PRODE
Ramiro Varela, Camino R. Vela, Jorge Puente
1994 conf
GULP-PRODE (1)
Ramiro Varela
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"