Catherine A. Ball

21 papers Journal 21
YearRankTypeTitle / Venue / Authors
2021 J jnl
BMC Bioinform.
Yong Wang, Shiya Song, Joshua G. Schraiber, Alisa Sedghifar, Jake K. Byrnes, David A. Turissini, Eurie L. Hong, Catherine A. Ball, Keith Noto
2014 J jnl
Nucleic Acids Res.
James C. Hu, Gavin Sherlock, Deborah A. Siegele, Suzanne A. Aleksander, Catherine A. Ball, Janos Demeter, Sushanth Gouni, Timothy A. Holland, Peter D. Karp, John E. Lewis, Nathan M. Liles, Brenley K. McIntosh, Huaiyu Mi, Anushya Muruganujan, Farrell Wymore, Paul D. Thomas
2010 J jnl
Bioinform.
Ravi Shankar, Helen E. Parkinson, Tony Burdett, Emma Hastings, Junmin Liu, Michael Miller, Rashmi Srinivasa, Joseph White, Alvis Brazma, Gavin Sherlock, Christian J. Stoeckert Jr., Catherine A. Ball
2009 J jnl
Nucleic Acids Res.
Jeremy Hubble, Janos Demeter, Heng jin, Maria Mao, Michael Nitzberg, T. B. K. Reddy, Farrell Wymore, Zachariah K. Zachariah, Gavin Sherlock, Catherine A. Ball
2009 J jnl
Nucleic Acids Res.
T. B. K. Reddy, Robert Riley, Farrell Wymore, Phillip Montgomery, David DeCaprio, Reinhard Engels, Marcel Gellesch, Jeremy Hubble, Dennis Jen, Heng jin, Michael Koehrsen, Lisa Larson, Maria Mao, Michael Nitzberg, Peter Sisk, Christian Stolte, Brian Weiner, Jared White, Zachariah K. Zachariah, Gavin Sherlock, James E. Galagan, Catherine A. Ball, Gary K. Schoolnik
2008 J jnl
Neuroinformatics
John Darrell Van Horn, Catherine A. Ball
2008 J jnl
Nucleic Acids Res.
Robert J. Marinelli, Kelli Montgomery, Chih Long Liu, Nigam H. Shah, Wijan Prapong, Michael Nitzberg, Zachariah K. Zachariah, Gavin Sherlock, Yasodha Natkunam, Robert B. West, Matt van de Rijn, Patrick O. Brown, Catherine A. Ball
2008 J jnl
BMC Bioinform.
Donald Maier, Farrell Wymore, Gavin Sherlock, Catherine A. Ball
2007 J jnl
BMC Bioinform.
Catherine Beauheim, Farrell Wymore, Michael Nitzberg, Zachariah K. Zachariah, Heng jin, Jesse H. Pate Skene, Catherine A. Ball, Gavin Sherlock
2007 J jnl
Nucleic Acids Res.
Janos Demeter, Catherine Beauheim, Jeremy Gollub, Tina Hernandez-Boussard, Heng jin, Donald Maier, John C. Matese, Michael Nitzberg, Farrell Wymore, Zachariah K. Zachariah, Patrick O. Brown, Gavin Sherlock, Catherine A. Ball
2006 J jnl
BMC Bioinform.
Tim F. Rayner, Philippe Rocca-Serra, Paul T. Spellman, Helen C. Causton, Anna Farne, Ele Holloway, Rafael A. Irizarry, Junmin Liu, Donald Maier, Michael Miller, Kjell Petersen, John Quackenbush, Gavin Sherlock, Christian J. Stoeckert Jr., Joseph White, Patricia L. Whetzel, Farrell Wymore, Helen E. Parkinson, Ugis Sarkans, Catherine A. Ball, Alvis Brazma
2005 J jnl
Nucleic Acids Res.
Catherine A. Ball, Ihab A. B. Awad, Janos Demeter, Jeremy Gollub, Joan M. Hebert, Tina Hernandez-Boussard, Heng jin, John C. Matese, Michael Nitzberg, Farrell Wymore, Zachariah K. Zachariah, Patrick O. Brown, Gavin Sherlock
2004 J jnl
BMC Bioinform.
Ihab A. B. Awad, Christian A. Rees, Tina Hernandez-Boussard, Catherine A. Ball, Gavin Sherlock
2003 J jnl
Nucleic Acids Res.
Jeremy Gollub, Catherine A. Ball, Gail Binkley, Janos Demeter, David B. Finkelstein, Joan M. Hebert, Tina Hernandez-Boussard, Heng jin, Miroslava Kaloper, John C. Matese, Mark Schroeder, Patrick O. Brown, David Botstein, Gavin Sherlock
2002 J jnl
Bioinform.
Catherine A. Ball, Gavin Sherlock, Helen E. Parkinson, Philippe Rocca-Serra, Catherine Brooksbank, Helen C. Causton, Duccio Cavalieri, Terry Gaasterland, Pascal Hingamp, Frank C. P. Holstege, Martin Ringwald, Paul T. Spellman, Christian J. Stoeckert Jr., Jason E. Stewart, Ronald C. Taylor, Alvis Brazma, John Quackenbush
2002 J jnl
Nucleic Acids Res.
Selina S. Dwight, Midori A. Harris, Kara Dolinski, Catherine A. Ball, Gail Binkley, Karen R. Christie, Dianna G. Fisk, Laurie Issel-Tarver, Mark Schroeder, Gavin Sherlock, Anand Sethuraman, Shuai Weng, David Botstein, J. Michael Cherry
2001 J jnl
Nucleic Acids Res.
Catherine A. Ball, Heng jin, Gavin Sherlock, Shuai Weng, John C. Matese, Rey Andrada, Gail Binkley, Kara Dolinski, Selina S. Dwight, Midori A. Harris, Laurie Issel-Tarver, Mark Schroeder, David Botstein, J. Michael Cherry
2001 J jnl
Nucleic Acids Res.
Gavin Sherlock, Tina Hernandez-Boussard, Andrew Kasarskis, Gail Binkley, John C. Matese, Selina S. Dwight, Miroslava Kaloper, Shuai Weng, Heng jin, Catherine A. Ball, Michael B. Eisen, Paul T. Spellman, Patrick O. Brown, David Botstein, J. Michael Cherry
2000 J jnl
Nucleic Acids Res.
Catherine A. Ball, Kara Dolinski, Selina S. Dwight, Midori A. Harris, Laurie Issel-Tarver, Andrew Kasarskis, Charles R. Scafe, Gavin Sherlock, Gail Binkley, Heng jin, Miroslava Kaloper, Sidney D. Orr, Mark Schroeder, Shuai Weng, Yan Zhu, David Botstein, J. Michael Cherry
1999 J jnl
Nucleic Acids Res.
Stephen A. Chervitz, Erich T. Hester, Catherine A. Ball, Kara Dolinski, Selina S. Dwight, Midori A. Harris, Gail Juvik, Alice Malekian, Shannon Roberts, TaiYun Roe, Charles R. Scafe, Mark Schroeder, Gavin Sherlock, Shuai Weng, Yan Zhu, J. Michael Cherry, David Botstein
1998 J jnl
Nucleic Acids Res.
J. Michael Cherry, Caroline Adler, Catherine A. Ball, Stephen A. Chervitz, Selina S. Dwight, Erich T. Hester, Yankai Jia, Gail Juvik, TaiYun Roe, Mark Schroeder, Shuai Weng, David Botstein
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)