Haichuan Song

34 papers A* 8A 4Misc 2Journal 17Unranked 3
YearRankTypeTitle / Venue / Authors
2026 A* conf
AAAI
Chen Hang, Haoming Chen, Xuwei Fang, Weisheng Xie, Xiangxiang Gao, Faming Fang, Guixu Zhang, Haichuan Song
2026 J jnl
Neural Networks
Wei Zhang, Haichuan Song, Zhizhong Zhang, Xin Tan, Lizhuang Ma, Yuan Xie
2026 J jnl
Comput. Vis. Image Underst.
Xian-Tao Wu, Xiao-Diao Chen, Hongyu Chen, Wen Wu, Weiyin Ma, Haichuan Song
2026 A* conf
AAAI
Ziyi Wang, Shengcheng Ye, Faming Fang, Haichuan Song
2025 A* conf
CVPR
Zaoming Yan, Pengcheng Lei, Tingting Wang, Faming Fang, Junkang Zhang, Yaomin Huang, Haichuan Song
2025 J jnl
IEEE Trans. Multim.
Junkang Zhang, Faming Fang, Tingting Wang, Guixu Zhang, Haichuan Song
2025 A* conf
CVPR
Zhengyuan Peng, Jinpeng Ma, Zhimin Sun, Ran Yi, Haichuan Song, Xin Tan, Lizhuang Ma
2025 J jnl
CoRR
Zhengyuan Peng, Jinpeng Ma, Zhimin Sun, Ran Yi, Haichuan Song, Xin Tan, Lizhuang Ma
2025 J jnl
CoRR
Liang Han, Xu Zhang, Haichuan Song, Kanle Shi, Yu-Shen Liu, Zhizhong Han
2025 J jnl
CoRR
Junsheng Zhou, Xingyu Shi, Haichuan Song, Yi Fang, Yu-Shen Liu, Zhizhong Han
2025 J jnl
Neurocomputing
Feng Huang, Xiao-Diao Chen, Hongyu Chen, Haichuan Song
2025 A* conf
UIST
Yingjing Xiao, Zhichao Huang, Junbin Ren, Yuting Bai, Haichuan Song, Zhanpeng Jin, Yang Gao
2025 J jnl
CoRR
Yingjing Xiao, Zhichao Huang, Junbin Ren, Haichuan Song, Yang Gao, Yuting Bai, Zhanpeng Jin
2024 J jnl
IEEE Trans. Ind. Informatics
Wenya Yang, Xiao-Diao Chen, Wen Wu, Hongshuai Qin, Kangming Yan, Xiaoyang Mao, Haichuan Song
2024 A conf
ICME
Haichuan Song, Zhihong Zheng, Zhizhong Zhang, Yuan Xie, Guchu Zou, Zhenyi Qi, Xin Tan
2023 J jnl
IEEE Trans. Pattern Anal. Mach. Intell.
Xin Tan, Qihang Ma, Jingyu Gong, Jiachen Xu, Zhizhong Zhang, Haichuan Song, Yanyun Qu, Yuan Xie, Lizhuang Ma
2022 conf
ECCV (2)
Jingyu Gong, Fengqi Liu, Jiachen Xu, Min Wang, Xin Tan, Zhizhong Zhang, Ran Yi, Haichuan Song, Yuan Xie, Lizhuang Ma
2022 J jnl
CoRR
Junshu Tang, Jiachen Xu, Jingyu Gong, Haichuan Song, Yuan Xie, Lizhuang Ma
2022 A* conf
AAAI
Wang Yuan, Zhizhong Zhang, Cong Wang, Haichuan Song, Yuan Xie, Lizhuang Ma
2021 A conf
ICME
Wang Yuan, TianXue Ma, Haichuan Song, Yuan Xie, Zhizhong Zhang, Lizhuang Ma
2021 A conf
ICME
Chengwei Chen, Zhizhong Zhang, Yuan Xie, Haichuan Song, Lizhuang Ma
2021 A* conf
CVPR
Jingyu Gong, Jiachen Xu, Xin Tan, Haichuan Song, Yanyun Qu, Yuan Xie, Lizhuang Ma
2021 J jnl
CoRR
Jingyu Gong, Jiachen Xu, Xin Tan, Haichuan Song, Yanyun Qu, Yuan Xie, Lizhuang Ma
2020 J jnl
CoRR
Chengwei Chen, Pan Chen, Lingyu Yang, Jinyuan Mo, Haichuan Song, Yuan Xie, Lizhuang Ma
2020 J jnl
CoRR
Chengwei Chen, Pan Chen, Haichuan Song, Yiqing Tao, Yuan Xie, Shouhong Ding, Lizhuang Ma
2020 J jnl
CoRR
Ke-Yue Zhang, Taiping Yao, Jian Zhang, Ying Tai, Shouhong Ding, Jilin Li, Feiyue Huang, Haichuan Song, Lizhuang Ma
2020 conf
ECCV (19)
Ke-Yue Zhang, Taiping Yao, Jian Zhang, Ying Tai, Shouhong Ding, Jilin Li, Feiyue Huang, Haichuan Song, Lizhuang Ma
2020 A* conf
IJCAI
Chengwei Chen, Jing Liu, Yuan Xie, Yin Xiao Ban, Chunyun Wu, Yiqing Tao, Haichuan Song
2020 J jnl
CoRR
Chengwei Chen, Wang Yuan, Yuan Xie, Yanyun Qu, Yiqing Tao, Haichuan Song, Lizhuang Ma
2020 A conf
ICME
Xinchao Zeng, Chengwei Chen, Chunyun Wu, Haichuan Song, Lizhuang Ma
2020 Misc conf
ICASSP
Jing Liu, Yuan Xie, Haichuan Song, Wang Yuan, Lizhuang Ma
2019 J jnl
ACM Trans. Graph.
Haichuan Song, Jonàs Martínez, Pierre Bedell, Noémie Vennin, Sylvain Lefebvre
2019 Misc conf
ICASSP
Zukai Chen, Xin Tan, Hengliang Zhu, Shouhong Ding, Lizhuang Ma, Haichuan Song
2019 conf
ICANN (3)
Wang Yuan, Haichuan Song, Xin Tan, Chengwei Chen, Shouhong Ding, Lizhuang Ma
redb/extractors/js_extractors/scripts/js-xray-runner.js
← Index redb/extractors/js_extractors/scripts/js-xray-runner.js javascript
#!/usr/bin/env node
// Bridge between the Python JS pipeline and @nodesecure/js-x-ray.
//
// Usage: node js-xray-runner.js <path-to-js-file>
//   stdout  one JSON object: {"obfuscator": <name|null>, "warnings": [...]}
//   stderr  human-readable error on failure
//   exit 0  analysis ran (the file may still be benign — see "obfuscator")
//   exit 1  the file could not be read or analysed
//
// Each warning is emitted as {kind, value} so the Python side can tag
// supporting signals (encoded-literal, short-identifiers, suspicious-literal,
// unsafe-stmt) without having to mirror js-x-ray's whole schema.
//
// js-x-ray ≥7 ships as an ES module, which CommonJS `require()` cannot load
// from a `.js` script — the dynamic `import()` below is what makes the
// bridge work without renaming the file to `.mjs` or adding `"type":
// "module"` to package.json (which would break tools that still
// `require()` from this directory).

