-
-
CrackMe.happytown.VC.0029分析
-
发表于:
2006-11-14 22:12
8252
-
CrackMe.happytown.VC.0029分析
【文章作者】: aalloverred
【软件名称】: CrackMe.happytown.VC.0029
【下载地址】: http://bbs.pediy.com/showthread.php?s=&threadid=34166
【保护方式】: key
【使用工具】: olly,peid
【作者声明】: 呵呵,再捡个便宜!希望大家别拍砖。
--------------------------------------------------------------------------------
【详细过程】
1. peid->kanal,只得到一个大数。呵呵。然后载入到IDA中分析,分析到不少miracl函数,导出map文件。
2. 载入od,因为前面分析过happytown的其他crackme,轻车熟路地找到按钮处理过程,在401130处。
...
004011EF |. FFD7 CALL EDI ; \GetDlgItemTextA
004011F1 |. 83F8 02 CMP EAX,2
004011F4 |. 73 0D JNB SHORT <CrackMe_.401203> ; 用户名长度不能小于2
...
;然后和前面的crackme使用同样的方法的验证输入的注册码是否合法,即是否只包含数字和字母A-Z,然后就开始注册码了。
先是初始化一些常数:
00401271 |. E8 DA000000 CALL CrackMe_.00401350
...
00401350 /$ 8B4424 04 MOV EAX,DWORD PTR [ESP+4] ; sub_401350
00401354 |. 33C9 XOR ECX,ECX
00401356 |. C700 45670123 MOV DWORD PTR [EAX],23016745
0040135C |. C740 04 CDEF89>MOV DWORD PTR [EAX+4],AB89EFCD
00401363 |. C740 08 01BA32>MOV DWORD PTR [EAX+8],9832BA01
0040136A |. C740 0C 54FEDC>MOV DWORD PTR [EAX+C],76DCFE54
00401371 |. 83C0 10 ADD EAX,10
00401374 |. 8908 MOV DWORD PTR [EAX],ECX
00401376 |. 8948 04 MOV DWORD PTR [EAX+4],ECX
00401379 |. 8948 08 MOV DWORD PTR [EAX+8],ECX
0040137C |. 8948 0C MOV DWORD PTR [EAX+C],ECX
0040137F |. B8 01000000 MOV EAX,1
00401384 \. C3 RETN
...
然后是hash值的计算,happytown说过这是他自己设计的hash计算函数:
...
0040128B |. 51 PUSH ECX ; namelen
0040128C |. 8D8C24 B800000>LEA ECX,DWORD PTR [ESP+B8]
00401293 |. 51 PUSH ECX ; name
00401294 |. 52 PUSH EDX ; constants
00401295 |. E8 F6000000 CALL CrackMe_.00401390
0040129A |. 8D4424 3C LEA EAX,DWORD PTR [ESP+3C]
0040129E |. 8D4C24 24 LEA ECX,DWORD PTR [ESP+24]
004012A2 |. 50 PUSH EAX ; constants
004012A3 |. 51 PUSH ECX ; results?
004012A4 |. E8 B7010000 CALL <CrackMe_.sub_401460>
004012A9 |. 8B5424 28 MOV EDX,DWORD PTR [ESP+28]
004012AD |. 8D4424 2C LEA EAX,DWORD PTR [ESP+2C]
004012B1 |. 52 PUSH EDX
004012B2 |. 50 PUSH EAX ; results
004012B3 |. 6A 0A PUSH 0A
004012B5 |. E8 363F0000 CALL <CrackMe_.sub_4051F0> ; bytes_to_big
...
呵呵,虽然不是MD5,倒也很像是在MD5的底子上修改而成的。不表,直接进入验证过程,
...
004012E3 |. 56 PUSH ESI ; result
004012E4 |. 55 PUSH EBP ; mod:big="53AA4A5D47684616BD856ED3DB0F3899CDE3A052CE2B3011"
004012E5 |. 55 PUSH EBP
004012E6 |. 57 PUSH EDI ; cinstr(serial,IOBASE=16.)
004012E7 |. E8 542F0000 CALL <CrackMe_._powmod>
004012EC |. 83C4 4C ADD ESP,4C
004012EF |. 53 PUSH EBX ; big="A5DA242D7DD4EACD19819D83"
004012F0 |. 53 PUSH EBX
004012F1 |. 56 PUSH ESI ; powmod_result
004012F2 |. E8 49240000 CALL <CrackMe_._divide> ; esi=powmod_result mod "A5DA"
004012F7 |. 8B5424 1C MOV EDX,DWORD PTR [ESP+1C]
004012FB |. 56 PUSH ESI
004012FC |. 52 PUSH EDX
004012FD |. E8 BE180000 CALL <CrackMe_._compare>
...
有了IDA导出的map文件,这些代码意思很明了了。
令h=hash(name),a=53AA4A5D47684616BD856ED3DB0F3899CDE3A052CE2B3011,b=A5DA242D7DD4EACD19819D83.
k=key.
注册码的验证是这样:
m=k^a mod a(此处^代表k的a次幂)
if(m mod b=h)goodboy;//即就注册成功
需要注意的是h只取的是hash的前10个字节。
所以m=k^a mod a可以看作是RSA算法,使用RSATool可以获得D=2A20A60ECF7A78B4836B0D5D81B1E94CE16D7D6713D5124D,
我在分析的时候发现b是a的两个素因数之一,所以我就把上面两个式子化成了这样:
if(h=k^a mod a)goodboy;//即就注册成功
可是这样之后看了好长时间的数学书也没看出来该怎么解。太笨了,嘿!
不过还好几经周折后,我还是转了回来,m=k^a mod a可以作为RSA理解,所以只需要使用RSATool算出D后取直接m=h+b就
可以得到k了。经计算,D=2A20A60ECF7A78B4836B0D5D81B1E94CE16D7D6713D5124D。
所以注册机中计算k=m^D mod a就行了。因为最后算出来的k和a是一样长度的,最后的k还可以化为
k=k mod b(因为h=k^a mod a)。
后来才又发现因为参与计算的hash只有10字节,肯定小于大数b(12个字节),所以注册码的验证过程可以直接写为
h=k^a mod a//即就注册成功
//if(h mod b=h)goodboy;//因为h肯定小于b,这一步不再起作用。
即k=h^D mod a,这样又得到一个注册码,验证,成功。
这样想只是更直接,更进一步了。呵呵,最后结果是一样的。
OK,不多说了,其余的都见我的注册机好了。发在happytown的crackme0029的发起帖中了。
http://bbs.pediy.com/showthread.php?threadid=34166
--------------------------------------------------------------------------------
【经验总结】
关于算法,偶乃刚入门小菜一个,希望大家多多指点。
thanks to : zmworm, happytown, drizz...及论坛上的所有人.
--------------------------------------------------------------------------------
【版权声明】: 本文原创于看雪技术论坛, 转载请注明作者并保持文章的完整, 谢谢!
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课