Oronzo Parlangeli

41 papers A* 1Journal 14Unranked 25
YearRankTypeTitle / Venue / Authors
2026 J jnl
Int. J. Soc. Robotics
Simone Grassini, Stefano Guidi, Oronzo Parlangeli
2025 conf
ECCE
Oronzo Parlangeli, Gerrit C. van der Veer, Maurice D. Mulvenna, Anke Dittmar, Harry J. Witchel, Raymond R. Bond
2025 conf
ECCE
Gerrit C. van der Veer, Oronzo Parlangeli, Maurice D. Mulvenna
2025 conf
ECCE
Stefano Guidi, Lorenzo Reina, Francesco Currò, Enrico Cipriani, Simone Grassini, Oronzo Parlangeli
2025 conf
HCI (6)
Lorenzo Reina, Enrica Marchigiani, Margherita Bracci, Francesco Currò, Stefano Guidi, Paola Palmitesta, Stefano D'ambrosio, Oronzo Parlangeli
2025 conf
ICSR+AI (3)
Ludovica Misino, Oronzo Parlangeli, Luca Lusuardi, Alessandro Innocenti, Stefano Guidi
2025 J jnl
Behav. Inf. Technol.
Stefano Guidi, Margherita Bracci, Francesco Currò, Alessandro Innocenti, Luca Lusuardi, Enrica Marchigiani, Paola Palmitesta, Matteo Sirizzotti, Oronzo Parlangeli
2024 J jnl
Behav. Inf. Technol.
Oronzo Parlangeli, Francesco Currò, Paola Palmitesta, Stefano Guidi
2024 conf
ECCE
Stefano Guidi, Margherita Bracci, Francesco Currò, Alessandro Innocenti, Luca Lusuardi, Enrica Marchigiani, Paola Palmitesta, Matteo Sirizzotti, Oronzo Parlangeli
2024 conf
HCI (30)
Oronzo Parlangeli, Margherita Bracci, Enrica Marchigiani, Paola Palmitesta, Francesco Currò, Matteo Sirizzotti, Stefano Guidi
2023 conf
ECCE
Oronzo Parlangeli, Francesco Currò, Paola Palmitesta, Stefano Guidi
2023 J jnl
Behav. Inf. Technol.
Oronzo Parlangeli, Paola Palmitesta, Margherita Bracci, Enrica Marchigiani, Stefano Guidi
2023 conf
HCI (23)
Oronzo Parlangeli, Paola Palmitesta, Leonardo Masi, Michele Tittarelli, Stefano Guidi
2023 J jnl
Interact. Comput.
Stefano Guidi, Paola Palmitesta, Margherita Bracci, Enrica Marchigiani, Oronzo Parlangeli
2023 conf
HCI (20)
Oronzo Parlangeli, Paul M. Liston
2022 conf
ECCE
Oronzo Parlangeli, Margherita Bracci, Enrica Marchigiani, Paola Palmitesta, Stefano Guidi
2022 A* conf
HRI
Giulia Perugia, Stefano Guidi, Margherita Bicchi, Oronzo Parlangeli
2022 J jnl
Sci. Eng. Ethics
Oronzo Parlangeli, Paola Palmitesta, Margherita Bracci, Enrica Marchigiani, Ileana Di Pomponio, Stefano Guidi
2022 conf
HCI (15)
Oronzo Parlangeli, Margherita Bracci, Stefano Guidi, Enrica Marchigiani, Paola Palmitesta
2021 J jnl
Behav. Inf. Technol.
Patrizia Marti, Oronzo Parlangeli, Annamaria Recupero
2021 conf
HCI (13)
Oronzo Parlangeli, Enrica Marchigiani, Margherita Bracci, Maurizio Boldrini, Ileana Di Pomponio, Paola Palmitesta
2021 ed.
ECCE
Patrizia Marti, Oronzo Parlangeli, Annamaria Recupero
2021 conf
ECCE
Stefano Guidi, Enrica Marchigiani, Sergio Roncato, Oronzo Parlangeli
2021 J jnl
Behav. Inf. Technol.
Stefano Guidi, Enrica Marchigiani, Sergio Roncato, Oronzo Parlangeli
2021 conf
HCI (14)
Oronzo Parlangeli, Sonia Grifoni, Paola Palmitesta, Alessandro Andreadis, Paul M. Liston, Stefano Guidi
2021 conf
AHFE (15)
Oronzo Parlangeli, Paola Palmitesta, Stefano Guidi, Ileana Di Pomponio, Margherita Bracci, Enrica Marchigiani
2021 J jnl
Univers. Access Inf. Soc.
Alessandro Andreadis, Riccardo Zambon, Oronzo Parlangeli
2021 conf
ECCE
Patrizia Marti, Oronzo Parlangeli, Annamaria Recupero, Matteo Sirizzotti, Stefano Guidi
2020 conf
IISA
Oronzo Parlangeli, Stefano Guidi, Enrica Marchigiani, Paola Palmitesta, Alessandro Andreadis, Sergio Roncato
2020 conf
HCI (14)
Oronzo Parlangeli, Enrica Marchigiani, Stefano Guidi, Margherita Bracci, Alessandro Andreadis, Riccardo Zambon
2020 J jnl
Hum. Factors
Oronzo Parlangeli, Paul M. Liston, Enrica Marchigiani, Margherita Bracci, Alessandra Giani
2020 J jnl
Sci. Eng. Ethics
Oronzo Parlangeli, Stefano Guidi, Enrica Marchigiani, Margherita Bracci, Paul M. Liston
2019 conf
CHItaly
Oronzo Parlangeli, Stefano Guidi, Enrica Marchigiani, Paul M. Liston, Andrea Zucchiatti
2014 conf
HCI (23)
Oronzo Parlangeli, Maria Cristina Caratozzolo, Stefano Guidi
2011 conf
CHItaly
Oronzo Parlangeli, Guido Mengoni, Stefano Guidi
2009 conf
HCI (10)
Maria Cristina Caratozzolo, Enrica Marchigiani, Oronzo Parlangeli, Marcella Zaccariello
2008 J jnl
Behav. Inf. Technol.
Maria Cristina Caratozzolo, Sebastiano Bagnara, Oronzo Parlangeli
1999 J jnl
Interact. Comput.
Oronzo Parlangeli, Enrica Marchigiani, Sebastiano Bagnara
1997 conf
HCI (1)
M. Mariani, Oronzo Parlangeli, Sebastiano Bagnara
1996 J jnl
ACM SIGCHI Bull.
Antonio Rizzo, Oronzo Parlangeli, Enrica Marchigiani, Sebastiano Bagnara
1993 conf
HCI (2)
Antonio Rizzo, Oronzo Parlangeli, C. Cambiganu, Sebastiano Bagnara
redb/extractors/js_extractors/js_deobfuscator.py
← Index redb/extractors/js_extractors/js_deobfuscator.py python
"""Subprocess-driven JavaScript deobfuscator with jsbeautifier fallback.

Owns the heavy lifting that was previously embedded inside
`JSDeobfuscationExtractor` (`_run_deobfuscator` + `_try_jsbeautifier`). Exposed
as a single module-level entry point `deobfuscate(source, log)` so it can be
called from `JSContext.deobfuscated` (cached per sample) without dragging
extractor state through the call.

Configuration (env vars):
    JS_DEOBFUSCATOR_PATH    Path or name of the external tool (default: webcrack).
    JS_DEOBFUSCATE_TIMEOUT  Seconds before the external tool is killed
                            (process-group SIGTERM, then SIGKILL). Default: 60.

If the external tool produces non-empty output and exits 0, that wins. Otherwise
the source is run through jsbeautifier (which only normalises formatting, but
already exposes strings hidden by minification). If neither path produces
output, returns (None, None).

`FileNotFoundError` for the external tool is treated as routine — the analysis
server is either provisioned with the tool or it isn't — and demoted to a
debug-level log.
"""

