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), 请求拦截, 运行时环境, 逆向工具