alexkkork/roblox-stuff
GitHub: alexkkork/roblox-stuff
一套整合了 Roblox Luau 无头运行时、代码混淆器、Luraph 反混淆器和 Web 工作台的综合工具链,用于脚本的受控执行、安全分析和代码保护。
Stars: 0 | Forks: 0
# Roblox Luau 运行时框架
本项目构建了一个独立的 Luau 可执行文件,它内嵌了官方的
`luau-lang/luau` 虚拟机 (VM),并安装了一个高保真、无头 (headless) 的 Roblox 客户端
环境。运行时 v2 使用原生 Instance userdata、版本锁定的反射、
确定性的 coroutine 调度器、隔离的脚本环境、由 fixture 支持的
服务、HTTP/JSON 粘合代码、数学 userdata、执行器分析垫片 (shim),以及围绕
动态代码和网络抓取的捕获钩子。
它并不是 Roblox 引擎的逐字节实现。真实的物理效果、
渲染、Roblox 身份验证、实时复制、安全身份和服务器
内部实现仍然是存根 (stub) 的。其目标是在受控分析和解密的 payload 捕获方面实现脚本可见的兼容性。
## 构建
```
cmake -S . -B work/build -DCMAKE_BUILD_TYPE=Release
cmake --build work/build --target rbx_luau_runtime -j
cmake --build work/build --target alexfuscator -j
```
## Alexfuscator
`alexfuscator` vNext 是一个 C++20 typed-IR 到 register-VM 的编译器。每个生产
配置都使用 register VM v5 并带有特定于配置的加固;生成的输出
永远不会重构源代码或调用 `loadstring`。不支持的语法会产生
结构化的编译错误,而不是较弱的回退。该 VM 支持 closures、
递归、varargs 和多重返回值、方法、所有常见的循环形式、
break/continue、插值、if 表达式、类型擦除、metamethod、
coroutine yields 以及受保护帧的执行器 metadata 适配器。
构建报告使用 descriptor 版本 3,并标识了 `backend=register_vm_v5`、
有效的控制措施、实际的 feature flags、原型/指令计数,以及
`fallback_used=false`。Maximum 添加了使用 HKDF-SHA256 和 ChaCha20-Poly1305 的经过身份验证的惰性 block 和常量
片段。独立的产物仍然可以通过 runtime tracing 恢复,
并不被视为具有完美的保密性。
```
./work/build/alexfuscator path/to/input.luau \
-o outputs/alexfuscator/input.obf.luau \
--profile maximum \
--runtime universal \
--seed auto
```
有用选项:
- `--profile compatibility|hardened|maximum`:默认为 `maximum`;旧的
名称将被拒绝并提示迁移错误。
- `--runtime universal|roblox|executor` 和 `--key-mode standalone|online`。
- `--control-flow`、`--constant-protection`、`--vm-diversity` 和
`--tamper-density`:接受 `preset`、`off`、`standard`、`aggressive` 或
`maximum`。
- `--environment-binding portable|roblox|executor`。
- `--stdin --stdout --report-fd 3`:无文件 worker 集成。
- `--seed auto|VALUE`:固定值产生确定性输出;`auto`
每次运行都会随机化。
- `--analysis-notice TEXT`:嵌入惰性信息文本,从不更改
加密密钥或评分。
本地 UI:
```
cd web/alex-key-vault
npm run worker
# 第二个 terminal
npm run local
```
打开 `http://127.0.0.1:8791/`。浏览器获取无源的编译 token,
并将源代码直接发送到端口 `8792` 上的 worker。`/admin2` 仅显示
HMAC 哈希的用户标识符和操作使用情况;本地开发
密码是 `admin2-local`。生产环境必须配置 `web/alex-key-vault/.env.example` 和 Redis 中记录的密钥。
快速验证:
```
./work/build/alexfuscator tests/alexfuscator_smoke.luau \
-o outputs/alexfuscator/alexfuscator_smoke.obf.luau \
--profile hardened --runtime universal --seed 123
grep -q loadstring outputs/alexfuscator/alexfuscator_smoke.obf.luau || \
echo "custom VM output has no loadstring"
./work/build/rbx_luau_runtime \
--profile executor-client \
--out outputs/alexfuscator/runtime_smoke \
outputs/alexfuscator/alexfuscator_smoke.obf.luau
python3 tests/run_vnext_differential.py --programs 500
python3 tests/test_alexfuscator_v5.py --seeds 100
./work/build/rbx_luau_runtime \
--minimal-env \
--out outputs/alexfuscator/minimal_smoke \
outputs/alexfuscator/alexfuscator_smoke.obf.luau
```
## 运行
```
./work/build/rbx_luau_runtime --out captures path/to/script.lua
```
## Web 运行器
浏览器工作台保持了通用路径的简洁:选择一个客户端配置,
粘贴 Luau 代码并运行。运行时身份、调度器限制、场景、网络
fixtures、捕获钩子、调用 tracing 以及 Luraph 控件位于 Advanced
抽屉中。控制台输出、保真度 metadata、钩子和文件被分隔到
稳定的标签页中。临时 worker 路径会从每个 API 响应中移除。托管
运行在离线状态下开始。当脚本到达 HTTP 时,控制台会指明确切的主机,
并提供明确的 **Allow host and retry** 操作;该重试仅针对该主机使用 allowlist
模式,永远不会静默启用实时网络。
针对本地原生二进制文件运行它:
```
cd web/rbx-runtime-runner
RBX_RUNTIME_BINARY=../../build/rbx_luau_runtime PORT=8794 npm run dev
```
或者构建并启动隔离的容器:
```
cd web/rbx-runtime-runner
docker compose up --build
```
打开 `http://127.0.0.1:8795/`。在执行 `docker compose` 之前设置 `ALEX_RUNTIME_PORT`
以选择另一个主机端口。该容器在多阶段构建中编译
原生 runtime,然后以非特权用户身份运行该服务,并具有
只读的根文件系统、有限的 tmpfs、丢弃的 Linux capabilities、PID
限制以及内存/CPU 限制。除非调用者
明确更改运行器策略,否则脚本 HTTP 保持离线状态。健康状态可在 `/api/health` 获取。
有用选项:
- `--out DIR`:写入捕获的脚本和 metadata 的目录。
- `--capture-min N`:常规 `captured_script.lua`
和 `captured_httpget.lua` 镜像的最小字符串大小。所有 `loadstring` 输入仍会被记录。
- `--capture-string-hooks|--no-capture-string-hooks`:启用或禁用围绕 `string.*`、`table.concat`、`buffer.tostring`
和 coroutine 返回值的额外大字符串捕获。默认为分析启用。
- `--profile roblox-client|executor-client`:运行时角色。默认为
`executor-client`。
- `--clock virtual|realtime`:默认为确定性虚拟帧,带有
可选的单调实时时钟。
- `--frame-rate N` 和 `--max-virtual-seconds N`:虚拟调度器控制;
默认为 60 Hz 和 30 秒。
- `--scenario PATH`:加载包含身份、
Instances、ModuleScript 源代码、属性、标签、HTTP/remote fixtures 和
预定的输入事件的 version-1 JSON descriptor。显式的 CLI 身份和时钟标志优先。
- `--unsupported error|trace-nil`:严格的 Roblox 风格错误或带有 nil 回退的
分析模式 tracing。默认值遵循所选的配置。
- `--report PATH|-`:以 JSON 格式输出 runtime/API 版本、返回值、输出、调度器状态、
原生引擎计数、不支持的调用、`termination_reason` 以及结构化的
`network_requirements`。
- `--minimal-env`:跳过 Roblox 垫片 (shim) 并使用
核心 Luau 全局变量加上原生捕获辅助工具运行的诊断模式。
- `--network-policy allowlist|live|offline`:默认为 `allowlist`。
- `--allow-host HOST`:在 allowlist 模式下允许 HTTP 主机。默认包括
`raw.githubusercontent.com`、`localhost` 和 loopback。
- `--fixture URL=PATH`:从本地文件重放 URL。
- `--trace-compat PATH`:将缺失的全局变量/成员/存根命中写入 JSONL。
- `--trace-calls`:在 JSONL trace 中包含成功的高级 API 调用。
- `--luraph-mode off|auto|force`:启用精确源代码优先的 Luraph 恢复。
`auto` 在检测到诸如 `LPH@` 之类的 Luraph 标记时激活。
- `--luraph-stop-after-exact-source|--no-luraph-stop-after-exact-source`:
在写入 `original_luau_exact.lua` 后请求提前停止。
- `--luraph-save-intermediates|--no-luraph-save-intermediates`:保存打包的
blobs、类似 bytecode 的数据、解包摘要和回退笔记。
- `--luraph-max-steps N`:确定性的 Luraph VM safepoint 限制,默认
`50000000`。
- `--luraph-stall-steps N`:在提取开始并且在 `N` 个
safepoint 内没有出现新的精确源代码、blob、函数 dump 或反编译器产出时停止。
默认为 `10000000`;使用 `0` 禁用。
- `--progress-interval SECONDS`:按间隔打印 VM safepoint 进度。
使用 `--progress-interval 1` 每秒获取一次 Luraph 进度。Luraph 运行
在提取开始后还会显示 `stall=idle/max`。
- `--sift-decompile|--decompile`:当捕获到类似 bytecode 的字符串时,
将它们上传到 Sift 的 `/api/v1/decompile` 端点,并将返回的 Luau 保存为
`luraph_decompiled_fallback.lua`。
- `--sift-disassemble|--disassemble`:将捕获的类似 bytecode 的字符串上传到
Sift 的 `/api/v1/disassemble` 端点并保存 `luraph_disassembly.txt`。
- `--sift-api-key KEY`:Sift 的 API key。这会覆盖环境变量和
内置的回退密钥。
- `--sift-api-key-env NAME`:用于 Sift 密钥的环境变量。
默认为 `SIFTRBLX_API_KEY`;如果未设置,此本地构建将使用
编译时内置的回退密钥。
- `--sift-base-url URL`:Sift 的 base URL,默认为 `https://siftrblx.com`。
- `--chunk-name NAME`:覆盖堆栈/错误文本中使用的 Luau chunk 名称。
- `--luau-opt-level N` 和 `--luau-debug-level N`:编译器诊断信息。
- `--timeout SECONDS`:VM safepoint 超时时间,默认为 `30`。
- `--native-codegen|--no-native-codegen`:在支持时启用或禁用 Luau 原生
codegen。
- `--native-codegen-block-mb N` 和 `--native-codegen-max-mb N`:为非常大的混淆代码块调整 Luau
原生代码分配。
- `--trace-pcall-errors`:记录受保护调用 (protected-call) 的唯一错误。
- `--normalize-pcall-errors|--no-normalize-pcall-errors`:应用常见的
Luraph 反格式化行号标准化。默认启用。
- `--place-id`、`--game-id`、`--job-id`、`--user-id`、`--player-name`:覆盖
Roblox 客户端角色。
- `--stop-after-capture`:预留给希望在
捕获点后中止的工作流。
- `--autorun-loadstring`:除了返回包装函数外,
立即调用 `loadstring` 返回的无参数 chunk。
- `--no-autorun-loadstring`:禁用该行为。这是针对
其加载的 chunk 需要参数的脚本的默认安全模式。
运行时报告使用以下五种终止原因之一:
- `completed`:主脚本和调度器正常完成。
- `virtual_budget`:确定性边界模拟成功完成,
但仍有等待中的工作。
- `network_required`:离线执行到达一个或多个被阻止的 HTTP(S)
主机;报告列出了 allowlist 重试所需的主机和 URL。
- `wall_timeout`:受 CPU 限制的执行超过了监视器时间。
- `runtime_error`:编译或脚本执行失败。
每个 Script 都会获得自己的环境,而 `_G` 是一个跨脚本共享的、
可变的、无 metatable 的表。ModuleScript 保持隔离的脚本
环境并共享 `_G`。在执行器配置中,`getgenv`、`getrenv` 和
`getsenv` 保留了这些区别,包括加载的 chunk 和回调。
面向 Luraph 的运行示例:
```
./work/build/rbx_luau_runtime \
--profile executor-client \
--luraph-mode force \
--network-policy allowlist \
--allow-host raw.githubusercontent.com \
--chunk-name "Luraph Script" \
--native-codegen-block-mb 128 \
--native-codegen-max-mb 1024 \
--luraph-max-steps 50000000 \
--luraph-stall-steps 10000000 \
--progress-interval 1 \
--sift-decompile \
--sift-disassemble \
--trace-compat captures/compat_trace.jsonl \
--out captures \
work/luraph_acceptance.lua
```
## 保真度预言机
Roblox Studio 记录在案的命令行运行器被用作行为预言机。
更新程序导出 API schemas 并执行探测套件,无需手动
与 Studio 交互:
```
python3 tools/update_roblox_oracle.py
python3 tests/run_roblox_fidelity.py --operations 1000
```
Oracle fixtures 按 Studio 版本存储。运行时仍锁定在
版本 728,直到其 Luau 依赖项和反射快被刻意同时推进;较新安装的
Studio 会写入一个单独的 fixture 目录。
此本地构建包含一个编译时内置的 Sift 回退密钥。设置
`SIFTRBLX_API_KEY` 或传递 `--sift-api-key` 可覆盖它。选定的密钥
作为 `X-API-Key` 发送;密钥值不会写入报告中。
## 捕获
运行时会写入如下文件:
- `loadstring_input_0001.lua`
- `loadstring_return_0001_01.lua`
- `loadstring_error_0001.txt`
- `httpget_0002.lua`
- `main_return_01.lua`
- `capture_index.jsonl`
对于大型 payload,为了兼容常见的工作流,也会写入
`captured_script.lua` 和 `captured_httpget.lua`。
在 Luraph 模式下,精确的源代码恢复是显式的:
- `original_luau_exact.lua` 仅在从运行时承载源的
路径捕获到精确源代码文本时才会被写入。
- `luraph_packed_blob.txt` 存储捕获的 `LPH@...` 打包数据。
- `luraph_unpacked_state.json` 记录打包/blob 分析状态。
- `luraph_bytecode_or_prototypes.bin` 存储二制的类似 bytecode 的捕获。
- `luraph_function_dump.json` 存储 VM 返回函数而不是源代码字符串时的
返回 closure/upvalue metadata。
- `sift_decompile_response.json` 和 `sift_disassemble_response.json` 存储启用 Sift 回退时的
原始 Sift 响应。
- `luraph_disassembly.txt` 存储启用反汇编时的
Sift opcode 列表。
- `luraph_decompiled_fallback.lua` 是回退笔记或 Sift 生成的
反编译代码,绝不会标记为原始源代码。
- `luraph_recovery_report.json` 将 `exact_recovery_status` 记录为
`recovered`、`not_present`、`blocked` 或 `unknown`。
## 自动反混淆器
离线优先的 orchestrator 结合了保守的静态转换、
运行时捕获钩子、家族适配器、编译检查和差分运行。
它仅在恢复并验证了承载源的产出时,
才将输出标记为精确。否则,它会输出可读的重构或结构产出。
```
python3 tools/auto_deobfuscator.py protected.luau \
--runtime build/rbx_luau_runtime \
--alexfuscator build/alexfuscator \
--mode auto --profile executor-client
```
使用 `--mode exact` 拒绝重构输出,使用 `--mode reconstruct` 进行
可读的最佳尝试,或使用 `--mode disassemble` 仅进行结构分析。
默认情况下网络访问为离线状态。结果包括语义 IR、CFG、
常量、VM 反汇编、内容寻址的产出图,以及记录
出处和验证的报告。
运行 Web 运行器时,本地 Web 工作台可在 `/deobfuscator` 访问。
其 API 仅将输入和产出存储在按请求划分的临时
目录中,并在响应完成之前将其删除。
## CI 产出物
GitHub Actions 工作流构建:
- `rbx_luau_runtime_macos_arm64`
- `rbx_luau_runtime_ubuntu_x86_64`
- `roblox_luau_runtime_project.tar.gz`
- SHA-256 校验和文件
标签:AI工具, Bash脚本, Lua, MITM代理, 代码反混淆, 代码混淆, 搜索引擎查询, 游戏开发, 虚拟机(VM), 请求拦截, 运行时环境, 逆向工具