Kai Chang

34 papers Journal 24Unranked 10
YearRankTypeTitle / Venue / Authors
2026 J jnl
CoRR
Di Wang, Zhenhua Wu, Yu Liu, Kai Chang, Shaohua Wu
2026 J jnl
CoRR
Rui Hua, Yu Wei, Zixin Shu, Kai Chang, Dengying Yan, Jianan Xia, Zeyu Liu, Hui Zhu, Shujie Song, Mingzhong Xiao, Xiaodong Li, Dongmei Jia, Zhuye Gao, Yanyan Meng, Naixuan Zhao, Yu Fu, Haibin Yu, Benman Yu, Yuanyuan Chen, Fei Dong, Zhizhou Meng, Pengcheng Yang, Songxue Zhao, Lijuan Pei, Yunhui Hu, Kan Ding, Jiayuan Duan, Wenmao Yin, Yang Gu, Runshun Zhang, Qiang Zhu, Jian Yu, Jiansheng Li, Baoyan Liu, Wenjia Wang, Xuezhong Zhou
2026 J jnl
IEEE Wirel. Commun. Lett.
Kai Chang, Jianxiu Wang, Bingkun Liu, Linling Kuang
2025 J jnl
IEEE Trans. Commun.
Bingkun Liu, Linling Kuang, Kai Chang, Jianhua Lu
2025 J jnl
Neurocomputing
Wenqian Chen, Wendie Yue, Kai Chang, Hongzhi Wang, Kaijun Tan, Xinyu Liu, Xiaoyi Cao
2025 J jnl
CoRR
Kai Chang, Themistoklis P. Sapsis
2024 J jnl
Int. J. Prod. Res.
Chia-Yen Lee, Kai Chang, Chien Ho
2024 J jnl
Int. J. Medical Informatics
Qiguang Zheng, Qifan Shen, Zixin Shu, Kai Chang, Kunyu Zhong, Yuhang Yan, Jia Ke, Jingjing Huang, Rui Su, Jianan Xia, Xuezhong Zhou
2024 J jnl
J. Am. Medical Informatics Assoc.
Rui Hua, Xin Dong, Yu Wei, Zixin Shu, Pengcheng Yang, Yunhui Hu, Shuiping Zhou, He Sun, Kaijing Yan, Xijun Yan, Kai Chang, Xiaodong Li, Yuning Bai, Runshun Zhang, Wenjia Wang, Xuezhong Zhou
2024 J jnl
SIAM J. Sci. Comput.
Ru Huang, Kai Chang, Huan He, Ruipeng Li, Yuanzhe Xi
2024 J jnl
Mach. Learn. Sci. Technol.
Jian-Gang Kong, Ke-Lin Zhao, Jian Li, Qing-Xu Li, Yu Liu, Rui Zhang, Jia-Ji Zhu, Kai Chang
2024 J jnl
Expert Syst. Appl.
Kai Chang, Mengfei Yang, Shengqi Zhou, Guangxi Wei
2023 J jnl
Remote. Sens.
Hua Zhang, Yiheng Liu, Qinghai Dong, Ning Liu, Kai Chang, Xuemei Wang, Xiaode Lyu
2023 conf
BIBM
Ning Xu, Kunyu Zhong, Kai Chang, Lifeng Fa, Jinlong Yu, Haibin Yu, Xuezhong Zhou, Lei Zhang
2023 conf
CACRE
Kai Chang, Bolin Lu, Jian Yin, Guangchao Tan
2023 J jnl
CoRR
Ru Huang, Kai Chang, Huan He, Ruipeng Li, Yuanzhe Xi
2022 J jnl
IEEE Trans. Ind. Electron.
Haoyu Yu, Xiaolong Chen, Mengyuan Ren, Qiang Liu, Kai Yang, Kai Chang, Qian Wu, Jinsong Zhan
2022 J jnl
Soft Comput.
Xiaoling Yao, Rongguo Zhang, Jing Hu, Kai Chang, Xiaojun Liu, Jian Zhao
2022 J jnl
IEEE ACM Trans. Comput. Biol. Bioinform.
Kuo Yang, Yi Zheng, Kezhi Lu, Kai Chang, Ning Wang, Zixin Shu, Jian Yu, Baoyan Liu, Zhuye Gao, Xuezhong Zhou
2021 conf
CACRE
Kai Chang, Jie Gao, Bo Liu, Jian Yin, Minghui Yan, Guoyue Zhang
2021 conf
BIBM
Qunsheng Zou, Kuo Yang, Kai Chang, Xiaoping Zhang, Xiaodong Li, Xuezhong Zhou
2021 conf
BIBM
Xin Dong, Yi Zheng, Zixin Shu, Kai Chang, Dengying Yan, Jianan Xia, Qiang Zhu, Kunyu Zhong, Xinyan Wang, Kuo Yang, Xuezhong Zhou
2020 J jnl
J. Biomed. Informatics
Kezhi Lu, Kuo Yang, Edouard Niyongabo, Zixin Shu, Jingjing Wang, Kai Chang, Qunsheng Zou, Jiyue Jiang, Caiyan Jia, Baoyan Liu, Xuezhong Zhou
2020 J jnl
Trans. Inst. Meas. Control
Kai Chang, Dailiang Ma, Xingbin Han, Ning Liu, Pengpeng Zhao
2017 J jnl
Signal Image Video Process.
Rongguo Zhang, Xiaojun Liu, Jing Hu, Kai Chang, Kun Liu
2017 conf
HCI (17)
Chunfa Sha, Rui Li, Kai Chang
2017 conf
ICSAI
Yilun Sun, Qiang Sun, Kai Chang
2016 J jnl
Neurocomputing
Kai Chang, Yuanqing Xia, Kaoli Huang, Dailiang Ma
2015 J jnl
J. Frankl. Inst.
Kai Chang, Yuanqing Xia, Kaoli Huang
2015 conf
RWS
Chan Ho Kim, Kai Chang, Xiaoguang Liu
2014 J jnl
J. Syst. Sci. Complex.
Hao Chang, Kai Chang
2013 J jnl
Proc. IEEE
Bernd Strassner, Kai Chang
2009 conf
Complex (2)
Zengqiang Chen, Linying Xiang, Zhongxin Liu, Zhuzhi Yuan, Kai Chang
2005 conf
ACM Southeast Regional Conference (1)
Daniela Marghitu, Chris Harmon, Kai Chang
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)