-
-
[原创] AIDA64 8.25.8200 Business 逆向工程与Keygen实战
-
发表于: 1天前 469
-
作为一个大二大学牲,最近给PC升级了散热,就想监控一下温度,但是在网上翻来覆去扒了好多论坛都没没有找到AIDA64今年2月24日最新版本Business的Keygen,只有一些固定分享的Key容易被AIDA64标记,那么能不能做到使用Keygen实现Business自由呢?下载了几个老版本,进去还有Illegal Copy牛皮癣警告膈应人。那么新版本AIDA64对安全性做了什么升级呢?
解包:AIDA64一如既往的使用标准UPX打包,直接使用upx -d aida64.exe即可将其解包为正常exe,接着放入IDA进行分析。
寻找序列号校验代码:我使用的是AIDA64 Portable版本,可以看到程序相同目录有一个Language目录,找到ulang_cn.txt并搜索序列号,这里会发现序列号的本地化对应为Product Key。
在IDA中搜索Product Key出现的全部位置。搜索到了这些字符串:
其中我们一眼看到The entered product key is invalid,这样我们就定位到了序列号校验窗口的代码,可以反编译并研究检查逻辑了。
首先,按F5进行反编译,往下稍微翻一点可以看到这样的逻辑:
可以看到,如果vars113是1,就说明序列号是无效的。而往上一看,(__int64)&vars113作为sub_108B440的out参数,说明这个函数进行了关键的校验逻辑,第一个参数应该就是序列号了。点开这个函数进行分析:
首先执行了v112 = a1,接着后面的一大串处理函数将字符串分别去除-、_和空格、0x00AD、0x00C2这几种符号,仅保留25字节,然后进一步规范化为全大写,最终到这个位置:
sub_4166D0(&varsB0, vars120, 1, 24); 把序列号的前24字节提取了出来,紧接着的v17 = sub_108B370(_0, varsB0);计算了一个变种CRC16,具体逻辑详见keygen(可以靠AI逆一下)。比较重要的是,sub_108B0B0(_0, &varsB8, v17 % 0x9987u)为什么是0x9987这个数字?是因为其将CRC结果变成了34进制的3位数来处理,0x9987-1是3位34进制数能表达的最大数,而字母表是一个常量DY14UF3RHWCXLQB6IKJT9N5AGS2PM8VZ7E: 
后面的
则是将这3字符中的第2个字符作为校验字符提取了出来,与序列号的最后一位对比。
在校验位后面,程序对输入的序列号搞了一大堆blacklist校验,我们先不看这一段(反正也不会用公开key了)我们主要看这一段: 
sub_108B270主要还是用刚才那个字母表把序列号以34进制转换成整数,其逻辑为:
而sub_4166D0(&vars70, vars120, 1, 2); 的后两个参数则是从第几位取几位数字,例如第一行是从23位取2个数字(也就是最后俩数),因为后面的时间运算需要seed,所以这里要先取出来。具体定义表:
先获取13 - 16 这一段
然后拆出来年月日:
IDA里看起来是这样:
可以比较明显的看出来,逻辑是:
可见:
也就是:
那么另外那些字段有什么用呢?后面可以看到一段校验:
所以我们构造的时候要让:
核对过前面的序列号后,因为我现在用的是Business,所以程序最后的校验就像这样: 
当产品ID是4的时候(不知道4是什么版本),要求3..4不能小于320,然后给了很大一坨候选,比较闲的人可以魔改keygen后自己试一试都有什么区别(3. 要求sub_1080250(*v113, *v115),这个函数比较小:
也就是说如果产品ID是1或4,必须 1 <= 序列号 <= 65534,其他ID则必须 1 <= 序列号 < 7774. 要求sub_1080290(vars142) && sub_10802C0(vars146),这两个函数我就不贴了,其要求1 <= 5..6, 7..8 <= 15,所以这两个数字在1-15之间就可以。
后面还比对了一大堆Blacklist序列号,以及ROG水冷、ROG主板专用序列号的检测,包含CROSSHAIR / MAXIMUS / RAMPAGE / ZENITH的视为ROG主板,所以看到了吗,STRIX最终还是不配了
Keygen已上传到附件
[培训]Windows内核深度攻防:从Hook技术到Rootkit实战!