JSimplifier 使用与改造:用 DeepSeek 跑 LLM 增强的 JS 反混淆
本文最后更新于:2026年8月14日 下午
本文为工具使用与改造记录,基于官方仓库源码编写
- 项目地址:https://github.com/xingtulab/jsimplifier(GPL-3.0)
- 论文:《From Obfuscated to Obvious: A Comprehensive JavaScript Deobfuscation Tool for Security Analysis》,NDSS 2026
本文介绍 JSimplifier 的基本用法,并重点讲如何把它改造成用国内 DeepSeek 大模型驱动。文中代码与配置均基于官方源码核对,可直接落地。
一、JSimplifier 是什么
一个 JS 反混淆 / 反压缩 / 简化工具,来头不小——它是 NDSS 2026 论文《From Obfuscated to Obvious》的官方开源实现。
它的核心思路是多阶段流水线:
预处理 → AST 静态分析变换 → 动态执行追踪 → LLM 增强的标识符重命名
论文数据:覆盖 20 类混淆技术、代码复杂度降低 88.2%、可读性提升 4 倍以上,在 44,421 个真实样本上评测过。
LLM 在这里干什么? 纯 AST 变换能还原结构、解常量、去死代码,但没法给变量起有意义的名字——混淆后满屏的 a、_0x1f2e 它只能照搬。JSimplifier 把每个变量连同上下文发给大模型,让它推断用途、起一个描述性的新名字(比如 a → userToken)。这是它比传统 AST 反混淆工具更进一步的地方。
二、基本使用
环境与安装
- Node.js ≥ 20
- Python 3.11(仅评测实验用,日常反混淆不需要)
1 | |
三种运行模式
1 | |
注意:命令要用
npm start deobfuscate --,参数前的双横线--不能少。
输出保存在 output/deobfuscated_{文件名}/deobfuscated.js。
常用参数:
--model:模型(none表示纯 AST,默认)--apiKey:API 密钥--baseURL:API 服务器地址(改造国内模型的关键)--batch:批量处理目录下所有 JS--outputDir:输出目录--verbose:详细输出
它还提供 Web UI:
1 | |
三、为什么它对国内大模型很友好
看源码会发现,改造成国内模型几乎不用动代码,原因有三:
- 用的是官方
openainpm SDK,new OpenAI({ apiKey, baseURL }),baseURL 可自定义。 - 默认 baseURL 本来就是国内中转——
src/commands/openai.ts里默认值是https://api.zhizengzeng.com/v1(智增增),说明作者本就考虑了国内访问。 - 支持
--baseURL参数和BASE_URL环境变量覆盖。
而 DeepSeek 提供兼容 OpenAI 格式的接口。所以理论上,只改 baseURL + model + apiKey 三个值就能用 DeepSeek。
四、用 DeepSeek 改造(分两步)
第 1 步:配置 DeepSeek
DeepSeek 的 OpenAI 兼容参数:
| 项 | 值 |
|---|---|
| baseURL | https://api.deepseek.com/v1 |
| model | deepseek-chat |
| apiKey | 你在 DeepSeek 平台申请的 sk-... |
方式 A:命令行直接传
1 | |
方式 B:写进 .env(推荐)
项目用了 dotenv(见 src/env.ts),在项目根目录建 .env:
1 | |
然后就不用每次敲密钥了:
1 | |
第 2 步:⚠️ 关键坑 —— 修改 response_format
这一步决定改造能不能成功,务必注意。
JSimplifier 给模型发请求时,用了 OpenAI 的严格结构化输出(src/plugins/openai/openai-rename.ts 的 toRenamePrompt 函数):
1 | |
问题:json_schema + strict 是 OpenAI 较新的专有能力,DeepSeek 不支持,直接用会报 400 错误。DeepSeek 只支持 { type: "json_object" }。
解决:打开 src/plugins/openai/openai-rename.ts,找到 toRenamePrompt 函数,做两处修改。
① 把 response_format 换成 json_object:
1 | |
② 在 system prompt 里明确要求返回 JSON(json_object 模式通常要求 prompt 中出现 “JSON” 字样,否则可能报错或不返回 JSON):
1 | |
改完这两处,DeepSeek 就能正常跑了。
附带说明:文件里的
PRICING价格表只用于日志中估算cost_usd,不影响功能。换成 DeepSeek 后成本数字会不准,但不影响反混淆正常运行。想让日志成本准确,可以给PRICING加一行deepseek-chat的价格。
五、落地建议(少踩坑)
先跑
--model=none验证基础链路。它不需要任何 API,先确认 AST 反混淆这条路通了,再接 DeepSeek,排错更容易。先拿小文件试。JSimplifier 是逐个变量调用 API的(
visitAllIdentifiers遍历每个标识符各发一次请求),混淆文件变量多时 API 调用次数会非常大。先用小样本验证改造成功,再批量。DeepSeek 性价比高。变量重命名任务对模型能力要求不高,
deepseek-chat足够,而且逐变量调用累积的 token 量不小,DeepSeek 便宜量大正好合适。改代码前先只改配置试一次。万一你用的中转层恰好支持
json_schema,就省了改代码;报response_format相关错误了,再动第 2 步。
六、其他国内模型对照
如果不用 DeepSeek,其他几家的兼容参数(response_format 同样建议改成 json_object):
| 厂商 | baseURL | model 示例 |
|---|---|---|
| DeepSeek | https://api.deepseek.com/v1 |
deepseek-chat |
| 通义千问(百炼) | https://dashscope.aliyuncs.com/compatible-mode/v1 |
qwen-plus |
| Kimi(月之暗面) | https://api.moonshot.cn/v1 |
moonshot-v1-8k |
| 智谱 GLM | https://open.bigmodel.cn/api/paas/v4 |
glm-4-flash |
参考
- JSimplifier:https://github.com/xingtulab/jsimplifier
- 论文 DOI:10.14722/ndss.2026.242198
- DeepSeek API 文档:https://api-docs.deepseek.com/
本文仅作技术学习与安全研究记录。请在合法合规、获得授权的前提下使用相关技术。