JSimplifier 使用与改造:用 DeepSeek 跑 LLM 增强的 JS 反混淆

本文最后更新于:2026年8月14日 下午

本文为工具使用与改造记录,基于官方仓库源码编写

本文介绍 JSimplifier 的基本用法,并重点讲如何把它改造成用国内 DeepSeek 大模型驱动。文中代码与配置均基于官方源码核对,可直接落地。

一、JSimplifier 是什么

一个 JS 反混淆 / 反压缩 / 简化工具,来头不小——它是 NDSS 2026 论文《From Obfuscated to Obvious》的官方开源实现。

它的核心思路是多阶段流水线

预处理 → AST 静态分析变换 → 动态执行追踪 → LLM 增强的标识符重命名

论文数据:覆盖 20 类混淆技术、代码复杂度降低 88.2%、可读性提升 4 倍以上,在 44,421 个真实样本上评测过。

LLM 在这里干什么? 纯 AST 变换能还原结构、解常量、去死代码,但没法给变量起有意义的名字——混淆后满屏的 a_0x1f2e 它只能照搬。JSimplifier 把每个变量连同上下文发给大模型,让它推断用途、起一个描述性的新名字(比如 auserToken)。这是它比传统 AST 反混淆工具更进一步的地方。

二、基本使用

环境与安装

  • Node.js ≥ 20
  • Python 3.11(仅评测实验用,日常反混淆不需要)
1
2
3
git clone https://github.com/xingtulab/jsimplifier
cd jsimplifier
npm install

三种运行模式

1
2
3
4
5
6
7
8
# 1. 纯 AST 变换,不用 AI(免费、离线)
npm start deobfuscate -- --model=none input.js

# 2. 用 OpenAI 系模型
npm start deobfuscate -- --model=gpt-4o-mini --apiKey="sk-..." input.js

# 3. 用 Google Gemini
npm start deobfuscate -- --model=gemini-1.5-flash --apiKey="..." input.js

注意:命令要用 npm start deobfuscate --,参数前的双横线 -- 不能少。

输出保存在 output/deobfuscated_{文件名}/deobfuscated.js

常用参数:

  • --model:模型(none 表示纯 AST,默认)
  • --apiKey:API 密钥
  • --baseURL:API 服务器地址(改造国内模型的关键
  • --batch:批量处理目录下所有 JS
  • --outputDir:输出目录
  • --verbose:详细输出

它还提供 Web UI

1
2
npm run build
node web-server.js # 默认 http://localhost:3000

三、为什么它对国内大模型很友好

看源码会发现,改造成国内模型几乎不用动代码,原因有三:

  1. 用的是官方 openai npm SDKnew OpenAI({ apiKey, baseURL })baseURL 可自定义
  2. 默认 baseURL 本来就是国内中转——src/commands/openai.ts 里默认值是 https://api.zhizengzeng.com/v1(智增增),说明作者本就考虑了国内访问。
  3. 支持 --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
2
3
4
5
npm start deobfuscate -- \
--model=deepseek-chat \
--apiKey="sk-你的DeepSeek密钥" \
--baseURL="https://api.deepseek.com/v1" \
input.js

方式 B:写进 .env(推荐)

项目用了 dotenv(见 src/env.ts),在项目根目录建 .env

1
2
OPENAI_API_KEY=sk-你的DeepSeek密钥
BASE_URL=https://api.deepseek.com/v1

然后就不用每次敲密钥了:

1
npm start deobfuscate -- --model=deepseek-chat input.js

第 2 步:⚠️ 关键坑 —— 修改 response_format

这一步决定改造能不能成功,务必注意。

JSimplifier 给模型发请求时,用了 OpenAI 的严格结构化输出src/plugins/openai/openai-rename.tstoRenamePrompt 函数):

1
2
3
4
5
6
7
8
response_format: {
type: "json_schema", // ← OpenAI 专有特性
json_schema: {
strict: true,
name: "rename",
schema: { /* newName ... */ }
}
}

问题json_schema + strict 是 OpenAI 较新的专有能力,DeepSeek 不支持,直接用会报 400 错误。DeepSeek 只支持 { type: "json_object" }

解决:打开 src/plugins/openai/openai-rename.ts,找到 toRenamePrompt 函数,做两处修改。

① 把 response_format 换成 json_object

1
2
3
4
5
6
7
8
// 改前(OpenAI 专有,DeepSeek 报错)
response_format: {
type: "json_schema",
json_schema: { strict: true, name: "rename", schema: {...} }
}

// 改后(DeepSeek / 通义 / Kimi / GLM 都认)
response_format: { type: "json_object" }

② 在 system prompt 里明确要求返回 JSONjson_object 模式通常要求 prompt 中出现 “JSON” 字样,否则可能报错或不返回 JSON):

1
2
// 改后的 system content
content: `Rename the JavaScript variable/function \`${name}\` to a descriptive name based on its usage. Respond ONLY with JSON in the form {"newName": "..."}. Do not reuse names mentioned earlier.`

改完这两处,DeepSeek 就能正常跑了。

附带说明:文件里的 PRICING 价格表只用于日志中估算 cost_usd,不影响功能。换成 DeepSeek 后成本数字会不准,但不影响反混淆正常运行。想让日志成本准确,可以给 PRICING 加一行 deepseek-chat 的价格。

五、落地建议(少踩坑)

  1. 先跑 --model=none 验证基础链路。它不需要任何 API,先确认 AST 反混淆这条路通了,再接 DeepSeek,排错更容易。

  2. 先拿小文件试。JSimplifier 是逐个变量调用 API的(visitAllIdentifiers 遍历每个标识符各发一次请求),混淆文件变量多时 API 调用次数会非常大。先用小样本验证改造成功,再批量。

  3. DeepSeek 性价比高。变量重命名任务对模型能力要求不高,deepseek-chat 足够,而且逐变量调用累积的 token 量不小,DeepSeek 便宜量大正好合适。

  4. 改代码前先只改配置试一次。万一你用的中转层恰好支持 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 使用与改造:用 DeepSeek 跑 LLM 增强的 JS 反混淆
https://kingjem.github.io/2026/08/14/逆向/jsimplifier反混淆工具-用DeepSeek改造国内大模型/
作者
Ruhai
发布于
2026年8月14日
许可协议