Kai Meng

41 papers A* 1C 1Journal 31Unranked 8
YearRankTypeTitle / Venue / Authors
2026 A* conf
WWW
Huabin Chen, Xinao Wang, Huiping Chu, Keqin Xu, Chenhao Zhai, Chenyi Wang, Kai Meng, Yuning Jiang
2026 J jnl
CoRR
Huabin Chen, Xinao Wang, Huiping Chu, Keqin Xu, Chenhao Zhai, Chenyi Wang, Kai Meng, Yuning Jiang
2026 J jnl
Expert Syst. Appl.
Kai Meng, Ziyu Liu, Junlong Qu, Shaolong Wang, Yu Liang, Jiaqiang Li, Yingpeng Xie, Xinyu Zhao, Lei Dong, Guoming Zhang, Baiying Lei
2025 J jnl
IEEE Trans. Ind. Electron.
Jinsong Zhao, Yunpeng Zhang, Huidong Hou, Yuwei Yue, Kai Meng, Zitao Yang
2025 J jnl
Algorithms
Dawei Xia, Guizhou Cao, Jiayao Pan, Xinghai Wang, Kai Meng, Yuan-Cheng Sun, Zhenlong Wu
2025 J jnl
IEEE Trans. Intell. Veh.
Kai Meng, Chen Chen, Tongyu Wu, Bin Xin, Minmin Liang, Fang Deng
2025 J jnl
J. Informetrics
Kai Meng, Chungwon Koh, Zhejun Zheng, Zhichao Ba, Min Song
2025 J jnl
J. Inf. Sci.
Wenjun Zhao, Kai Meng, Li Sun, Jinhui Ma, Zeguang Jia
2025 J jnl
Swarm Evol. Comput.
Kai Meng, Binghong Wu, Bin Xin, Fang Deng, Chen Chen
2025 J jnl
Comput. Ind. Eng.
Kai Meng, Shujuan Li, Zhoupeng Han
2025 J jnl
IEEE Wirel. Commun. Lett.
Bohao Feng, Xiaoyi Wang, Kai Meng, Shibo Sun, Hongke Zhang
2025 J jnl
Adv. Eng. Informatics
Leisheng Chen, Kai Meng, Hangying Zhang, Junquan Zhou, Peihuang Lou
2025 J jnl
CoRR
Kaixiang Shu, Kai Meng, Junqin Luo
2025 J jnl
J. Informetrics
Kai Meng, Zhichao Ba, Chunying Wang, Gang Li
2024 J jnl
Remote. Sens.
Yongcheng Jiang, Tianliang Zhao, Kai Meng, Xugeng Cheng, Qiaoyi Lv
2024 conf
iConference (3)
Kai Meng, Zhichao Ba, Leilei Liu
2024 J jnl
J. Assoc. Inf. Sci. Technol.
Kai Meng, Zhichao Ba, Yaxue Ma, Gang Li
2023 J jnl
IEEE Access
Yufang Lu, Jiecheng Ai, Luyang Wei, Kai Meng, Chengfu Han
2023 conf
ICMLCA
Yanfeng Wang, Xianghua Zhu, Gang Li, Zixia Feng, Haiyu Yu, Kai Meng
2023 J jnl
Swarm Evol. Comput.
Kai Meng, Qiuhua Tang, Zikai Zhang, Zixiang Li
2023 J jnl
IEEE Access
Kai Meng, Hui Sun, Jiangtao Qi, Hongbo Wang
2023 J jnl
IEEE Access
Mingyang Li, Kai Meng, Jielu Chen, Hongbo Wang
2023 J jnl
J. Inf. Process. Syst.
Huishuang Shao, Yurong Xia, Kai Meng, Changhao Piao
2022 J jnl
Swarm Evol. Comput.
Qiuhua Tang, Kai Meng, Lixin Cheng, Zikai Zhang
2022 J jnl
Frontiers Inf. Technol. Electron. Eng.
Kai Meng, Chen Chen, Bin Xin
2022 J jnl
Appl. Soft Comput.
Kai Meng, Qiuhua Tang, Lixin Cheng, Zikai Zhang
2022 J jnl
Eng. Appl. Artif. Intell.
Kai Meng, Qiuhua Tang, Zikai Zhang
2022 C conf
ISCAS
Bohong Yang, Kai Meng, Hong Lu, Xing Zhu, Jingjing Luo
2021 J jnl
IEEE Trans Autom. Sci. Eng.
Kun Liu, Haowei Yan, Kai Meng, Haiyong Chen, Hasan Sajid
2021 J jnl
Eng. Appl. Artif. Intell.
Kai Meng, Qiuhua Tang, Zikai Zhang, Chunlong Yu
2020 J jnl
IEEE Access
Kai Meng, Qiuhua Tang, Zikai Zhang, Xinbo Qian
2020 conf
MMAsia
Bohong Yang, Kai Meng, Hong Lu, Xinyao Nie, Guanhao Huang, Jingjing Luo, Xing Zhu
2020 J jnl
J. Intell. Manuf.
Kai Meng, Xiaoming Qian, Peihuang Lou, Jiong Zhang
2019 J jnl
Int. J. Prod. Res.
Yiyun Tao, Kai Meng, Peihuang Lou, Xianghui Peng, Xiaoming Qian
2019 conf
ACIRS
Shilin Gao, Kai Meng, Zhan Yang, Huicong Liu, Fengxia Wang, Lining Sun, Tao Chen
2018 conf
ICAC
Kun Liu, Kai Meng, Haiyong Chen, Peng Yang
2018 conf
NEMS
Kai Meng, Shilin Gao, Yunlin Zhang, Lei Yang, Tao Chen, Zhan Yang, Huicong Liu, Lining Sun
2017 J jnl
Int. J. Prod. Res.
Kai Meng, Peihuang Lou, Xianghui Peng, Victor R. Prybutok
2016 J jnl
Comput. Ind. Eng.
Kai Meng, Peihuang Lou, Xianghui Peng, Victor R. Prybutok
2006 conf
ICB
Congcong Li, Guangda Su, Kai Meng, Jun Zhou
2005 conf
CIS (2)
Jun Zhou, Guangda Su, Yafeng Deng, Kai Meng, Congcong Li
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)