Manan Shah

50 papers A* 2A 2C 1Misc 2Journal 37Unranked 6
YearRankTypeTitle / Venue / Authors
2025 J jnl
CoRR
W. Russell Neuman, Chad Coleman, Ali Dasdan, Safinah Ali, Manan Shah, Kund Meghani
2025 J jnl
Virtual Real. Intell. Hardw.
Harsh Shah, Karan Shah, Kushagra Darji, Adit Shah, Manan Shah
2025 J jnl
CoRR
W. Russell Neuman, Chad Coleman, Manan Shah
2025 J jnl
CoRR
W. Russell Neuman, Chad Coleman, Ali Dasdan, Safinah Ali, Manan Shah
2025 A* conf
ICLR
Yiwen Yuan, Zecheng Zhang, Xinwei He, Akihiro Nitta, Weihua Hu, Manan Shah, Blaz Stojanovic, Shenyang Huang, Jan Eric Lenssen, Jure Leskovec, Matthias Fey
2025 J jnl
Multim. Tools Appl.
Kanish Shah, Rajat Sushra, Manan Shah, Dhairya Shah, Haard Shah, Megh Raval, Mitul Prajapati
2025 conf
CAI
W. Russell Neuman, Chad Coleman, Manan Shah, Ali Dasdan
2025 J jnl
Int. J. Intell. Inf. Technol.
Vaishali Kulkarni, Khushal Hemant Sharma, Manan Shah, Aniruddh Vinay Kulkarni
2025 A* conf
CVPR
Ankit Dhiman, Manan Shah, R. Venkatesh Babu
2025 J jnl
CoRR
Ankit Dhiman, Manan Shah, R. Venkatesh Babu
2025 conf
PReMI (2)
Tejas Sarnaik, Manan Shah, Ravi S. Hegde
2025 J jnl
CoRR
Tejas Sarnaik, Manan Shah, Ravi Hegde
2025 J jnl
CoRR
Matthias Fey, Jinu Sunil, Akihiro Nitta, Rishi Puri, Manan Shah, Blaz Stojanovic, Ramona Bendias, Alexandria Barghi, Vid Kocijan, Zecheng Zhang, Xinwei He, Jan Eric Lenssen, Jure Leskovec
2025 conf
3DV
Ankit Dhiman, Manan Shah, Rishubh Parihar, Yash Bhalgat, Lokesh R. Boregowda, R. Venkatesh Babu
2025 J jnl
CoRR
Chad Coleman, W. Russell Neuman, Ali Dasdan, Safinah Ali, Manan Shah
2024 J jnl
Int. J. Syst. Assur. Eng. Manag.
Pratham Shah, Kush Desai, Mrudani Hada, Parth Parikh, Malav Champaneria, Dhyani Panchal, Mansi Tanna, Manan Shah
2024 J jnl
Multim. Tools Appl.
Jay Patel, Dev Tailor, Kevin Panchal, Samir Patel, Rajeev Gupta, Manan Shah
2024 Misc conf
ICNC
Vanlin Sathya, Aasawaree Deshmukh, Manan Shah, Mehmet Yavuz
2024 J jnl
CoRR
Yiwen Yuan, Zecheng Zhang, Xinwei He, Akihiro Nitta, Weihua Hu, Dong Wang, Manan Shah, Shenyang Huang, Blaz Stojanovic, Alan Krumholz, Jan Eric Lenssen, Jure Leskovec, Matthias Fey
2024 J jnl
CoRR
Ankit Dhiman, Manan Shah, Rishubh Parihar, Yash Bhalgat, Lokesh R. Boregowda, R. Venkatesh Babu
2024 J jnl
CoRR
Manan Shah, Yash Bhalgat
2023 J jnl
Expert Syst. Appl.
Henil Gajjar, Stavan Sanyal, Manan Shah
2023 J jnl
CoRR
Arshad Kaji, Manan Shah
2023 conf
ICCCNT
Vedanth Raja, Bhavya Shah, Naitik Jain, Samveg Shah, Manan Shah, Anand Godbole
2023 J jnl
Int. J. Syst. Assur. Eng. Manag.
Dhruhi Sheth, Manan Shah
2022 J jnl
Intell. Syst. Appl.
Jaimin Shah, Darsh Vaidya, Manan Shah
2022 J jnl
Multim. Tools Appl.
Atharva Shah, Maharshi Gor, Meet Sagar, Manan Shah
2022 J jnl
CoRR
Aman Desai, Shyamal Gandhi, Sachin Gupta, Manan Shah, Samir Patel
2022 J jnl
Iran J. Comput. Sci.
Tulasi Sushra, Nitya Iyengar, Manan Shah, Ameya Kshirsagar
2022 J jnl
Intell. Syst. Appl.
Mayank Thacker, Lay Shah, Manan Shah
2022 J jnl
Complex Intell. Syst.
Binny Naik, Ashir Mehta, Hiteshri Yagnik, Manan Shah
2021 J jnl
Multim. Tools Appl.
Urvish Thakker, Ruhi Patel, Manan Shah
2021 J jnl
Vis. Comput. Ind. Biomed. Art
Toshita Sharma, Manan Shah
2021 J jnl
AI Open
Apurwa Yadav, Aarshil Patel, Manan Shah
2021 J jnl
CoRR
Aakash Shah, Manan Shah
2021 J jnl
Vis. Comput. Ind. Biomed. Art
Neil Shah, Nandish Bhagat, Manan Shah
2021 J jnl
SN Comput. Sci.
Harsh Patel, Manan Shah
2021 J jnl
Vis. Comput. Ind. Biomed. Art
Dhruvil Shah, Devarsh Patel, Jainish Adesara, Pruthvi Hingu, Manan Shah
2021 J jnl
Appl. Clin. Inform.
Manan Shah, Derek Shu, V. B. Surya Prasath, Yizhao Ni, Andrew Schapiro, Kevin R. Dufendach
2020 J jnl
Vis. Comput. Ind. Biomed. Art
Binny Naik, Ashir Mehta, Manan Shah
2020 Misc conf
AMIA
Manan Shah, Derek Shu, V. B. Surya Prasath, Yizhao Ni, Andrew Schapiro, Kevin R. Dufendach
2020 J jnl
CoRR
Sashikumaar Ganesan, Manan Shah
2020 J jnl
Vis. Comput. Ind. Biomed. Art
Pranav Parekh, Shireen Patel, Nivedita Patel, Manan Shah
2019 A conf
CIKM
Manan Shah, Krishnamurthy Viswanathan, Chun-Ta Lu, Ariel Fuxman, Zhen Li, Aleksei Timofeev, Chao Jia, Chen Sun
2016 conf
BigMine
Manan Shah
2015 C conf
ACC
Daichi Fujioka, Manan Shah, William Singhose
2015 A conf
IROS
Zhenishbek Zhakypov, Mohsen Falahi, Manan Shah, Jamie Paik
2014 conf
T4E
Pratik Thanawala, Jyoti Pareek, Manan Shah
2010 J jnl
Monte Carlo Methods Appl.
Manan Shah
2007 J jnl
Math. Comput. Model.
Yevgeny Goncharov, Giray Ökten, Manan Shah
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)