Vera Afreixo

30 papers Misc 10Journal 12Unranked 8
YearRankTypeTitle / Venue / Authors
2025 conf
ICCSA (Workshops 2)
Vera Afreixo, Vanusa Rocha, Filipa Rocha, Miguel Felgueiras
2025 conf
ICCSA (Workshops 2)
Pedro Macedo, Jorge Cabral, Vera Afreixo, Francisco Macedo, Mario Angelelli
2023 conf
ICCSA (Workshops 9)
Vera Afreixo, Jorge Cabral, Pedro Macedo
2023 J jnl
J. Integr. Bioinform.
Carlos A. C. Bastos, Vera Afreixo, João M. O. S. Rodrigues, Armando J. Pinho
2022 Misc conf
PACBB
Carlos A. C. Bastos, Vera Afreixo, João M. O. S. Rodrigues, Armando J. Pinho
2020 J jnl
Adv. Data Anal. Classif.
Ana Helena Tavares, Jakob Raymaekers, Peter J. Rousseeuw, Paula Brito, Vera Afreixo
2019 Misc conf
PACBB
Carlos A. C. Bastos, Vera Afreixo, João M. O. S. Rodrigues, Armando J. Pinho
2018 Misc conf
PACBB
Carlos A. C. Bastos, Vera Afreixo, João M. O. S. Rodrigues, Armando J. Pinho
2017 conf
ICCSA (2)
Adelaide Freitas, Sara Escudeiro, Vera Afreixo
2017 J jnl
Commun. Stat. Simul. Comput.
Sara Escudeiro, Adelaide Freitas, Vera Afreixo
2017 Misc conf
PACBB
Ana Helena Tavares, Jakob Raymaekers, Peter J. Rousseeuw, Raquel M. Silva, Carlos A. C. Bastos, Armando J. Pinho, Paula Brito, Vera Afreixo
2017 Misc conf
PACBB
Susana Ferreira, Vera Afreixo, Gabriela R. Moura, Ana Helena Tavares
2016 Misc conf
PACBB
Vera Afreixo, João M. O. S. Rodrigues, Carlos A. C. Bastos, Raquel M. Silva
2016 J jnl
BMC Bioinform.
Vera Afreixo, João M. O. S. Rodrigues, Carlos A. C. Bastos, Raquel M. Silva
2015 conf
ICPRAM (2)
Ana Helena Tavares, Vera Afreixo, João M. O. S. Rodrigues, Carlos A. C. Bastos
2014 Misc conf
PACBB
Vera Afreixo, João M. O. S. Rodrigues, Carlos A. C. Bastos
2014 J jnl
J. Integr. Bioinform.
Vera Afreixo, João M. O. S. Rodrigues, Carlos A. C. Bastos
2013 J jnl
IEEE ACM Trans. Comput. Biol. Bioinform.
Sara P. Garcia, João M. O. S. Rodrigues, Sérgio Santos, Diogo Pratas, Vera Afreixo, Carlos A. C. Bastos, Paulo Jorge S. G. Ferreira, Armando J. Pinho
2013 Misc conf
PACBB
Vera Afreixo, João M. O. S. Rodrigues, Sara P. Garcia
2013 J jnl
J. Integr. Bioinform.
Carlos A. C. Bastos, Vera Afreixo, Sara P. Garcia, Armando J. Pinho
2013 Misc conf
PACBB
Carlos A. C. Bastos, Vera Afreixo, Sara P. Garcia, Armando J. Pinho
2011 Misc conf
PACBB
Carlos A. C. Bastos, Vera Afreixo, Armando J. Pinho, Sara P. Garcia, João M. O. S. Rodrigues, Paulo Jorge S. G. Ferreira
2011 J jnl
Stat. Anal. Data Min.
Adelaide Freitas, Vera Afreixo, Miguel Pinheiro, José Luís Oliveira, Gabriela R. Moura, Manuel A. S. Santos
2011 J jnl
J. Integr. Bioinform.
Carlos A. C. Bastos, Vera Afreixo, Armando J. Pinho, Sara P. Garcia, João M. O. S. Rodrigues, Paulo Jorge S. G. Ferreira
2010 conf
IWPACBB
Vera Afreixo, Adelaide Freitas
2010 conf
PRIB
Armando J. Pinho, Sara P. Garcia, Paulo Jorge S. G. Ferreira, Vera Afreixo, Carlos A. C. Bastos, António J. R. Neves, João M. O. S. Rodrigues
2009 J jnl
Bioinform.
Vera Afreixo, Carlos A. C. Bastos, Armando J. Pinho, Sara P. Garcia, Paulo Jorge S. G. Ferreira
2006 J jnl
IEEE Trans. Biomed. Eng.
Armando J. Pinho, António J. R. Neves, Vera Afreixo, Carlos A. C. Bastos, Paulo Jorge S. G. Ferreira
2006 conf
ICASSP (5)
Paulo Jorge S. G. Ferreira, António J. R. Neves, Vera Afreixo, Armando J. Pinho
2004 J jnl
Digit. Signal Process.
Vera Afreixo, Paulo Jorge S. G. Ferreira, Dorabella M. S. Santos
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)