import os
import signal
import subprocess
import tempfile
from typing import Optional, Tuple

DEFAULT_DEOBFUSCATOR = "webcrack"
DEFAULT_TIMEOUT_SECS = 60


def _run_external(
    source: str, deobfuscator_path: str, timeout: int, log
) -> Tuple[Optional[str], int]:
    """Run the configured external deobfuscator over `source` and capture stdout.

    Returns (text, returncode). `text` is `None` and `returncode` is `-1` when
    the binary is missing, the run timed out, or any other unexpected failure
    occurred. Missing-binary is logged at debug; timeouts and unexpected errors
    surface at warning/error.
    """
    try:
        with tempfile.NamedTemporaryFile(
            suffix=".js", mode="w", delete=False, encoding="utf-8"
        ) as tmp:
            tmp.write(source)
            tmp_path = tmp.name

        try:
            process = subprocess.Popen(
                [deobfuscator_path, tmp_path],
                stdout=subprocess.PIPE,
                stderr=subprocess.PIPE,
                preexec_fn=os.setsid,
            )

            try:
                stdout, _ = process.communicate(timeout=timeout)
                return stdout.decode("utf-8", errors="replace"), process.returncode
            except subprocess.TimeoutExpired:
                # Kill the entire process group so spawned helpers (e.g. node
                # subprocesses webcrack itself launches) get cleaned up too.
                try:
                    os.killpg(os.getpgid(process.pid), signal.SIGTERM)
                    process.wait(timeout=5)
                except Exception:
                    try:
                        os.killpg(os.getpgid(process.pid), signal.SIGKILL)
                    except Exception:
                        pass
                log.warning(f"Deobfuscation timed out after {timeout}s")
                return None, -1
        finally:
            try:
                os.unlink(tmp_path)
            except Exception:
                pass
    except FileNotFoundError:
        log.debug(f"Deobfuscator binary not found at {deobfuscator_path}")
        return None, -1
    except Exception as e:
        log.error(f"Error running deobfuscator: {e}")
        return None, -1


def _try_jsbeautifier(source: str, log) -> Tuple[Optional[str], Optional[str]]:
    """Fallback path: format the source with jsbeautifier. Returns
    `(text, "jsbeautifier")` or `(None, None)` if jsbeautifier isn't installed
    or the call raised."""
    try:
        import jsbeautifier
        opts = jsbeautifier.default_options()
        opts.indent_size = 2
        return jsbeautifier.beautify(source, opts), "jsbeautifier"
    except ImportError:
        log.debug("jsbeautifier not available")
        return None, None
    except Exception as e:
        log.warning(f"jsbeautifier failed: {e}")
        return None, None


def deobfuscate(source: str, log) -> Tuple[Optional[str], Optional[str]]:
    """Run the configured external deobfuscator, falling back to jsbeautifier.

    Returns `(text, normalizer_used)` on success, or `(None, None)` when neither
    path produced non-empty output. `normalizer_used` is the basename of the
    external tool (e.g. `"webcrack"`) or the literal `"jsbeautifier"`.
    """
    if not source:
        return None, None

    deobfuscator_path = os.getenv("JS_DEOBFUSCATOR_PATH", DEFAULT_DEOBFUSCATOR)
    timeout = int(os.getenv("JS_DEOBFUSCATE_TIMEOUT", str(DEFAULT_TIMEOUT_SECS)))

    text, returncode = _run_external(source, deobfuscator_path, timeout, log)
    if text and returncode == 0 and text.strip():
        return text, os.path.basename(deobfuscator_path)

    return _try_jsbeautifier(source, log)