4.2 KiB
4.2 KiB
授权验证分析方法论坑与边界
定位误导组(最容易白忙)
- 字符串 xref 不是结论:命中"Invalid serial"的引用函数可能只是 UI 展示(弹窗封装),真校验在别处——每个候选都要动态断点确认"改分支是否改变行为",否则可能对着蜜罐/包装函数分析半天
- 伪校验与蜜罐:程序可故意提供"看起来像校验"的分支(改了就退出/无效果)把分析引偏——伪校验特征:改动后程序行为无任何变化;真校验特征:注册标志翻转、功能解锁
- 同一字符串多处引用:错误提示字符串常被多个校验点共用(封装函数)——逐个 xref 调用者,别只取第一个
- Wine 环境差异:Wine 下 RegQueryValueExW 行为与原生 Windows 有差异(注册表位置/返回值)——Wine 结论标注环境,必要时原生 Windows 复核
授权模型边界组
- 在线激活的"伪校验"陷阱:本地分支全改完程序仍锁死——真验证在服务器端;断网测试是第一道区分手段,本地"激活成功"响应可能只是缓存/离线回退(宽限期),到期后照样失效
- 订阅型当永久型处理:到期时间校验独立于序列号校验——只改序列号分支不解决过期;时间 API xref 与到期存储位置必须进清单
- 功能开关型校验点分散:freemium 的校验点散在各功能入口,启动校验只是其中之一——注册标志 xref 全覆盖,否则"绕过启动、功能仍锁"
- 浮动授权无本地算法:许可证服务器分发的授权,本地只有协议客户端——本地算法再完整也还原不出"服务器签发"的授权,转 re-protocol
- 宽限期反例:授权文件里的到期日期已过但程序仍可用 N 天(宽限逻辑)——宽限期是独立校验点(回退分支),改到期时间不一定立即生效,需同时处理回退逻辑
机器绑定与指纹组
- 指纹源多样性:卷序列号 / MachineGuid / 主机名 / 用户名 / 网卡 MAC / SMBIOS UUID 都可能参与——只查一个来源会漏(对照 re-crypto-keys 思路枚举读取点)
- 机器码"参与"不等于"绑定":API 存在不代表值进了校验运算——对照反编译数据流确认;只读不用的机器码 API 是常见误报源
- 绑定判断要动态确认:换机器码/改注册表值重跑程序,看序列号是否失效——行为验证比静态推断可靠
- 虚拟化环境指纹差异:VM 里的卷序列号/网卡特征与物理机不同——沙箱内验证绑定行为时,环境指纹变化可能干扰"绑定是否生效"的判断,先记录环境指纹基线
时间型校验组
- 时钟回拨检测:程序记录上次运行时间并检测"当前时间 < 记录"——直接改系统时间会触发防回拨报错;先定位检测点(上次时间存储 + 比较逻辑)再动时间
- 时间源不只墙钟:
GetSystemTimeAsFileTime/time()是墙钟;GetTickCount64/QPC 是开机计时——有的程序用双源交叉校验(墙钟 + 开机计时),只改系统时间会露馅 - 到期时间存储多种形态:注册表 / 授权文件 / 隐藏文件 / 校验和保护的存储——ProcMon/strace 看授权相关读写定位存储点
工具与环境组
- ProcMon 过滤授权路径:ProcMon 全量记录量大,先按进程 + 注册表路径(授权相关 key)过滤再分析,别在全量事件里捞
- 调试器修改时间/返回值要记录:动态验证里改过的时间与返回值是"环境干预",报告要注明——干预前后行为对比才有说服力
- 无符号调试的局限:PDB/符号缺失时注册标志与结构靠人工识别——用公开符号版本对照 + 行为验证双保险(见 re-kernel 同类思路)
使用注意
- 全部动态验证在沙箱内(re-sandbox,re-analyze/platform-tips 最高原则);授权绕过类操作只用于授权范围(自有软件/测试/研究),不提供具体软件破解流程
- 结论按 decision-tree 证据分级入档(re-analyze/analysis-contract):动态确认 A / 静态推断 B / 候选 C 分开标注,交付下游时级别透明