本帖最后由 MistHill 于 2014-3-19 17:53 编辑
也搞个开放注册,增加点儿娱乐性 。
原帖请参阅Peace的《庆开放,大叔的草莓CM20140314强势推出》。
昨天去拿来看了看,因为之前摆弄过《吾爱破解六周年小玩具-大叔的草莓CM20140313》,所以这次拣了个便宜。可见多参加活动好处大大的,而且Peace大笔一挥,我立马跻身于土豪的队列。
CM20140314与CM20140313相比,手法其实是一样的;只是之前的两个对称密码算法变化为哈希+对称密码算法的组合。
先玩个游戏,从界面的致谢名单来猜测一下各位参与的工作:
Kido应该是再次完成了加壳封装部分;
终于看到了L4Nce的乱序代码,虽然比较简单,但不失为很好的开始,希望能够坚持。那些带VM的商业产品如果没有乱序和膨胀,分分钟就会被人搞定。曾看过Nooby早期一篇这方面的文档,很有意思;
我是用户对算法比较熟,那个对称密码算法应该是在某标准算法的基础上进行的修改。
蒙得对不对,还请各位大人指教!玩逆向可以多一些连蒙带猜,有时可节省不少时间。
哈希算法这次直接用了API,在每一次哈希计算时按以下顺序调用函数:
[Asm] 纯文本查看 复制代码 advapi32.CryptAcquireContextA
advapi32.CryptCreateHash
advapi32.CryptHashData
advapi32.CryptGetHashParam
advapi32.CryptDestroyHash
advapi32.CryptReleaseContext
只用到了ALG_ID=CALG_MD2,即只计算MD2 Hash。主要用在:
- 序列号:先由硬盘信息计算出一个32位的Hash值,然后再计算它的MD2,得到序列号,显示给用户,并用于解密。
- 用户名哈希:将输入的用户名计算一个MD2,后面用作比较。
- 文件校验值的哈希:先计算原执行文件前0x0004A4AB字节的CRC32,转换为字符串"653359BB",计算MD2,用于解密。如果已脱壳,需要Patch这个CRC32。
- 原执行文件末尾有个字符串"1BCB4B",也计算了一个MD2。在004DE8D9处CALL 00405E3B将此MD2的字符串与文件校验值的MD2字符串进行比较,没搞明白是啥意思,感觉是忽悠,没管它。
下面简单说下注册算法。以下图为例:
用户名:MistHill
序列号:1A2C760693343C4C63F7B614E78EED70
注册码:AE48E3DA28AB50DFC0E4A4E552F806CCA47E756323107BF1154D2E538432F9DA
- 这里序列号就是硬件信息的哈希:1A2C760693343C4C63F7B614E78EED70。
- 文件校验值"653359BB"的哈希:c87fbc6084bc9715c5ffca0f879936c6。
- 两者作strcat,CRC_Hash + HWID_Hash:c87fbc6084bc9715c5ffca0f879936c61A2C760693343C4C63F7B614E78EED70。(请注意字符的大小写!)
- 用3.作为Key去解密输入的注册码。
- 用户名"MistHill"的哈希:6f92e73c9bc964301e9299789b692400。
- 将解密结果与用户名哈希作比较,若匹配则注册成功!
解密的地方在004B626C处:
[Asm] 纯文本查看 复制代码 ...
004B626A CC INT3
004B626B CC INT3
004B626C E8 7C04F5FF CALL 004066ED
stack:
0012F6BC 0012F6DC
0012F6DC 0016FAC8 ASCII "AE48E3DA28AB50DFC0E4A4E552F806CCA47E756323107BF1154D2E538432F9DA"
0012F6C0 0012F6E0
0012F6E0 0016F618 ASCII "c87fbc6084bc9715c5ffca0f879936c61A2C760693343C4C63F7B614E78EED70"
0012F6C4 00000001
004B6271 E9 03E10000 JMP 004C4379
004B6276 CC INT3
004B6277 CC INT3
...
004C4377 CC INT3
004C4378 CC INT3
004C4379 8945 D4 MOV DWORD PTR [EBP-0x2C], EAX
0012F6D8 001BAC48 ASCII "6f92e73c9bc964301e9299789b692400"
004C437C E9 F0B7FFFF JMP 004BFB71
004C4381 CC INT3
004C4382 CC INT3
...
你会注意到前后那些CC中孤立的两条指令CALL和JMP,这就是乱序搞的鬼。用[0012F6E0]去解密[0012F6DC],正确的解密结果返回在EAX,应该是一个ASCII字符串!
比较的地方在004B2A19处:
[Asm] 纯文本查看 复制代码 ...
004B2A17 CC INT3
004B2A18 CC INT3
004B2A19 E8 1D34F5FF CALL 00405E3B
stack:
0012F6C0 001BAC48 ASCII "6f92e73c9bc964301e9299789b692400"
0012F6C4 001BAD18 ASCII "6f92e73c9bc964301e9299789b692400"
004B2A1E E9 07DE0000 JMP 004C082A
004B2A23 CC INT3
004B2A24 CC INT3
...
栈上是两个要比较的字符串。这是注册码正确的情形,否则栈[0012F6C0]的指针不为字符串。
爆破点也选在这里!这个CM有点小问题:不检查用户名和注册码是否为空!你可以试试,在004B2A19处下个断点,F9,什么都不用输入,直接点“注 册”按钮,断下后Patch调用00405E3B的返回值为0,它会显示“注册成功”。
解密算法是个啥,没仔细看。感觉是在RC4的基础上改的,先将CRC_Hash+HWID_Hash复制4次,凑足0x100的长度(0x40 * 4),然后用它去初始化state[256],这点和RC4非常相象。最后解密注册码。
活动结束后请哪位大牛解释一下,让咱也学习学习!
注册机和源码就暂时不发了。也发不了,呵呵,还没写好呢!不过大家动作要快喔,不要让我抢先了!
说过免费提供注册码,有正确的东西分析起来方便一点:只要你给我用户名和序列号,我保证给出有效注册码!我现在是用Peace送给我的注册机{:1_912:} 。不应该哟,我并不领情!
先写这些吧,一个快餐文化充斥的社会,讲究速战速决。你要给他一份法式大餐让他悠闲地坐在那里慢慢品尝、享受,他反而不习惯。
怎么利用CM自身进行Keygen,请参阅我的前一篇帖子《【吾爱破解六周年小玩具-大叔的草莓】题解》,里面有提示!
19/03/2014 编辑
放出命令行的注册机。用法:
[Plain Text] 纯文本查看 复制代码 Keygen.exe 用户名 序列号
前面说过,那个加密/解密算法是修改过的RC4!这个比较坑爹。
找了个E的RC4模块来看了看,其将Password扩展为Key的部分和CM是一样的(不推荐,容易让人糊涂!),但KSA和PRGA仍然符合规范,与标准RC4的输出结果一致。
但这个CM的KSA和PRGA都被修改了。
如果是故意的,可以理解,意在增加Keygen的难度。因为RC4的算法很简单,可以容易地发现其区别。
如果不是有意的,那就…………。话就难听了,此处删掉数句——恕我直言!
注册机源码就不放出了,不规范的东西不应模仿!
|