romanbsd/deobf
GitHub: romanbsd/deobf
一个基于 Babel 和 Wakaru 的 JavaScript 静态反混淆 CLI 与库,可将混淆压缩后的代码还原为可读形式。
Stars: 0 | Forks: 0
# deobf
`deobf` 是一个 JavaScript 反混淆 CLI 和库。它结合了:
- Wakaru 现成的反压缩规则
- Babel 的解析、遍历和生成 pass
- Recast 的最终美化打印
它仅执行静态源代码转换;从不执行输入的代码。
## 安装
```
npm install
npm link
```
Babel 8 需要 Node.js 22.18+ 或 24.11+ 版本。
## CLI
读取文件并打印结果:
```
deobf input.js
```
写入到文件:
```
deobf input.js -o readable.js
```
使用 stdin:
```
curl https://example.test/app.js | deobf > readable.js
```
解压 Electron ASAR 并反混淆所有 `.js`、`.cjs`、`.mjs` 和 `.jsx`
文件:
```
deobf app.asar
```
这会将其写入到 `app.deobfuscated/`。使用
`-o` 选择其他输出目录;该命令拒绝覆盖现有目录。无法
解析的文件将保持不变并在 stderr 上报告。非 JavaScript
文件在解压后保持原样。当 stderr 是
终端时会显示进度条;使用 `--progress` 强制显示,或使用 `--no-progress` 禁用。
每个 JavaScript 文件都有 10 秒的转换超时,因此病态的
模块不会导致归档停滞。使用 `--timeout 30` 更改,或使用
`--timeout 0` 禁用。
Wakaru 的多遍转换会自动跳过超过
256 KB 的文件,因为它们的成本在大型打包模块上会急剧增加。这些文件
仍由 Babel 和 Recast 处理。使用
`--wakaru-max-size 512` 更改阈值,或使用
`--wakaru-max-size 0` 在所有文件上强制运行 Wakaru。
大型文件也会传递给当前的 Rust Wakaru CLI,用于严格的打包文件
检测。检测到的 webpack、Browserify 和 esbuild 打包文件会在
转换后的文件旁边进行拆分:
```
dist/electron/renderer.js
dist/electron/renderer.modules/
module-570.js
module-1201.js
...
```
使用 `--no-unpack-bundles` 禁用此功能。使用 `--unpack-level aggressive` 进行
更具推测性的重写,或使用 `--unpack-min-size` 调整检测。
选择特定的 Wakaru pass:
```
deobf input.js --passes un-boolean,un-undefined,un-sequence-expression
```
包含被 Wakaru 文档标记为不安全或实验性的规则:
```
deobf input.js --unsafe
```
查看已安装的 Wakaru 版本导出的确切 pass ID:
```
deobf --list-passes
```
运行 `deobf --help` 获取所有选项。
默认情况下,Wakaru 的标准规则会优先运行,但不包括 `un-esm`、
`un-type-constructor`、`un-async-await` 和 `lebab`。排除 Lebab 集成是因为
其作用域分析在有效模式(例如重新赋值的函数声明)上会崩溃;它仍然可以通过
`--passes lebab` 显式调用。然后 Babel 会移除 `debugger` 语句,折叠可确切求值的
原始表达式,并移除常量死分支。Recast
生成最终的可读输出。
Babel 阶段还会静态解码 `javascript-obfuscator` 使用的
旋转字符串数组模式。它使用受限的表达式求值器,
不执行输入代码。使用 `--no-string-decode` 禁用。
## 库
```
import { deobfuscate } from "deobf";
const readable = await deobfuscate("var a=40+2,b=!0;");
```
ASAR 处理也可通过库使用:
```
import { deobfuscateAsar } from "deobf";
const result = await deobfuscateAsar("app.asar", "app.deobfuscated", {
fileTimeoutMs: 10_000,
wakaruMaxFileSize: 256 * 1024,
unpackBundles: true,
bundleLevel: "standard",
onProgress(progress) {
console.error(progress.current, progress.total, progress.path);
},
});
console.log(result.transformedFiles, result.failures);
```
所有阶段都是可配置的:
```
const readable = await deobfuscate(source, {
wakaruPasses: ["un-boolean", "un-undefined"],
unsafeWakaru: false,
constantFold: true,
deadCode: true,
removeDebugger: true,
quote: "single",
});
```
被其文档标记为不安全或实验性的 Wakaru 规则仅在
您使用 `--unsafe`、设置 `unsafeWakaru: true` 或显式指定其名称时才会运行。
不稳定的 `lebab` 规则仅在显式指定时运行。
标签:Babel, CMS安全, JavaScript, MITM代理, 代码还原, 反混淆, 可视化界面, 数据可视化, 自定义脚本