3.7 KiB
3.7 KiB
注册机还原方法论坑与边界
可逆性边界组
- 单向函数没有生成器:哈希、RSA/ECC 验签、KDF 类校验不可逆——正推生成不可能;z3 对这类段无解(约束不可满足不是模型写错);诚实报告并转 re-patching 是正确路径,别伪造"还原成功"
- "可逆"指算法结构可逆,不是每步可逆:混合算法常是"可逆段 + 单向段"组合——可逆段生成、单向段跳过(如校验位只算一边);逐段标注可逆性
- 服务器端生成是硬边界:序列号由服务端下发(本地只验响应/签名)时,本地算法再完整也造不出合法序列号——生成逻辑在另一端,先确认归属再动手(反例:把响应校验当生成算法,白忙一场)
- 二次验证是隐藏边界:程序可能对序列号还有联网核对/激活次数/有效期校验——本地可逆 ≠ 完整可用,全链路验证前不下结论
数论与位运算陷阱组
- 模逆存在条件:
pow(a, -1, m)只在 gcd(a,m)=1 时有解——不互素时退化为穷举候选或换约束表述 - 32 位溢出是默认语义:反编译里的 32 位乘法/加法在 C 里按无符号溢出——python 实现必须
& 0xFFFFFFFF(或 0xFFFFFFFFFFFFFFFF),漏掩码是"差一位/偶对偶错"的高发原因 - 字节序与宽度:小端/大端、BYTE/WORD/DWORD/QWORD 混用(序列号分段处理常见)——struct 解包时逐段核对宽度
- 有符号陷阱:比较用有符号(jge/jg)而生成用无符号会错——看反编译跳转指令(jg/jge vs ja/jae)判断有符号性
- 进位与截断:中间进位被丢弃(8 位运算在 32 位寄存器)——逐行对照时注意每条指令的操作数宽度
- CRC 线性可构造:CRC16/32 是 GF(2) 线性映射——可反解"追加 N 字节使 CRC 等于目标值",不必暴力枚举;但 CRC 参与位置(数据前/后)决定解算方向
格式与规范化组
- 程序先规范化再比对:tolower/去空格/去分隔符/补零/截断到固定长度——生成器必须先做同样的规范化,否则算法对但输出被拒(对照 re-license 步骤 3 的比对代码逐字确认)
- 字符集含混:易混字符(0-O、1-I)常被排除;字符集判断错会让生成的序列号"看起来合法但程序不认"
- 分隔符多样性:程序可能同时接受带/不带分隔符、不同分隔符(- / 空格)——格式约束先列全,输出按需切换
- 校验位顺序反例:校验位可能参与下一轮计算(滚动校验),不是简单"数据位 + 尾部校验"——用已知合法序列号逐位回推校验过程确认顺序
验证方法组
- 调试器中间值对照是定位利器:断在比较指令处,记录程序内部中间值(寄存器/栈),与脚本中间值逐位比对——一次对照定位一步错位,比反复试错快
- 已知合法序列号是测试向量:程序已知合法的序列号回喂生成器脚本——输出不一致说明还原有误;一致才能进入沙箱全链路验证
- 启动通过 ≠ 完成:功能点/定时器/升级检查等第二校验点可能后续触发——按 re-license 全量校验点清单逐点验证
- 验证环境要记录:沙箱程序版本、校验点覆盖范围、操作系统差异(Wine vs 原生 Windows 行为可不同)——结论随环境标注
使用注意
- 生成与验证全部在沙箱内(re-sandbox,re-analyze/platform-tips 最高原则);产物只用于授权范围(自有软件/测试/研究),不提供具体软件破解流程
- 分析结论按 decision-tree 证据分级标注(A 全链路闭合 / B 自检闭合 / C 局部)