Xiaodong Han

56 papers A* 6B 1C 1Journal 31Unranked 17
YearRankTypeTitle / Venue / Authors
2026 J jnl
Pattern Recognit. Lett.
Xiaodong Han, Yibing Zhan, Jun Ni, Baosheng Yu, Dapeng Tao
2025 J jnl
IEEE Trans. Aerosp. Electron. Syst.
Yongchao Hui, Yuehua Cheng, Bin Jiang, Xiaodong Han
2025 J jnl
Int. J. Comput. Vis.
Kangcheng Liu, Chaoqun Wang, Xiaodong Han, Yong-Jin Liu, Baoquan Chen
2025 conf
ICECET
Fuzhong Zhang, Xiaodong Han, Shuaicong Gao, Quanzhu Zhang
2025 J jnl
Int. J. Comput. Vis.
Kangcheng Liu, Chaoqun Wang, Xiaodong Han, Yong-Jin Liu, Baoquan Chen
2024 J jnl
Sensors
Liangliang Cheng, Justin de Groot, Kun Xie, Yanxin Si, Xiaodong Han
2024 J jnl
CoRR
Menglong Yang, Weizheng Li, Wei Li, Binbin Liang, Songchen Han, Xiaodong Han, Yibing Liu, Xiangtong Wang
2024 A* conf
AAAI
Dawei Hao, Yuxin Mao, Bowen He, Xiaodong Han, Yuchao Dai, Yiran Zhong
2024 J jnl
IEEE Trans. Syst. Man Cybern. Syst.
Changhao Sun, Qingrui Zhou, Wei Sun, Xiangyin Zhang, Huaxin Qiu, Xiaodong Han
2024 conf
ACL (Findings)
Dongjie Yang, Xiaodong Han, Yan Gao, Yao Hu, Shilin Zhang, Hai Zhao
2024 J jnl
CoRR
Dongjie Yang, Xiaodong Han, Yan Gao, Yao Hu, Shilin Zhang, Hai Zhao
2024 conf
ICCT
Yuqi Wang, Ningxuan Guo, Ningyuan Wang, Liang Liu, Xiaoqing Zhong, Xiaodong Han
2024 conf
ICC
Xiangtong Wang, Xiaodong Han, Menglong Yang, Songchen Han, Wei Li
2024 J jnl
CoRR
Xiangtong Wang, Xiaodong Han, Menglong Yang, Songchen Han, Wei Li
2024 A* conf
NeurIPS
Dongjie Yang, Suyuan Huang, Chengqiang Lu, Xiaodong Han, Haoxin Zhang, Yan Gao, Yao Hu, Hai Zhao
2024 J jnl
CoRR
Dongjie Yang, Suyuan Huang, Chengqiang Lu, Xiaodong Han, Haoxin Zhang, Yan Gao, Yao Hu, Hai Zhao
2023 C conf
SAFEPROCESS
Xiaodong Han, Yakun Wang, Xiao Zhang, Nan Xu
2023 A* conf
CVPR
Xuyang Shen, Dong Li, Jinxing Zhou, Zhen Qin, Bowen He, Xiaodong Han, Aixuan Li, Yuchao Dai, Lingpeng Kong, Meng Wang, Yu Qiao, Yiran Zhong
2023 J jnl
CoRR
Xuyang Shen, Dong Li, Jinxing Zhou, Zhen Qin, Bowen He, Xiaodong Han, Aixuan Li, Yuchao Dai, Lingpeng Kong, Meng Wang, Yu Qiao, Yiran Zhong
2023 B conf
SMC
Xiaodong Han, Fei Cai, Guanghui Xiu, Dapeng Tao
2023 J jnl
CoRR
Dawei Hao, Yuxin Mao, Bowen He, Xiaodong Han, Yuchao Dai, Yiran Zhong
2023 J jnl
CoRR
Xiangtong Wang, Xiaodong Han, Menglong Yang, Chuan Xing, Yuqi Wang, Songchen Han, Wei Li
2023 J jnl
CoRR
Zhen Qin, Weixuan Sun, Kaiyue Lu, Hui Deng, Dongxu Li, Xiaodong Han, Yuchao Dai, Lingpeng Kong, Yiran Zhong
2023 J jnl
Trans. Mach. Learn. Res.
Zhen Qin, Weixuan Sun, Kaiyue Lu, Hui Deng, Dongxu Li, Xiaodong Han, Yuchao Dai, Lingpeng Kong, Yiran Zhong
2023 J jnl
CoRR
Zhen Qin, Dong Li, Weigao Sun, Weixuan Sun, Xuyang Shen, Xiaodong Han, Yunshen Wei, Baohong Lv, Fei Yuan, Xiao Luo, Yu Qiao, Yiran Zhong
2023 A* conf
ICLR
Zhen Qin, Xiaodong Han, Weixuan Sun, Bowen He, Dong Li, Dongxu Li, Yuchao Dai, Lingpeng Kong, Yiran Zhong
2023 J jnl
CoRR
Zhen Qin, Xiaodong Han, Weixuan Sun, Bowen He, Dong Li, Dongxu Li, Yuchao Dai, Lingpeng Kong, Yiran Zhong
2022 J jnl
IEEE Trans. Veh. Technol.
Jiancun Fan, Peizhe Liang, Zihan Jiao, Xiaodong Han
2022 conf
VTC Spring
Xiaodong Han, Zihan Jiao, Peizhe Liang, Jiancun Fan
2022 conf
ICCCS
Yuqi Wang, Jingheng Zhou, Nan Wu, Huan Liu, Xiaoqing Zhong, Xiaodong Han
2022 J jnl
Int. J. Syst. Sci.
Jianye Gong, Bin Jiang, Yajie Ma, Xiaodong Han, Jianglei Gong
2022 conf
ICCT
Yuqi Wang, Kang Guo, Ningyuan Wang, Zhaotao Qin, Xiaoqing Zhong, Xiaodong Han
2022 J jnl
CoRR
Kaiyue Lu, Zexiang Liu, Jianyuan Wang, Weixuan Sun, Zhen Qin, Dong Li, Xuyang Shen, Hui Deng, Xiaodong Han, Yuchao Dai, Yiran Zhong
2022 J jnl
IEEE Access
Yuqi Wang, Jibin Che, Ningyuan Wang, Liang Liu, Nan Wu, Xiaoqing Zhong, Xiaodong Han
2022 A* conf
EMNLP
Zhen Qin, Xiaodong Han, Weixuan Sun, Dongxu Li, Lingpeng Kong, Nick Barnes, Yiran Zhong
2022 J jnl
CoRR
Zhen Qin, Xiaodong Han, Weixuan Sun, Dongxu Li, Lingpeng Kong, Nick Barnes, Yiran Zhong
2021 conf
ICCCS
Yuqi Wang, Haiqiang Wang, Dan Liu, Xu Zhang, Xiaoqing Zhong, Xiaodong Han
2021 J jnl
J. Comput. Sci.
Yakun Wang, Xiaodong Han
2021 J jnl
Remote. Sens.
Cheng Li, Baolong Guo, Nannan Liao, Jianglei Gong, Xiaodong Han, Shuwei Hou, Zhijie Chen, Wangpeng He
2021 conf
ICCT
Yuan Lv, Yuqi Wang, Xu Zhang, Dan Liu, Haiqiang Wang, Xiaoqing Zhong, Xiaodong Han
2021 J jnl
IET Signal Process.
Wei Gao, Xiaoming Li, Zheng Liu, Ziqiang Meng, Xiaodong Han, Lei Ran
2021 conf
CAA SAFEPROCESS
Dengfeng Zhang, Weichen Li, Xiaodong Han, Cuimei Bo, Quanling Zhang, Lei Qiao
2020 J jnl
Symmetry
Cheng Li, Baolong Guo, Zhe Huang, Jianglei Gong, Xiaodong Han, Wangpeng He
2020 J jnl
Circuits Syst. Signal Process.
Xiaodong Han, Ting Shu, Jin He, Wenxian Yu
2020 J jnl
IEEE Commun. Lett.
Ting Shu, Jin He, Xiaodong Han, Xiaoming Li, Kai-Bor Yu
2019 conf
PRCV (2)
Shipeng Zhu, Guili Xu, Yuehua Cheng, Xiaodong Han, Zhengsheng Wang
2019 conf
ROBIO
Kangcheng Liu, Xiaodong Han, Ben M. Chen
2019 J jnl
J. Electronic Imaging
Yuehua Cheng, Zhengbing Wang, Guili Xu, Xiaodong Han, Zhengsheng Wang
2019 J jnl
计算机科学
Xiaohu Lv, Xiaodong Han, Jianglei Gong, Zhijie Wang, Xiaokun Liu
2018 J jnl
IEEE Access
Xiaodong Han, Ting Shu, Jin He, Wenxian Yu
2015 A* conf
ICRA
Dong Liu, Ming Cong, Yu Du, Xiaodong Han
2012 conf
BHI
Wei Tan, Gang Cheng, Jing Ye, Xiaodong Han
2010 conf
BIC-TA
Hongyuan Gao, Xiaodong Han
2008 conf
ICNSC
He Huang, Xiaodong Han, Xiaopeng Ji, Zhiquan Wang
2008 conf
ICNSC
Xiaodong Han, He Huang, Xiaopeng Ji, Zhiquan Wang
2008 conf
ICNSC
Xiaopeng Ji, Long Ge, Xiaodong Han, Zhiquan Wang
redb/extractors/js_extractors/js_xray.py
← Index redb/extractors/js_extractors/js_xray.py python
"""Subprocess wrapper for the bundled js-x-ray Node bridge.

Mirrors `js_deobfuscator.py`: shell out to a Node script with a per-sample
timeout, kill the process group on hang, demote `FileNotFoundError` to debug
(missing tool is routine — the host either has Node + the bundled package
installed or it doesn't), and return a structured result on success.

The bridge lives at `redb/extractors/js_extractors/scripts/js-xray-runner.js`.
Operators install the JS dependency once with `npm install` in that directory
(or override the path with `JS_XRAY_RUNNER_PATH`).

Configuration (env vars):
    JS_XRAY_RUNNER_PATH   Path to the Node bridge script (default: bundled).
    JS_XRAY_TIMEOUT       Seconds before the subprocess is killed. Default: 30.

`run(source, log)` returns `XRayResult(obfuscator, warnings)` on a successful
analysis, or `XRayResult(None, [])` for any non-success path (binary missing,
timeout, parse failure, etc.). The two unsuccessful states are
indistinguishable to the caller on purpose — they all collapse to "no
js-x-ray verdict, fall back to heuristic".
"""

