# 注册机还原决策树与证据分级 ## 场景决策树(入口 → 分支) ### 1. 前置判定(第一级) ``` 拿到校验算法(来自 re-license 校验点清单) ├─ 全校验点是否都在本地? │ ├─ 否(有服务器侧验证/激活次数记录)→ 先处理在线/服务端部分,或如实报告(走 [[re-license]] 步骤 4) │ └─ 是 → 继续 ├─ 算法含单向部分(哈希/RSA/ECC 验签)? │ ├─ 是 → 不可逆段转 [[re-patching]],只对可逆段建模 │ └─ 否 → 进入分类(第 2 节) └─ 输入来源清楚(用户名/机器码/常量)? 否 → 回 [[re-license]] 补输入溯源 ``` ### 2. 算法分类树(可逆判定 + 生成策略) ``` 校验方式 ├─ 等值比较(serial == f(name))→ 直接 serial = f(name)(比较反转为生成) ├─ 变换型 │ ├─ XOR/位运算 → 对称直接逆 │ ├─ 模运算 → 模逆 pow(a,-1,m)(gcd(a,m)≠1 时退化为穷举候选) │ ├─ LCG/线性递推 → state = a^{-1}(state'-c) mod m │ └─ 移位/混合 → 按位逆推,注意进位与掩码(32/64 位) ├─ 查表型 │ ├─ 表为双射 → 逆映射表 │ └─ 表非双射 → 列全部候选(约束筛选) ├─ 校验位型 │ ├─ Luhn/mod 97/mod 11 → 先数据位后校验位 │ └─ CRC16/32 → GF(2) 线性,可反解"补位使 CRC 匹配" ├─ 加解密型(对称) → 解密器逆用为生成器([[re-crypto-id]] 识别 → [[re-crypto-decrypt]] 还原) └─ 单向型(哈希/签名)→ 不可逆 → 转 [[re-patching]] ``` ### 3. 实现策略分支(第二级) ``` 分类完成后 ├─ 变换步骤少且清晰 → 正推(逐行反转) ├─ 比较链/多等式 → z3 约束求解(符号变量 + 长度/字符集/位宽约束) ├─ 步骤多但机械 → 正推为主,逐行对照反编译(注释对照法) └─ 生成-校验自检 → 生成器内置校验逻辑,输出必须回验通过 ``` ### 4. 验证分支(收尾) ``` 生成器输出 ├─ 沙箱内跑目标程序全校验点 → 通过 → 完成,结论入 [[re-analyze/analysis-contract]] ├─ 被拒 │ ├─ 规范化差异(大小写/分隔符/补零)→ 修正规范化后重试 │ ├─ 校验位顺序/基数错 → 用已知合法序列号逐位回推 │ ├─ 溢出/字节序错 → 调试器断比较点对中间值 │ └─ 非格式问题仍拒 → 查第二校验点(多校验点漏判) └─ 多组输入回归(不同用户名/机器码)→ 全部通过才算完成 ``` ## 证据分级表 | 级别 | 证据形态 | 示例 | 用途 | |---|---|---|---| | A 强 | 生成-程序全链路闭合 | 生成的序列号在沙箱程序全部校验点通过,且已知合法序列号回推一致 | 可下"还原正确"结论 | | B 中 | 生成-自检闭合 | 脚本自检函数通过但未在真实程序验证(程序环境缺失) | 标注"待程序侧验证" | | C 弱 | 局部还原 | 只还原了部分变换,仍有约束未满足 | 不发布为可用生成器 | | 反证 | 差异定位 | 中间值对照发现某步不符 | 记录差异点,修正后重验 | - 结论必须标注验证环境(沙箱程序版本、校验点覆盖范围);只过了启动校验 ≠ 全校验点通过 ## 实现教训(内化) - 先格式后算法:序列号格式约束(长度/字符集/校验位位置)先列全,生成器输出框架先行,算法结果往框架里填 - 分类决定工具:等值比较不用 z3、单向型别硬塞约束——先分类再选实现策略,减少无用功 - 逐行注释对照是最稳的还原方式:"凭感觉重写"是错位的第一来源 - 已知合法序列号是黄金测试向量:程序里断校验函数记录中间值,与脚本中间值逐位比对,一次定位错位 - 多校验点意识:启动通过后必须按 [[re-license]] 全量清单逐点验证(功能点/激活次数/有效期) - 溢出与字节序是隐蔽差异源:32 位乘法/移位、大端小端、无符号/有符号——每步变换明确语义再写代码 ## 使用注意 - 全部验证在沙箱内([[re-sandbox]],[[re-analyze/platform-tips]] 最高原则);生成器只用于授权范围(自有软件/测试/研究) - 不可逆部分如实报告,不伪造"还原成功";本技能只描述算法结构与方法,不涉及具体软件破解流程