Skill Guard
AI 降低了逆向工程的门槛:它能连续完成侦察、工具选择、脚本生成、动态取证和报告整理,并把一次分析复用到后续版本。用防守方的 AI 预测和拆解这条自动化链路,把熟练人工介入重新变成必要条件。
把抗逆向当作可度量的风险工程,而不是“叠满保护层”。默认攻击者控制客户端、文件、进程和网络,可记录解密后的代码与数据,也可补丁掉本地检查。目标是减少可交付资产、让 Agent 更早失去确定性、提高正确结果的验证与复用成本,并让服务端能够拒绝滥用;不要承诺“无法破解”。
先确定边界
从仓库、产物和构建配置中自行提取已知信息,仅在缺失信息会改变方案时询问用户。至少确定:
- 所有权或授权范围,以及允许做静态分析、动态测试和篡改测试的环境。
- 平台、架构、语言/运行时、发布渠道、签名方式、CI 和更新机制。
- 要保护的具体资产:服务端凭据、授权决策、算法、模型、协议、内容或完整性。
- 对手能力与目标:只会搜字符串、能用反编译器、能 Hook/调试、能改包重签,还是能控制内核/设备。
- 可接受的启动/运行开销、崩溃率、兼容性、可维护性、可观测性和误报。
所有权不明或目标疑似用于隐藏恶意行为时,不实施混淆、反分析或规避检测。
不可违反的原则
- 先移出信任边界。 客户端不得保存长期共享秘密,也不得独立作出高价值授权决定。优先改为服务端验证、短期且限域的令牌、签名授权声明和可撤销设备注册。
- 只保护高价值切片。 对选定函数/模块施加变换;不要默认全程序、全 pass。全局重度混淆常造成体积、性能、崩溃、AV 误报和不可诊断问题。
- 区分保密、完整性和真实性。 字符串加密只能减少静态明文;本地自哈希只能发现意外修改;只有由客户端外部信任根验证的签名或服务端证明才能提供更强真实性。
- 把运行时检测当信号。 Root、调试器、端口、进程名和耗时检测均可绕过且可能误报。默认记录风险、缩短会话、要求重认证或交给服务端决策;只有明确评估业务影响后才终止进程。
- 使用标准密码学。 禁止把 XOR、RC4、自制查找表、AES-ECB 或内置固定密钥描述为安全密钥保护。白盒实现也只能提高提取成本,不能保证密钥不可恢复。
- 保留发布能力。 固定工具版本和随机种子,保存 mapping/symbol、生成构建清单,支持崩溃反符号化、签名、回滚和正常更新。
- 用攻击者视角复测。 每个控制都必须有“正常功能、误报、性能、可绕过性、篡改和逆向重测”证据;仅凭编译成功或
strings无命中不能验收。 - 对抗自动化,不表演欺骗。 消除真实语义锚点、引入运行时上下文和构建差异;不要用假漏洞、伪凭据、错误工具输出或垃圾代码制造虚假胜利。
工作流
1. 建立基线
保留未加固的 release 产物及哈希。在隔离实验环境中按真实攻击路径测试:解包/反编译、字符串和元数据检索、调用图定位、调试/Hook、关键分支补丁、重打包/重签、协议重放。
记录每项资产的证据,不记录模糊的“破解率”:
asset | baseline location | attack path | time/steps | recovered value/behavior | confidence
若威胁包含 AI 辅助逆向,读取 agentic-re-threat-model.md,将基线拆成以下闭环:
发现语义锚点 -> 路由到工具 -> 恢复候选语义 -> 动态验证 -> 生成可复用知识
使用 reverse-skill 或等价工作流作为参考对手时,读取 reverse-skill-evaluation.md。固定模型/Agent 版本、技能提交、工具版本、时间与 token/命令预算;保存原始命令、产物和证据。不要把不同预算的两次运行直接比较。
2. 重画信任边界
按以下顺序处理资产:
- 从客户端删除长期密钥、万能许可证和不可撤销授权逻辑。
- 将高价值决策移到服务端;客户端只持短期、限受众、限权限的能力。
- 用系统密钥库保护设备私钥,并假设明文在使用瞬间仍可能被观测。
- 最后才对必须随客户端交付的算法、协议和检测逻辑做混淆或虚拟化。
3. 选择最小控制集
| 目标 | 首选控制 | 次选控制 | 不要声称 |
|---|---|---|---|
| 长期凭据 | 不下发;服务端交换短期令牌 | 系统密钥库中的不可导出设备私钥 | 字符串加密能保住内置共享密钥 |
| 授权/计费 | 服务端权威状态 + 签名声明 + 防重放 | 本地缓存的带过期签名票据 | 本地分支或自哈希不可补丁 |
| 算法/IP | 服务化、裁剪模型或拆分执行 | 对热点函数定向混淆/虚拟化 | 全程序混淆等于不可逆向 |
| 防重打包 | 平台签名/证明 + 服务端校验 | 分散的本地完整性信号 | 同文件中的 checksum 是信任根 |
| 内存/Hook 风险 | 最小明文窗口、密钥轮换、服务端风控 | 多源运行时信号 | 端口/进程名检测能可靠阻止 Frida |
| 内存破坏利用 | 编译器/平台 exploit mitigations | CFI、堆栈保护、RELRO、签名更新 | 代码混淆能替代内存安全 |
按目标平台读取 platform-playbooks.md。需要建立威胁模型或选择响应策略时读取 threat-model.md。
对 AI Agent 额外考虑四个可验证目标:
| 目标 | 合理控制 | 验收信号 |
|---|---|---|
| 降低自动发现率 | 清理名称、日志、source map、反射元数据和稳定协议锚点 | Agent 不能仅凭通用搜索定位高价值切片 |
| 打断工具编排 | 让必要证据跨静态、动态、服务端状态或异构模块 | 自动流程需切换工具或人工建立目标特定关联 |
| 降低证据充分性 | 短期能力、nonce、签名服务端状态、最小明文窗口 | 静态恢复不能独立获得真实业务能力 |
| 降低经验复用 | 受控的逐构建布局/常量/切片差异和协议演进 | 上一版本映射或提取脚本不能直接复用 |
4. 小步实施
- 一次只改变一个控制族,保留可比较产物。
- 对反射、序列化、JNI/PInvoke、插件、资源加载、AOT/trimming、签名和更新路径建立回归用例。
- 把 mapping、PDB/dSYM、原生符号和混淆配置当受控发布产物,不随客户端分发。
- 锁定工具的确切版本/提交;先在非关键模块试点。不要把多年未维护的 LLVM fork直接设为生产编译器。
- 若用户要求使用仓库中的 .NET hardener,先读 dotnet-hardener.md;它是 Windows 实验工具,不是通用生产保护器。
5. 对抗性验证
执行 validation-playbook.md 中与目标匹配的测试。至少比较基线和候选产物:
- 资产是否仍能通过静态、动态或协议路径恢复;路径改变了多少。
- 关键分支是否能被单点补丁;服务端是否会拒绝伪造或重放。
- 调试/Hook/Root 等信号在干净、企业管理、无障碍、杀软、模拟器和测试环境中的误报。
- 冷启动、热点延迟、内存、体积、崩溃、耗电、AV/商店扫描和可诊断性。
- 安装、升级、差分更新、回滚、签名校验及崩溃反符号化。
- 相同输入能否复现,或至少能否由 manifest 追溯。
对 AI Agent 同时记录:自主完成到哪一步、首次人工介入点、工具切换次数、目标特定脚本量、获得的真实能力、错误结论是否被验证纠正,以及跨版本资产/函数迁移率。把“Agent 输出了答案”和“答案经独立证据验证”为两种不同结果。
失败的控制应降级、缩小范围或移除,不以“更多层”掩盖回归。
6. 交付
输出以下内容:
- 范围、资产、对手模型和明确的非目标。
- 基线证据与已实施控制的配置差异。
- 验证矩阵:测试、期望、实测、证据、结论。
- 性能/兼容性/误报结果和残余风险。
- 构建清单、工具版本、mapping/symbol 保管位置及回滚步骤。
- 明确说明每项控制如何绕过,以及真正的信任根位于何处。
- AI 对抗附录:参考对手版本、预算、自动化停止点、人工介入、跨版本复用和可复现实验入口。
禁止的反模式
- 不生成假漏洞、误导性安全注释、伪凭据或“消耗 AI token”的诱饵;它们容易模式化识别,还会污染 SAST、审计、日志和事件响应。
- 不用恶意软件式持久化、多进程互杀、未告知的环境破坏、随机延迟崩溃或删除用户数据作为响应。
- 不临时启用 RWX 页面或自修改代码,除非有明确的 W^X 设计、平台许可和专项测试。
- 不把调试器、Root、自定义 ROM、无障碍工具、杀软注入或企业探针直接等同于攻击者。
- 不编造固定的逆向小时数、成功率、性能开销或“理论上限”。没有同一目标上的可复现实验,就标注为未知。
- 不混用互不兼容的工具参数,也不引用仓库中不存在的脚本。执行前先检查
--help、版本和输入格式。
质量门
只有同时满足以下条件才可建议发布:正常用户路径通过;更新和签名路径通过;无不可接受误报;性能在预算内;mapping/symbol 可用;至少一次独立的静态、动态和篡改重测完成;残余风险和回滚已记录。