from __future__ import annotations

import json
import os
import signal
import subprocess
import tempfile
from dataclasses import dataclass, field
from typing import List, Optional

# Bundled bridge: redb/extractors/js_extractors/scripts/js-xray-runner.js
_DEFAULT_RUNNER = os.path.join(
    os.path.dirname(__file__), "scripts", "js-xray-runner.js"
)
_DEFAULT_NODE = "node"
_DEFAULT_TIMEOUT_SECS = 30


@dataclass
class XRayResult:
    """Parsed js-x-ray output. `obfuscator` is the recognised family name
    (e.g. "jsfuck", "obfuscator.io") or None when js-x-ray did not flag the
    code. `warnings` carries every {kind, value} pair the analyser produced;
    the heuristic uses it as a corroborating signal. `avg_identifier_length`
    is js-x-ray's own AST-derived figure — used as a fallback for the
    heuristic's `avg_identifier_length<2` strong signal when pyjsparser
    can't parse the source (anything ES2015+ trips it)."""

    obfuscator: Optional[str] = None
    warnings: List[dict] = field(default_factory=list)
    avg_identifier_length: Optional[float] = None

    @property
    def flagged(self) -> bool:
        return self.obfuscator is not None


def _empty() -> XRayResult:
    return XRayResult(obfuscator=None, warnings=[])


