对抗性防御:保护二进制文件 / JS / Python 免受 AI 逆向工程智能体攻击
英语 · 简体中文 · 繁体中文 · 日语 · 韩语 · 土耳其语 · 俄语 · 越南语 · 泰语 · 德语 · 西班牙语 · 法语 · 乌克兰语 · 波兰语 · 葡萄牙语(巴西)· 阿拉伯语 · 波斯语 · 印尼语 · 意大利语 · 希腊语 · 马拉雅拉姆语 · 罗马乌尔都语 · 罗马尼亚语
BLA:Blind LLM Agents
投毒 → 耗尽 → 幻觉。让逆向工程再次破产。
开源的 Counter-REA 蓝队防御 MCP 与 CLI,保护软件发行物免受 AI 逆向工程智能体(morluto/rea、自主反编译器以及 LLM 侦察流水线)的攻击——已在 14 个展示基准目标上完成验证。
🌐 官方网站 · 📖 防御指南 · 📊 实时基准 · 🎯 CrackMe 竞技场 · 🏢 企业版 · ⚖️ 免责声明
快速开始 · 工作原理 · 实测结果 · 格式覆盖 · 14 目标基准 · CrackMe 竞技场 · 常见问题
仅限防御用途:BLA 专为保护自有知识产权与发行产物的软件作者和安全团队而设计。参见 DISCLAIMER.md。请始终从官方来源安装:qybaihe/bla 或 npm i bla-agents。
🔴 没有 BLA 时
AI 逆向工程智能体(REA + 编码智能体)会解包 .asar 归档、还原 SourceMap、追踪 IPC 桥接、检查 .wasm / .sqlite / .safetensors,并在数秒内以约 $0.20 的成本克隆核心业务逻辑。
🛡️ 有了 BLA(bla harden .)
每一次分析器遍历都会撞上确定性的资源上限(primitive-candidates > 256、ASAR > 16 MiB、WASM > Wabt 上限、SQLite 虚拟陷阱),沿着逼真的影子状态机运行,并投射出 300×–2,800× 的建模 token 放大(token-estimator.ts)。
⚡ 设计上运行时等价
耗尽图与诱饵载荷位于 $O(1)$ 数论不透明谓词($7x^2 - 1 \neq y^2 \pmod 7$)或惰性格式区段之后。随附的 14/14 个基准目标均通过输入/输出等价性测试(bla verify 用于检查 Counter-REA 结构闸门;自定义产物请运行你自己项目的测试套件)。
⚡ 30 秒快速开始
1. 一条命令完成 CLI 加固
将 BLA 指向任意项目或发布目录。它会自动发现构建产物(dist/、build/、.asar、.wasm、.sqlite、.safetensors、原生二进制、Python/C/Rust/Go),并执行 audit → protect → verify:
# Node.js ^22.23.4 or >=24.0.0 recommended
npx bla-agents harden .
2. 智能体驱动的闭环防御(MCP + Skill)
把你的编码智能体(Claude Code、Cursor、Codex、Windsurf、Gemini CLI、GitHub Copilot CLI、VS Code、OpenCode、Antigravity)与 BLA 注册一次:
npx bla-agents setup
然后只需向你的编码智能体输入提示词:
Harden my software against REA
你的宿主智能体会自动编排 BLA 的 MCP 工具(bla_weave_plan → 源码级逻辑编织与字符串加密 → bla_verify_weave → bla_harden → bla_verify),从而同时加固你的源码架构与编译后产物。
3. 构建打包器插件(Vite / Rollup / Webpack / esbuild)
在打包阶段自动保护 JS chunk、用 VLQ v3 蜜罐映射移除/替换 SourceMap,并屏蔽 .wasm 资源:
import { defineConfig } from "vite";
import { blaVitePlugin } from "bla-agents/bundler";
export default defineConfig({
plugins: [blaVitePlugin({ intensity: "bankrupt", enableHoneySourceMaps: true })],
});
🧠 BLA 如何工作:智能体驱动的闭环
传统混淆器只会重命名变量(_0x1a2b)——现代 LLM 可以毫不费力地总结出来;或者把二进制文件包进沉重的 VM 加壳器中,这会破坏跨平台构建并拖垮性能。
BLA 3.x 将格式原生的确定性防护盾与宿主智能体的精准源码编织结合起来:
文章标题:针对 AI 逆向工程代理的二进制/JS/Python 对抗性防御
正文:
flowchart LR
subgraph S1["1 · Recon & Plan"]
A["bla_audit / bla_lint"] --> B["bla_weave_plan"]
end
subgraph S2["2 · Agent Source Surgery"]
B --> C["bla_encrypt_strings\n(AST Span XOR + Keystream)"]
C --> D["bla_bind_scope\n(Multi-Site State Entanglement)"]
D --> E["bla_verify_weave"]
end
subgraph S3["3 · Artifact Shielding"]
E --> F["bla_harden / bla_defend\n(19+ Format Shields + Self-Seal)"]
end
subgraph S4["4 · Counter-REA Gate"]
F --> G["bla_verify\n(Structural Counter-REA Checks Only)"]
end
| 防御支柱 | 机制 | 对 AI 逆向工程代理的影响 |
|---|---|---|
| 1. 投毒(欺骗) | 植入格式合法的 canary、SGX/TPM2/Secure Enclave 委托清单、VLQ v3 蜜罐 SourceMap,以及看似合理的影子状态机。 | 迫使 LLM 代理将上下文拆分到相互冲突的假设之间,并追逐人为构造的死胡同。 |
| 2. 耗尽(预算破坏) | 触发分析器的精确上限( primitive-candidates 、 alias-selections 、 ASAR 16 MiB 头、WASM Wabt 表示、SQLite 虚拟列求值、Model 32 层嵌套、PCAP tshark JSON、Electron 32 个 fuse 哨兵)。 | 在核心逻辑被提取之前,将 REA 检查从 COMPLETE 降级为 LIMITED / CapacityError。 |
| 3. 纠缠(防剥离与自密封) | 通过运行时 SHA-256 摘要( --self-seal 、 --sidecar-entangle )和多站点调用者作用域折叠( bla_bind_scope )绑定同级产物(JS ↔ WASM ↔ Native sidecar)。 | 阻止红队代理剥离诱饵、对单点检查做 nop 补丁,或将导出函数当作离线预言机调用。 |
| 4. 运行时楚门的世界 | 加固 Electron V1 Fuse( RunAsNode=0 、 Inspect=0 ),并检测 CDP / Node Inspector / Frida / WebDriver 附加( runtime-shield.ts )。 | 在实时调试期间提供可信的合成遥测数据,同时保持正常用户执行不受影响。 |
🔬 与真实 REA 的实证结果
这些数字来自在商用硬件上对 BLA 加固样本运行真实的 morluto/rea(npm run redteam:rea)。完整机器可读报告:docs/redteam/empirical-rea-validation.md / .json。
如何解读:“经实证验证”是指在此环境中,实时 REA 分析器路径返回了所列出的预算 / 容量 / 编辑失败。这不是对我们在本环境中未运行的 Ghidra/Frida/LLDB/Rizin/JADX 会话的声明。
在商用硬件上经实证验证
在 Node v24.22.1 下记录,并在注明时使用可选的 Wabt 1.0.42 + tshark 4.4。当外部原生工具缺失时,软跳过可保持 Node 22 / CI 通过。
| 格式 | 之前 → 之后 | BLA 后的 REA 结果 | 触发的确切 REA 预算 / 错误 |
|---|---|---|---|
| Go buildinfo | 50 KiB → 1.16 MiB | ❌ 容量错误 | MAX_BUILD_INFO_BYTES (1 MiB) — Go build-info 字符串长度超过 1 MiB 限制 |
| Erlang BEAM | 84 B → 262 KiB | ❌ 容量错误 | max_chunks — BEAM form 超出 64 个 chunk 的预算 |
| EVM bytecode | 16 B → 4.00 MiB | ⚠️ 逼近完整上限 | EVM_INTERFACE_LIMITS.inputBytes (4 MiB) |
| PCAP | 24 B → 1.29 MiB | ❌ 预算被拒 | TSHARK_JSON_MAX_BYTES (>8 MiB) → AnalysisResourceConstraintError |
| Electron ASAR | 607 B → 16.9 MiB | ❌ 容量错误 | DEFAULT_ASAR_MAX_HEADER_BYTES (16 MiB) |
| WASM + Wabt | 54 B → 6.56 MiB · 251 个导出 | ⚠️ ifaceState=partial | WASM_INTERFACE_REPRESENTATION_BYTES — Typed WASM 接口解码超出 WABT 预算 |
| SQLite (Node 24) | 12 KiB → 56 KiB | ❌ 脱敏 / 求值陷阱 | SqliteColumnEvaluationFailure — 虚拟陷阱列上的未知 enclave_unseal_payload() |
| JavaScript | 761 B → 116 KiB | ❌ 预算被拒 | alias-selections + getter-expansion + primitive-bytes + primitive-candidates |
| Safetensors | 128 B → 10.1 KiB | ❌ 容量错误 | MODEL_JSON_NESTING — Safetensors JSON 嵌套超过 32 层(HF 可加载;张量完整) |
| GGUF | 24 B → 7.7 KiB | ❌ 容量错误 | MODEL_METADATA_NESTING — GGUF 元数据嵌套超过 32 个数组帧 |
| Electron fuses | 50 KiB → 1.16 MiB | ❌ 预算被拒 | ELECTRON_FUSE_LIMITS.maximumSentinelsPerSlice (>32) |
| Flutter pool | 50 KiB → 1.16 MiB | ⚠️ 预计触及上限 | MAX_POOL_URIS / MAX_POOL_TOKENS(REA 以“at least N”截断) |
本地复现:
export REA_WABT_BIN_DIRECTORY=$HOME/opt/wabt-1.0.42/bin # optional
npm run build && npm run redteam:rea
这些防护存在于仓库内,并由单元测试 / catalog 漂移检查覆盖,但对应的 REA 路径需要外部原生调试器 / 反编译器,CI runner 上未安装:
| 领域 | 此处为何未验证 |
|---|---|
| Ghidra / 原生反编译深度 | 需要本地安装 Ghidra + REA bridge |
| Frida / LLDB / GDB / Rizin 实时会话 | 需要这些调试器 + 附加到设备 / 进程 |
| JADX / 完整 Android APK 流水线 | 不支持 APK 重签名;独立的 DEX 防护已在仓库内 |
| 固件容器 | 存在暂存 / 提取预算;但没有固件语料库就无法做诚实的 E2E |
| SPIR-V / CUDA fatbinary / AMD GPU 对象 | 需要原生 GPU 对象解码器;PTX 文本已在仓库内受防护 |
| EVMole 进程内 EVM 解码 | 无法在进程内路径化;EVM 防护会致密化到 4 MiB 输入上限 |
🛡️ 格式覆盖
全部 19+ 种格式防护都直接内置于 bla-agents,零外部打包器依赖:
| 格式 | 金丝雀 + 诊断 | 耗尽 / 预算触发 | 经验 vs. REA | 备注 |
|---|---|---|---|---|
| JavaScript / TypeScript | ✓ | ✓ 语义预算 | 已验证(进程内) | Babel AST;AST 安全字符串加密;自密封 |
| Electron .asar | ✓ | ✓ 头部 16 MiB | 已验证 | IPC 去字面化 + Pickle 重新打包 |
| Electron fuses | ✓ | ✓ >32 哨兵 | 已验证 | V1 fuse 加固 + 哨兵洪泛 |
| WebAssembly ( .wasm ) | ✓ 自定义节 | ✓ 导出诱饵 → Wabt | 已验证(Wabt) | LEB128 解析器;保留 WebAssembly.validate |
| SQLite ( .sqlite / .db ) | ✓ 蜜罐 + 陷阱列 | ✓ 列评估 | 已验证(Node 24) | 魔字节验证;支持 WITHOUT ROWID |
| Safetensors ( .safetensors ) | ✓ 字符串元数据 | ✓ JSON 嵌套 >32 | 已验证 | 可被 HuggingFace 加载;张量字节保留 |
| GGUF ( .gguf ) | ✓ | ✓ ARRAY 嵌套 >32 | 已验证 | 保留模型权重和 KV 张量 |
| Go buildinfo (ELF) | ✓ | ✓ >1 MiB | 已验证 | 映射的 ELF 节 |
| Windows PE ( .exe / .dll ) | ✓ | ✓ .enclave COFF 节 + fuses/rustc/Dart | 已验证 | 映射的 .enclave 节、x86-64 ABI 函数岛、MSVC RTTI、CodeView RSDS PDB |
| Flutter / Dart pool | ✓ | ✓ URI/token 上限 | 已验证(预测) | 快照魔数 & 工具链洪泛 |
| Erlang BEAM ( .beam ) | ✓ | ✓ 块 / 原子 | 已验证 | 超过 64 块预算 |
| EVM + Solidity meta | ✓ | ✓ → 4 MiB 输入 | 已验证(方法) | CBOR 元数据 + 字节码致密化 |
| PCAP ( .pcap ) | ✓ | ✓ tshark JSON >8 MiB | 已验证(tshark) | 合成包 + 金丝雀注入 |
| Python ( .py / .pyc ) | ✓ | ✓ | 设计用于 | CPython 3.7–3.14 marshal & AST 支持 |
| NVIDIA PTX ( .ptx ) | ✓ | 入口洪泛 | 仅基准测试 | 内核入口 & 金丝雀洪泛 |
| DEX / IL2CPP / bplist / .NET / JVM / ZIP | ✓ | 格式特定 | 设计用于 | 重新计算 DEX SHA-1 & Adler32 校验和 |
📊 基准测试(14 个目标,内部估算)
运行 npx bla-agents benchmark 在本地执行 14 个目标的展示:
npx bla-agents benchmark
注意:下表中的 Token 和 USD 列是根据 BLA 的 REA 限制目录得出的内部估算,用于说明不同格式之间的相对放大效应——实际进程级 REA 错误,请参见上文的经验结果表。
聚合展示结果:约 639.5× token 放大 · 约 304.4× 成本放大 · 14/14 捆绑展示目标通过了运行时等价性检查。此结果仅限于基准测试夹具。
| 目标工件 | 未保护基线(估计) | BLA 保护后(估计) | Token 倍数 | 运行时等价性 |
|---|---|---|---|---|
| DX-Ball sound-pan ( .js ) | 84/100 · 4,800 tok · $0.20 | 2/100 · 13.5M tok · $212.82 · LIMITED | 2,822.7× | ✅ 100% |
| Notion Electron clipboard ( .asar ) | 98/100 · 9,132 tok · $0.34 | 2/100 · 23.1M tok · $358.28 · LIMITED | 2,532.3× | ✅ 100% |
| 企业许可证验证器 ( .ts ) | 84/100 · 4,800 tok · $0.20 | 2/100 · 13.5M tok · $212.82 · LIMITED | 2,822.7× | ✅ 100% |
| NVIDIA PTX 计算内核 ( .ptx ) | 81/100 · 4,800 tok · $0.20 | 6/100 · 2.40M tok · $39.29 · LIMITED | 500.2× | ✅ 100% |
| Erlang BEAM 模块 ( .beam ) | 81/100 · 8,900 tok · $0.34 | 5/100 · 3.86M tok · $62.08 · LIMITED | 433.2× | ✅ 100% |
| WASM 加密内核 ( .wasm ) | 81/100 · 4,800 tok · $0.20 | 6/100 · 1.83M tok · $30.23 · LIMITED | 381.5× | ✅ 100% |
| 边缘 AI Safetensors ( .safetensors ) | 81/100 · 4,800 tok · $0.20 | 6/100 · 1.81M tok · $29
热路径上没有。耗尽图位于 $O(1)$ 数论不透明谓词之后,二进制/模型/数据库诱饵则存在于惰性元数据或蜜罐表中。每个基准测试目标都会验证与原始构建 100% 的输入/输出等价性。
不会。所有 19+ 种格式防护都内置于 bla-agents 中,使用纯 TypeScript/Node.js 实现。外部工具(Wabt、tshark)仅在你运行可选的实时 REA 红队套件(npm run redteam:rea)时使用。
不。BLA 严格来说是蓝队防御工具,会在发布前加固你自己的构建产物。参见 DISCLAIMER.md。
📚 文档与链接
- ⚖️ DISCLAIMER.md — 防御性使用与自有软件政策
- 🚀 安装与智能体设置
- 🛠️ CLI 与 31 工具 MCP 目录
- 🤖 一键智能体防御(技能优先)
- 🧬 Weave-Decoy 与源码手术 MCP
- 🔬 REA 实证验证报告
- 📋 反 REA 预算矩阵
- 📝 CHANGELOG · 🛡️ SECURITY.md
🤝 贡献与社区
欢迎在 qybaihe/bla 提交 Issue 和 PR。提交 PR 前:
npm run build && npm test && node dist/cli.js benchmark
node scripts/verify-website.mjs
- 🎯 公开 BLA CrackMe 竞技场(challenge/v6 – v9)
- 💬 LINUX DO(linux.do)——新的理想型社区
📄 许可证
Star 历史
Star History 绘制 qybaihe/bla 的 GitHub star 增长情况。图表图片缓存约一天,并非按秒计数。点击它可打开完整历史。