Rana Abbas

28 papers B 4Journal 18Unranked 5
YearRankTypeTitle / Venue / Authors
2022 J jnl
IEEE Commun. Lett.
Wen Jun Lim, Rana Abbas, Yonghui Li, Branka Vucetic, Mahyar Shirvanimoghaddam
2021 J jnl
CoRR
Xiaoshui Huang, Guofeng Mei, Jian Zhang, Rana Abbas
2021 J jnl
CoRR
Wen Jun Lim, Mahyar Shirvanimoghaddam, Rana Abbas, Yonghui Li, Branka Vucetic
2021 J jnl
IEEE Trans. Veh. Technol.
Wen Jun Lim, Rana Abbas, Yonghui Li, Branka Vucetic, Mahyar Shirvanimoghaddam
2020 J jnl
IEEE Commun. Surv. Tutorials
Muhammad Basit Shahab, Rana Abbas, Mahyar Shirvanimoghaddam, Sarah J. Johnson
2020 J jnl
CoRR
Rana Abbas, Tao Huang, Basit Shahab, Mahyar Shirvanimoghaddam, Yonghui Li, Branka Vucetic
2019 J jnl
IEEE Trans. Commun.
Rana Abbas, Mahyar Shirvanimoghaddam, Yonghui Li, Branka Vucetic
2019 J jnl
IEEE Access
Zeeshan Shafiq, Rana Abbas, Mohammad Haseeb Zafar, Mohammed Basheri
2019 J jnl
IEEE Access
Sina Shaham, Ming Ding, Matthew Kokshoorn, Zihuai Lin, Shuping Dang, Rana Abbas
2019 J jnl
IEEE Commun. Lett.
Rana Abbas, Mahyar Shirvanimoghaddam, Tao Huang, Yonghui Li, Branka Vucetic
2019 conf
VTC Fall
Wen Jun Lim, Mahyar Shirvanimoghaddam, Rana Abbas, Yonghui Li, Branka Vucetic
2019 conf
GLOBECOM Workshops
Rana Abbas, Mahyar Shirvanimoghaddam, Tao Huang, Yonghui Li, Branka Vucetic
2019 J jnl
IEEE Commun. Mag.
Mahyar Shirvanimoghaddam, Mohammad Sadegh Mohammadi, Rana Abbas, Aleksandar Minja, Chentao Yue, Balázs Matuz, Guojun Han, Zihuai Lin, Wanchun Liu, Yonghui Li, Sarah Johnson, Branka Vucetic
2018 B conf
GLOBECOM
Rana Abbas, Mahyar Shirvanimoghaddam, Yonghui Li, Branka Vucetic
2018
Rana Abbas
2018 J jnl
CoRR
Mahyar Shirvanimoghaddam, Mohammad Sadegh Mohammadi, Rana Abbas, Aleksandar Minja, Balázs Matuz, Guojun Han, Zihuai Lin, Yonghui Li, Sarah Johnson, Branka Vucetic
2018 J jnl
IEEE Commun. Mag.
He Chen, Rana Abbas, Peng Cheng, Mahyar Shirvanimoghaddam, Wibowo Hardjawana, Wei Bao, Yonghui Li, Branka Vucetic
2017 J jnl
CoRR
Rana Abbas, Mahyar Shirvanimoghaddam, Yonghui Li, Branka Vucetic
2017 B conf
PIMRC
Rana Abbas, Mahyar Shirvanimoghaddam, Yonghui Li, Branka Vucetic
2017 J jnl
IEEE Trans. Commun.
Rana Abbas, Mahyar Shirvanimoghaddam, Yonghui Li, Branka Vucetic
2017 conf
CSPS
Jian Jiao, Bowen Feng, Rana Abbas, Shaohua Wu, Shushi Gu, Qinyu Zhang
2017 J jnl
CoRR
He Chen, Rana Abbas, Peng Cheng, Mahyar Shirvanimoghaddam, Wibowo Hardjawana, Wei Bao, Yonghui Li, Branka Vucetic
2016 B conf
ISIT
Rana Abbas, Mahyar Shirvanimoghaddam, Yonghui Li, Branka Vucetic
2016 conf
ICC
Rana Abbas, Mahyar Shirvanimoghaddam, Yonghui Li, Branka Vucetic
2016 J jnl
CoRR
Rana Abbas, Mahyar Shirvanimoghaddam, Yonghui Li, Branka Vucetic
2015 J jnl
Comput. Hum. Behav.
Rana Abbas, Gustavo S. Mesch
2015 conf
CrownCom
Rana Abbas, Mahyar Shirvanimoghaddam, Yonghui Li, Branka Vucetic
2015 B conf
GLOBECOM
Rana Abbas, Mahyar Shirvanimoghaddam, Yonghui Li, Branka Vucetic
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)