def run(source: str, log) -> XRayResult:
    if not source:
        return _empty()

    runner = os.getenv("JS_XRAY_RUNNER_PATH", _DEFAULT_RUNNER)
    node_bin = os.getenv("JS_XRAY_NODE_BIN", _DEFAULT_NODE)
    timeout = int(os.getenv("JS_XRAY_TIMEOUT", str(_DEFAULT_TIMEOUT_SECS)))

    if not os.path.exists(runner):
        log.debug(f"js-x-ray runner not found at {runner}")
        return _empty()

    # Skip the subprocess entirely when the JS dependency isn't installed.
    # Without this, every call to a host that has `node` but never ran
    # `npm install` next to the runner would still fork node, get a require
    # error, and exit nonzero — wasted ~50–200ms per JS sample (and per test).
    runner_dir = os.path.dirname(runner)
    if not os.path.isdir(os.path.join(runner_dir, "node_modules", "@nodesecure", "js-x-ray")):
        log.debug(f"@nodesecure/js-x-ray not installed in {runner_dir}")
        return _empty()

    tmp_path = None
    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(
                [node_bin, runner, tmp_path],
                stdout=subprocess.PIPE,
                stderr=subprocess.PIPE,
                preexec_fn=os.setsid,
            )
            try:
                stdout, stderr = process.communicate(timeout=timeout)
            except subprocess.TimeoutExpired:
                # Kill the whole process group so any node helpers die 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"js-x-ray timed out after {timeout}s")
                return _empty()

            if process.returncode != 0:
                err = stderr.decode("utf-8", errors="replace").strip()
                log.debug(f"js-x-ray exited {process.returncode}: {err}")
                return _empty()

            text = stdout.decode("utf-8", errors="replace").strip()
            if not text:
                return _empty()

            try:
                payload = json.loads(text)
            except json.JSONDecodeError as e:
                log.warning(f"js-x-ray emitted non-JSON output: {e}")
                return _empty()

            obfuscator = payload.get("obfuscator")
            warnings = payload.get("warnings") or []
            if not isinstance(warnings, list):
                warnings = []

            ids_avg = payload.get("idsLengthAvg")
            if not isinstance(ids_avg, (int, float)):
                ids_avg = None

            return XRayResult(
                obfuscator=obfuscator,
                warnings=warnings,
                avg_identifier_length=ids_avg,
            )
        finally:
            if tmp_path:
                try:
                    os.unlink(tmp_path)
                except Exception:
                    pass
    except FileNotFoundError:
        log.debug(f"node binary not found at {node_bin}")
        return _empty()
    except Exception as e:
        log.error(f"js-x-ray subprocess error: {e}")
        return _empty()