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代理, 代码还原, 反混淆, 可视化界面, 数据可视化, 自定义脚本