Lincoln-Muller/rbx-obfuscator
GitHub: Lincoln-Muller/rbx-obfuscator
一款用 Rust 编写的 Roblox 文件混淆与组件提取工具,通过 Prometheus 引擎对 Luau 脚本进行多级别混淆,同时支持文件解构与重新编译。
Stars: 0 | Forks: 0
# rbx-obfuscator
`rbx-obfuscator` 是一个用于 Roblox 场所/模型的混淆和组件提取实用工具。它可以读取 `.rbxl`、`.rbxm`、`.rbxlx` 和 `.rbxmx` 文件,查找每一个 `Script`、`LocalScript` 和 `ModuleScript`,能通过 Prometheus 处理 Luau 的 `Source` 属性,并将结果以相同的 Roblox 文件格式写回。
它不使用 Rojo,也不需要在常规工作流中依赖 Roblox Studio。
## 设置
从 GitHub 安装最新版本:
```
curl -fsSL https://raw.githubusercontent.com/Thyssenkrupp234/rbx-obfuscator/main/install.sh | sh
```
安装程序会隐藏常规输出,并且每个安装步骤只显示一行。要查看底层的 `git`、Prometheus 和 Cargo 输出,请运行:
```
curl -fsSL https://raw.githubusercontent.com/Thyssenkrupp234/rbx-obfuscator/main/install.sh | sh -s -- --verbose
```
安装程序会执行以下操作:
- 从 GitHub 下载或更新此仓库到 `~/.rbx-obfuscator/source`
- 如果缺少 `cargo`,则使用 `rustup` 安装 Rust
- 安装或更新 Prometheus
- 构建 release 二进制文件
- 将 `rbx-obfuscator` 安装到 `~/.local/bin`
- 在你的 shell 配置文件中将 `~/.local/bin` 添加到 `PATH`
单行安装程序会从 GitHub 获取 `install.sh`。如果你已经有了检出代码,你也可以运行:
```
./install.sh
```
可以使用环境变量覆盖安装程序的设置:
```
RBX_OBFUSCATOR_REPO_URL=https://github.com/Thyssenkrupp234/rbx-obfuscator.git
RBX_OBFUSCATOR_BRANCH=main
RBX_OBFUSCATOR_INSTALL_ROOT="$HOME/.rbx-obfuscator"
RBX_OBFUSCATOR_BIN_DIR="$HOME/.local/bin"
```
手动构建:
```
cargo build --release
```
Prometheus 是一个直接的运行时依赖项。CLI 会在 `PATH` 中查找 `prometheus-lua`。如果在实际运行期间发现缺少该文件,CLI 会使用官方的 Prometheus 安装程序进行安装。
该工具还会在用户的状态目录下记录最后一次成功安装或更新 Prometheus 的时间。如果该时间戳超过了一周且有可用的互联网连接,它将运行 `prometheus-lua update`;如果该操作失败,则会重试安装程序命令。如果没有互联网连接,将跳过更新并使用现有的 Prometheus 安装。
试运行 模式不会安装、更新或启动 Prometheus。
## 用法
有四个直接的命令:
- `rbx-obfuscator obfuscate`:混淆 Roblox 文件中的脚本。
- `rbx-obfuscator extract`:从 Roblox 文件导出可读的组件。
- `rbx-obfuscator compile`:将感知编译的提取项目重新构建为 Roblox 文件。
- `rbx-obfuscator update`:更新已安装的 CLI 和受管理的依赖项。
运行不带任何命令的 `rbx-obfuscator` 总是会打开交互式终端向导:
```
rbx-obfuscator
```
该向导允许你选择完全混淆、组件提取或项目编译,粘贴路径,在需要时选择 Prometheus 级别,查看清晰的进度,并在完成屏幕上看到等效的直接命令。直接命令会跳过设置向导,并直接进入进度屏幕。
### 混淆
混淆必须通过 `obfuscate` 命令运行。必须提供输入文件和 `--level`。
混淆一个场所文件并将默认输出写入输入文件旁边:
```
rbx-obfuscator obfuscate game.rbxl --level medium
```
对于 `game.rbxl`,这会写入:
```
game-obfuscated_Medium.rbxl
```
使用明确的输出路径混淆文件:
```
rbx-obfuscator obfuscate /Users/lincolnmuller/Documents/train\ game.rbxl --level high --output ~/train_game_obfuscated_high.rbxl
```
混淆语法:
```
rbx-obfuscator obfuscate --level [--output ]
```
混淆选项:
- `--level `:必需的混淆复杂度。值不区分大小写,因此 `High` 和 `Medium` 也可以。映射到 Prometheus 预设。
- `--output `, `-o `:可选的输出 `.rbxl`、`.rbxm`、`.rbxlx` 或 `.rbxmx` 路径。默认为 `-obfuscated_.`。
- `--dry-run`:报告将要处理的脚本和将要使用的 Prometheus 预设,而不会运行 Prometheus 或写入输出。
- `--strip-types`:在每次 Prometheus 运行之前移除 Luau 类型注释并降级已知的 Prometheus 不兼容的 Luau 语法。
- `--backup-dir `:在替换之前将原始脚本源代码写入为 `.luau` 文件。
- `--skip-path `:跳过完全标准化后的 Roblox 实例路径,例如 `game.ServerScriptService.Main`。可以多次传递。
- `--manifest `:写入一个关于已处理、已跳过、已失败或试运行脚本的 JSON 报告,包括是否应用了 Luau 兼容性预处理。
- `--verbose`, `-v`:显示详细的每个脚本和 Prometheus 的日志。常规输出保持简洁。
### 提取
提取必须通过 `extract` 命令运行。唯一必需的参数是输入的 Roblox 文件。
```
rbx-obfuscator extract /Users/lincolnmuller/Documents/train\ game.rbxl
```
当未提供输出文件夹时,提取操作会使用不带扩展名的输入文件名创建一个同级文件夹。上述命令将写入:
```
/Users/lincolnmuller/Documents/train game/
```
当你希望将提取的项目放在其他位置时,请使用明确的输出文件夹:
```
rbx-obfuscator extract /Users/lincolnmuller/Documents/train\ game.rbxl ~/train_game_components
```
提取语法:
```
rbx-obfuscator extract [output-folder]
```
提取操作会导出脚本、GUI JSON、实例树、内容引用、`manifest.json` 以及被 `rbx-obfuscator compile` 使用的隐藏编译元数据。
### 编译
编译会重新构建由 `rbx-obfuscator extract` 创建的项目文件夹:
```
rbx-obfuscator compile /Users/lincolnmuller/Documents/train\ game
```
当未提供输出文件时,编译操作会写入提取期间记录的原始输入路径旁边:
```
/Users/lincolnmuller/Documents/train game-compiled.rbxl
```
当你希望将编译好的 Roblox 文件放在其他位置时,请使用明确的输出文件:
```
rbx-obfuscator compile /Users/lincolnmuller/Documents/train\ game --output ~/train_game_compiled.rbxl
```
编译语法:
```
rbx-obfuscator compile [output.rbxl|output.rbxm|output.rbxlx|output.rbxmx]
```
编译会将来自 `scripts/` 的已编辑脚本文件和来自 `instances.json` 受支持的编辑应用到提取期间保留的高保真原始文件上。在此版本中,`instances.json` 可以对现有实例进行重命名、重新设置父级、重新排序以及编辑受支持的导出属性。它会拒绝添加实例、删除实例、更改类、新增属性、移除属性、不支持的属性类型以及 JSON 中的脚本 `Source` 编辑。
### 更新
更新 CLI 和受管理的依赖项:
```
rbx-obfuscator update
```
`update` 会从 GitHub 下载最新的安装程序,更新源代码检出,重新构建 CLI,重新安装它,并更新 Prometheus。在 `update` 之后传递 `--verbose` 以显示安装程序的输出。
该工具接受 `.rbxl`、`.rbxm`、`.rbxlx` 和 `.rbxmx` 输入。它拒绝在解析出的输出路径与输入文件相同时写入混淆结果,提取操作拒绝将输入文件用作输出文件夹,而编译操作拒绝覆盖保留的原始快照或记录的原始输入文件。
## 提取
`rbx-obfuscator extract` 将 Roblox 场所/模型文件解构为可读的项目分解:
```
Ro-TransLink-extracted/
scripts/
guis/
instances.json
content_refs.json
manifest.json
.rbx-obfuscator/
```
提取会导出:
- 文件中存在的脚本源代码,格式为 `.luau`
- GUI 根节点(例如 `ScreenGui`、`BillboardGui` 和 `SurfaceGui`)作为 JSON
- 具有安全可序列化属性的可读 `instances.json` 层次结构
- 资产/内容引用,例如 `rbxassetid://`、`rbxasset://`、Roblox 资产 URL、纹理 ID、网格 ID、声音 ID 和动画 ID
- 包含计数、警告、不受支持的属性说明以及导出的脚本元数据的清单
- 隐藏的编译元数据和原始文件快照,以便 `compile` 在应用安全编辑的同时保留不受支持的 Roblox 数据
提取操作不会反编译字节码、恢复未存储在文件中的源代码、下载外部资产,或声称原始资产已被恢复。它会列出在可序列化属性中可用的引用。
由旧版本提取的文件夹不包含 `.rbx-obfuscator/`,在编译之前必须重新提取。
Prometheus 在处理某些 Luau 类型语法时可能会失败(例如 `local Bus:ObjectValue = script.Bus` 或 `for _, Car: Model in pairs(cars) do`),并且对于一些较新的 Luau 语法也会失败(例如 if 表达式和反引号字符串插值)。默认情况下,该工具只会在 Prometheus 处理某个脚本失败后应用此 Luau 兼容性预处理,然后重试该脚本一次。使用 `--strip-types` 可以在 Prometheus 运行之前预处理每一个脚本。
如果 Prometheus 仍然无法处理某个脚本,该脚本在输出文件中将保持不变。运行会继续,并在结束时打印所有失败的脚本路径。
长时间运行的脚本会受到保护,因此一个庞大的 ModuleScript 不会永远阻塞整个运行过程。在交互式向导中,如果某个脚本已经运行了 10 秒,页脚会显示控制选项:按 Enter 跳过该脚本,按 `m` 使用 Prometheus 的 `Minify` 预设重启该脚本,或按 `k`/`s` 强制当前预设继续运行。如果脚本运行达到 30 秒且没有进行旁路操作,该工具会自动将该脚本切换为 `Minify`;如果 `Minify` 也运行了 30 秒且没有进行旁路操作,则该脚本将被跳过且保持不变。直接 CLI 模式使用相同的自动“先 Minify 后跳过”行为,但没有键盘提示。
Prometheus 预设映射:
- `minimal`:`Weak`
- `low`:`Weak`
- `medium`:`Medium`
- `high`:`Strong`
## 本地开发
要在不安装或更新发布的 CLI 的情况下测试工作中的检出代码,请通过 Cargo 运行二进制文件:
```
cargo run -- --help
cargo run -- obfuscate /Users/lincolnmuller/Documents/train\ game.rbxl --level high --output /tmp/train_game_obfuscated_high.rbxl
cargo run -- extract /Users/lincolnmuller/Documents/train\ game.rbxl /tmp/train_game_components
cargo run -- compile /tmp/train_game_components /tmp/train_game_compiled.rbxl
```
`cargo run` 之后的 `--` 将 Cargo 的参数与 `rbx-obfuscator` 的参数分隔开。这总是会使用当前检出代码中的内容。
你也可以构建一次并直接运行本地调试二进制文件:
```
cargo build
./target/debug/rbx-obfuscator --help
./target/debug/rbx-obfuscator obfuscate game.rbxl --level medium --dry-run
```
当你想在安装之前测试优化的二进制文件时,请使用 `cargo build --release` 和 `./target/release/rbx-obfuscator ...`。
## 测试策略
运行单元测试:
```
cargo test
```
推荐的本地验证:
```
cargo fmt -- --check
cargo clippy --all-targets -- -D warnings
cargo test
cargo run -- obfuscate game.rbxl --level medium --dry-run --manifest manifest.json
```
然后打开 `manifest.json`,确认预期的脚本已被处理或跳过。在验证 release 构建时,请保留 `backups/` 用于比较原始源代码。
标签:Lua, Roblox, Rust, 代码混淆, 可视化界面, 游戏开发工具, 网络流量审计, 自定义请求头, 通知系统