Kai Sun

35 papers C 6Journal 25Unranked 4
YearRankTypeTitle / Venue / Authors
2026 J jnl
IEEE Trans. Ind. Electron.
Zexiong Wei, Yao Sun, Xiaochao Hou, Mei Su, Kai Sun
2025 J jnl
IEEE Trans. Ind. Electron.
Peng Ren, Qi Guo, Yuchao Hou, Chunming Tu, Donghai Zhu, Kai Sun
2025 J jnl
IEEE Trans. Ind. Electron.
Zejun Huang, Qi Guo, Chunming Tu, Kai Sun, Lei Wang, Fei Jiang, Yuchao Hou
2024 J jnl
IEEE Trans. Instrum. Meas.
Bo Liu, Lei Chen, Kai Sun, Xiaoyu Wang, Jian Zhao
2023 J jnl
IEEE Access
Shilei Lu, Kai Sun, Zhiqiang Guo
2022 J jnl
IEEE Trans. Ind. Electron.
Dehong Zhou, Jiangfeng Wang, Yunwei Li, Jianxiao Zou, Kai Sun
2022 J jnl
IEEE Trans. Ind. Electron.
Jiangfeng Wang, Kai Sun, Cheng Xue, Tingting Liu, Yunwei Li
2021 J jnl
IEEE Trans. Ind. Electron.
Jiangfeng Wang, Kai Sun, Hongfei Wu, Jianxin Zhu, Yan Xing, Yunwei Li
2021 J jnl
IEEE Trans. Smart Grid
Xubin Liu, Xinyu Chen, Canbing Li, Mohammad Shahidehpour, Kai Sun, Yijia Cao, Chen Chen, Bin Zhou
2020 J jnl
IEEE Trans. Smart Grid
Xubin Liu, Canbing Li, Mohammad Shahidehpour, Xinyu Chen, Jun Yi, Qiuwei Wu, Kai Sun, Bin Zhou
2020 J jnl
IEEE Trans. Ind. Electron.
Chao Wang, Kui Wang, Zedong Zheng, Kai Sun, Yongdong Li
2020 J jnl
IEEE Trans. Ind. Electron.
Tsai-Fu Wu, Chun-Wei Huang, Tzu-Chieh Chou, Kai Sun
2019 C conf
IECON
Hong Li, Yuting Wang, Xingran Zhao, Kai Sun, Zhe Zhou, Yunfei Xu
2019 J jnl
IEEE Trans. Ind. Informatics
Josep M. Guerrero, Yajuan Guan, Juan Carlos Vasquez, Kai Sun
2018 J jnl
IEEE Trans. Smart Grid
Wei Feng, Kai Sun, Yajuan Guan, Josep M. Guerrero, Xi Xiao
2018 J jnl
IEEE Trans. Ind. Electron.
Kai Sun, Zhaoxin Qiu, Hongfei Wu, Yan Xing
2018 J jnl
IEEE Trans. Smart Grid
Farzam Nejabatkhah, Yun Wei Li, Kai Sun
2017 C conf
IECON
Hong Li, Xingran Zhao, Ruixiang Hao, Kai Sun
2017 J jnl
IEEE Trans. Ind. Electron.
Hongfei Wu, Kai Sun, Yuewei Li, Yan Xing
2017 C conf
IECON
Adriana C. Luna, Nelson L. Díaz, Mehdi Savaghebi, Wei Feng, Kai Sun, Juan C. Vasquez, Josep M. Guerrero
2017 J jnl
IEEE Trans. Ind. Electron.
Hong Li, Xingran Zhao, Wenzhe Su, Kai Sun, Xiaojie You, Trillion Q. Zheng
2016 J jnl
IEEE Trans. Ind. Electron.
Hongfei Wu, Kai Sun, Liqun Chen, Lei Zhu, Yan Xing
2015 J jnl
IEEE Trans. Smart Grid
Xiaonan Lu, Kai Sun, Josep M. Guerrero, Juan C. Vasquez, Lipei Huang
2015 J jnl
IEEE Trans. Smart Grid
Xiaonan Lu, Kai Sun, Josep M. Guerrero, Juan C. Vasquez, Lipei Huang, Jianhui Wang
2014 conf
ISIE
Xiaonan Lu, Kai Sun, Josep M. Guerrero, Juan C. Vasquez, Lipei Huang
2014 J jnl
IEEE Trans. Smart Grid
Xiaonan Lu, Josep M. Guerrero, Kai Sun, Juan C. Vasquez, Remus Teodorescu, Lipei Huang
2014 J jnl
IEEE Trans. Ind. Electron.
Xiaonan Lu, Kai Sun, Josep M. Guerrero, Juan C. Vasquez, Lipei Huang
2013 conf
ISIE
Xiaonan Lu, Josep M. Guerrero, Kai Sun
2012 conf
ISIE
Long-xian Ni, Kai Sun, Hongfei Wu, Zhe Chen, Yan Xing
2012 C conf
IECON
Yuchao Shi, Kai Sun, Yan Guo, Xiaohua Jiang, Lipei Huang, Yongdong Li
2012 C conf
IECON
Junjun Zhang, Hongfei Wu, Yan Xing, Yanbing Xia, Kai Sun
2012 J jnl
IEEE Trans. Ind. Electron.
Yuchao Shi, Kai Sun, Lipei Huang, Yongdong Li
2012 conf
ISIE
Xiaonan Lu, Kai Sun, Josep M. Guerrero, Juan C. Vasquez, Lipei Huang, Remus Teodorescu
2012 C conf
IECON
Xiaonan Lu, Kai Sun, Josep M. Guerrero, Lipei Huang
2010 J jnl
IEEE Trans. Ind. Electron.
Kai Sun, Qing Wei, Lipei Huang, Kouki Matsuse
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)