Raffaele Guarasci

29 papers B 1Misc 1Journal 12Unranked 15
YearRankTypeTitle / Venue / Authors
2025 J jnl
Quantum Mach. Intell.
Giuseppe Buonaiuto, Raffaele Guarasci, Giuseppe De Pietro, Massimo Esposito
2025 conf
Ital-IA
Stefano Silvestri, Emanuele Damiano, Raffaele Guarasci, Mario Ciampi
2024 J jnl
Expert Syst. Appl.
Raffaele Guarasci, Rosario Catelli, Massimo Esposito
2024 J jnl
Computación y Sistemas (CyS)
Haider Zaman-Khan, Muddasar Naeem, Raffaele Guarasci, Umamah Bint Khalid, Massimo Esposito, Francesco Gargiulo
2024 conf
EIDWT
Raffaele Guarasci, Stefano Silvestri, Massimo Esposito
2024 J jnl
CoRR
Giuseppe Buonaiuto, Raffaele Guarasci, Aniello Minutolo, Giuseppe De Pietro, Massimo Esposito
2024 conf
QUASAR@HPDC
Giuseppe Buonaiuto, Raffaele Guarasci, Massimo Esposito
2024 J jnl
Quantum Mach. Intell.
Giuseppe Buonaiuto, Raffaele Guarasci, Aniello Minutolo, Giuseppe De Pietro, Massimo Esposito
2024 conf
ASONAM (Workshops)
Raffaele Guarasci
2024 conf
EIDWT
Elena Cardillo, Alessio Portaro, Maria Taverniti, Claudia Lanza, Raffaele Guarasci
2023 conf
NUMTA (3)
Raffaele Guarasci, Giuseppe Buonaiuto, Giuseppe De Pietro, Massimo Esposito
2023 J jnl
J. Ambient Intell. Humaniz. Comput.
Raffaele Guarasci, Stefano Silvestri, Giuseppe De Pietro, Hamido Fujita, Massimo Esposito
2022 J jnl
Neural Comput. Appl.
Aniello Minutolo, Raffaele Guarasci, Emanuele Damiano, Giuseppe De Pietro, Hamido Fujita, Massimo Esposito
2022 J jnl
IEEE Access
Francesco Gargiulo, Aniello Minutolo, Raffaele Guarasci, Emanuele Damiano, Giuseppe De Pietro, Hamido Fujita, Massimo Esposito
2022 J jnl
Comput. Speech Lang.
Raffaele Guarasci, Stefano Silvestri, Giuseppe De Pietro, Hamido Fujita, Massimo Esposito
2022 B conf
LREC
Federico Bonetti, Elisa Leonardelli, Daniela Trotta, Raffaele Guarasci, Sara Tonelli
2021 J jnl
IEEE Access
Raffaele Guarasci, Aniello Minutolo, Emanuele Damiano, Giuseppe De Pietro, Hamido Fujita, Massimo Esposito
2021 conf
EMNLP (Findings)
Daniela Trotta, Raffaele Guarasci, Elisa Leonardelli, Sara Tonelli
2021 J jnl
CoRR
Daniela Trotta, Raffaele Guarasci, Elisa Leonardelli, Sara Tonelli
2020 J jnl
Expert Syst. Appl.
Raffaele Guarasci, Emanuele Damiano, Aniello Minutolo, Massimo Esposito, Giuseppe De Pietro
2019 conf
SNAMS
Raffaele Guarasci, Emanuele Damiano, Aniello Minutolo, Massimo Esposito
2019 conf
CLiC-it
Raffaele Guarasci, Emanuele Damiano, Aniello Minutolo, Massimo Esposito
2018 conf
CLiC-it
Daniela Trotta, Michele Stingo, Teresa Albanese, Raffaele Guarasci, Annibale Elia
2018 conf
AINA Workshops
Alessandro Maisto, Serena Pelosi, Raffaele Guarasci, Pierluigi Vitale
2017 conf
NooJ
Mario Monteleone, Raffaele Guarasci, Alessandro Maisto
2017 conf
3PGCIC
Fiammetta Marulli, Marco Pota, Massimo Esposito, Alessandro Maisto, Raffaele Guarasci
2016 conf
DH
Stefano Perna, Raffaele Guarasci, Alessandro Maisto, Pierluigi Vitale
2015 conf
NooJ
Alessandro Maisto, Raffaele Guarasci
2015 Misc conf
RANLP
Annibale Elia, Serena Pelosi, Alessandro Maisto, Raffaele Guarasci
redb/extractors/decompiler/apk/apktool_wrapper.py
← Index redb/extractors/decompiler/apk/apktool_wrapper.py python
"""Apktool disassembler subprocess wrapper.

Manages apktool subprocess execution for smali disassembly,
following the CAPA extractor subprocess pattern.
"""

import os
import signal
import subprocess
from typing import List, Optional


class ApktoolDisassembler:
    """Subprocess wrapper for apktool smali disassembly."""

    def __init__(
        self, apktool_path: str = None, timeout: int = None, log=None
    ):
        self.apktool_path = apktool_path or os.getenv("APKTOOL_PATH", "apktool")
        self.timeout = timeout or int(os.getenv("APKTOOL_TIMEOUT", "120"))
        self.log = log

    def disassemble(self, apk_path: str, output_dir: str) -> bool:
        """Run apktool disassembly on an APK file.

        Returns True on success, False on failure.
        """
        cmd = [
            self.apktool_path,
            "d",
            "--no-res",
            "--force",
            "--output", output_dir,
            apk_path,
        ]

        try:
            process = subprocess.Popen(
                cmd,
                stdout=subprocess.PIPE,
                stderr=subprocess.PIPE,
                text=True,
                preexec_fn=os.setsid,
            )

            try:
                stdout, stderr = process.communicate(timeout=self.timeout)
                if process.returncode != 0:
                    if self.log:
                        self.log.warning(
                            f"apktool returned non-zero exit code {process.returncode}: "
                            f"{stderr[:500] if stderr else 'no stderr'}"
                        )
                    return False
                return True

            except subprocess.TimeoutExpired:
                if self.log:
                    self.log.error(
                        f"apktool timed out after {self.timeout}s"
                    )
                try:
                    os.killpg(os.getpgid(process.pid), signal.SIGTERM)
                    process.wait(timeout=3)
                except (ProcessLookupError, subprocess.TimeoutExpired):
                    try:
                        os.killpg(os.getpgid(process.pid), signal.SIGKILL)
                    except ProcessLookupError:
                        pass
                return False

        except FileNotFoundError:
            if self.log:
                self.log.error(
                    f"apktool not found at '{self.apktool_path}'. "
                    "Install apktool or set APKTOOL_PATH env var."
                )
            return False
        except Exception as e:
            if self.log:
                self.log.error(f"apktool execution error: {e}")
            return False

    def get_smali_directories(self, output_dir: str) -> List[str]:
        """Return paths to all smali output directories.

        Handles multi-DEX: smali/, smali_classes2/, smali_classes3/, etc.
        """
        smali_dirs = []
        if not os.path.isdir(output_dir):
            return smali_dirs

        for entry in sorted(os.listdir(output_dir)):
            if entry == "smali" or entry.startswith("smali_classes"):
                full_path = os.path.join(output_dir, entry)
                if os.path.isdir(full_path):
                    smali_dirs.append(full_path)

        return smali_dirs