目标
样本是一个带机器码绑定的桌面程序,启动时弹窗要求输入授权码。目标是搞清楚它的校验逻辑,并在副本上验证。
第一步:定位
先用 strings 找可疑字符串,再用交叉引用回溯到校验函数。
strings -n 6 sample.exe | grep -iE 'license|serial|activate|机器码'
关键字命中后,在反汇编器里看引用它的代码,通常能看到一个明显的比较分支。
第二步:还原算法
校验一般由三部分组成:机器码归一化、哈希/异或运算、与用户输入比对。把这三段拆出来,就能写一个独立的验证脚本。
常见的坑
- 机器码可能被做了变形(大小写、分隔符、截断)
- 校验结果可能不是布尔值,而是一个派生密钥
- 有些程序会在多处重复校验
第三步:补丁表
在副本上打补丁,记录每一处的地址、原字节、改后字节和效果。
| 地址 | 原始字节 | 修改后 | 效果 |
|---|---|---|---|
| 0x00401A2C | 75 1E | 90 90 | 跳过失败跳转 |
| 0x00401B10 | E8 ... | B0 01 C3 | 校验函数直接返回真 |
第四步:验证
改动前备份原文件,改动后跑一遍完整流程,再执行回滚脚本确认哈希一致。
小结
逆向的核心不是工具,而是把「程序怎么判断」这件事拆成可验证的小步骤。