const fs = require("fs");
const path = require("path");

function fail(msg) {
  process.stderr.write(msg + "\n");
  process.exit(1);
}

async function main() {
  const target = process.argv[2];
  if (!target) fail("usage: js-xray-runner.js <file>");

  let source;
  try {
    source = fs.readFileSync(target, "utf8");
  } catch (e) {
    fail(`read failed: ${e.message}`);
  }

  // The legacy `runASTAnalysis` function is deprecated (removed in v8); the
  // current API is the `AstAnalyser` class. Both produce a result with the
  // same `warnings` shape, so the rest of the bridge is unchanged.
  let AstAnalyser;
  try {
    ({ AstAnalyser } = await import("@nodesecure/js-x-ray"));
  } catch (e) {
    fail(`@nodesecure/js-x-ray not installed (run \`npm install\` in ${path.dirname(__filename)}): ${e.message}`);
  }

  // js-x-ray defaults to module-mode parsing, which rejects scripts that
  // (legally) use reserved words as identifiers, top-level `return`, etc.
  // A lot of real-world JS malware is script-style (WScript/HTA bodies,
  // pasted snippets) — retrying in script mode catches those without
  // pulling in a more lenient parser. Both attempts share the same
  // analyser; only the parse mode flips. If both fail, the original error
  // (module-mode) is reported because that's the more informative one for
  // genuinely broken sources.
  let result;
  const analyser = new AstAnalyser();
  let firstErr;
  try {
    result = await analyser.analyse(source, { module: true });
  } catch (e) {
    firstErr = e;
    try {
      result = await analyser.analyse(source, { module: false });
    } catch (e2) {
      fail(`js-x-ray analysis failed: ${firstErr.message}`);
    }
  }

  const warnings = (result.warnings || []).map((w) => ({
    kind: w.kind,
    value: w.value !== undefined ? w.value : null,
  }));

  // js-x-ray flags the obfuscator family in a warning whose kind is
  // "obfuscated-code" and whose value names the family (jsfuck, obfuscator.io,
  // freejsobfuscator, morse, jjencode, ...). Absent => not detected.
  const obfWarning = warnings.find((w) => w.kind === "obfuscated-code");
  const obfuscator = obfWarning ? obfWarning.value : null;

  // js-x-ray runs its own AST internally with a modern parser, so its
  // identifier-length average is the only path the Python pipeline has to
  // that signal on ES2015+ sources — pyjsparser is ES5.1-only and silently
  // drops to 0 the moment it hits destructuring, classes, optional chaining,
  // etc. Surfacing this lets the heuristic's `avg_identifier_length<2`
  // strong signal fire on real obfuscator.io output. `null` when the value
  // is missing or non-numeric (defensive — older js-x-ray builds may differ).
  const idsLengthAvg =
    typeof result.idsLengthAvg === "number" && !Number.isNaN(result.idsLengthAvg)
      ? result.idsLengthAvg
      : null;

  process.stdout.write(JSON.stringify({ obfuscator, warnings, idsLengthAvg }));
}

main().catch((e) => fail(e.message || String(e)));