国庆有一点点时间,把几个月前的工作记录一下。
我最讨厌是留下手尾给我的人,果断处理掉这个人。剩下的工作我花了 2 天处理完了。
就一个 从 内存 dump 出已经自解密后的程序,再从这个 解密后的程序中 逆向找到 注册码的算法 的小 任务,尽管原作用了多种加密手段、小技巧,但 API 的调用却隐藏得不好。
从网上随便下了个 IAT 表修复工具,发现功能不够强大,果断放弃了 dump 出解密后的内存程序,直接把 IDA append 到运行中的程序去逆向。
剩下的就是调试的艺术了
程序 启动后先通过 一个 windows 内核驱动程序去得 硬盘等等的 相关OEM码作为当前计算机的指纹去计算 机器码 MathCode,再从 MathCode 去计算 注册码 KeyCode
原来还想写一个 注册码的反向算法 直接算出注册码,但分析完后发现原作 用 大数求余 的计算空间太小了,就改为直接暴力碰撞破解。
# ./a.out 6N0VBB9B3
..............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................
FIND A KeyCode: L1SQBAAA868AAAAAAAAAAAAAAAAAAL
通过 暴力搜索的结果 发现有 很多 AAAA 说明只是 字典的最开头就已经碰撞成功了,就是因为原作的求余计算太小的 bug 加速了破解的速度。
哦,输入注册码后可以使用了,但在保存时出错,后面调试发现原作是在 保存前面输入的注册码时,会把这个注册码做一点小修改,对应的解决方法也 很简单,字典中不使用这些字符做碰撞就是了
在逆向的过程中发现了原作都用了很多类似这样的 障人耳目 的小技巧,像 优化过的 int64 求余算法,但 终归是一些消耗逆向者耐心的绕路而已。