我的第一次SMC破解。原来它用的是SHA算法,比MD5都难破! (5千字)
【声明】我写文章以交流为主,希望大家在转载时能保持文章的完整性。(这一段是从ljttt那剽窃来的 8-))
【前言】
前天到白菜乐园闲逛,在论坛看到有人请求破解Folder Remarker,它可给电脑中的众多文件加上说明,象我们这种经常下载东西的人尤其用得着。于是马上架起jetcar把它装回家,抄起trw2000就剁,结果剁了半天竟然没剁开,只怪我软柿子捏多了,手上没劲,咳……。
【工具】
IDA4.04、trw2000、Uedit7.0
【破解方法】
SMC
【正文】
经过一下午的研究发现问题在Folderem.dll中,关键处在:
00406621 55 push ebp
00406622 8BEC mov ebp, esp
00406624 8B550C mov edx, dword ptr [ebp+0C]
00406627 8B4508 mov eax, dword ptr [ebp+08]
0040662A 8B08 mov ecx, dword ptr [eax]
0040662C 3B0A cmp ecx, dword ptr [edx]
0040662E 7522 jne 00406652
00406630 8B4804 mov ecx, dword ptr [eax+04]
00406633 3B4A04 cmp ecx, dword ptr [edx+04]
00406636 751A jne 00406652
00406638 8B4808 mov ecx, dword ptr [eax+08]
0040663B 3B4A08 cmp ecx, dword ptr [edx+08]
0040663E 7512 jne 00406652
00406640 8B480C mov ecx, dword ptr [eax+0C]
00406643 3B4A0C cmp ecx, dword ptr [edx+0C]
00406646 750A jne 00406652
00406648 8B4010 mov eax, dword ptr [eax+10]
0040664B 8B5210 mov edx, dword ptr [edx+10]
0040664E 3BC2 cmp eax, edx
00406650 7404 je 00406656
00406652 33C0 xor eax, eax
00406654 EB05 jmp 0040665B <-注意
00406656 B801000000 mov eax, 00000001
0040665B 5D pop ebp
0040665C C3 ret
上面的一些全是比较,如全对最后EAX就为1,可惜的是,正算法是看懂了,但逆算法却找不到(事实上,它用的是SHA算法,数论的高才生也搞不定,何况是我,不过如果谁对SHA算法感兴趣的话,可以分析它的原程序,由于太长我就不贴了)。没办法只有考虑暴破。暴破的话只要将EB05改为EB00就可以了,但用FI240一看,发现它是用ASPACK2.1加壳的,用UNASPACK1.0.9.1能脱,能反汇编(上面的就是脱后反汇编来的,要注意的是每次重启动WIN后地址66XX是不变的,但前面的0040会变,如可能是变为007D66XX),就是不能用(真可惜!)。对dll文件的手动脱壳我也不会,而且它是在WIN启动时加载的不知如何断下来(主要是我太菜!)。想来想去只有用SMC,可怜我从没用过,这次是被逼上梁山了!废话少说,马上烧香请出Crack宝典——看雪论坛精华。看了半天终于有了一些头绪,于是开始动手。
分析发现ASPACK2.1加壳的软件开始不久就有一长串的00,而且似乎没有用,不知它放在那干什么?(就等我来CRACK它?不会吧!)不过刚好放我的代码。
00419001 pusha
00419002 call sub_419579
00419007 jmp short loc_41903C
00419009 xchg ebx, ebx
0041900B nop
0041900C db 0 ; \
0041900D db 0 ; \
0041900E db 0 ; \好长一串00,
0041900F db 0 ; \刚好有用。
00419010 db 0 ; \
00419011 db 0 ; \
00419012 db 0 ; \
00419013 db 0 ; \
00419014 db 0 ; \
00419015 db 0 ; \
00419016 db 0 ; \
00419017 db 0 ; \
00419018 db 0 ; \
00419019 db 0 ; \
0041901A db 0 ; \
0041901B db 0 ; \
0041901C db 0 ; \
0041901D db 0 ; \
0041901E db 0 ; \
0041901F db 0 ; \
00419020 db 0 ; \
再看尾部:
004194DD mov eax, [ebp+443A0Eh]
004194E3 push eax
004194E4 add eax, [ebp+444798h]
004194EA pop ecx
004194EB or ecx, ecx
004194ED mov [ebp+443E3Bh], eax <-eax为返回地址
004194F3 popa <-到这儿就该去执行SMC代码了,而且不能
004194F4 jnz short loc_4194FE 先popa,不然eax的值就丢了。
004194F6 mov eax, 1
004194FB retn 0Ch
004194FE push 00000000 <-00的地址为[ebp+443E3Bh],执行4194ED一句后
00419503 retn 原来的00000000就变为了返回地址
还有一个问题,前面说到每次重启动WIN后,执行地址都不同,有7D66XX、16766XX等,而且不跟踪的话我也不知道那时eax到底是多少(是不知如何跟踪吧?),不过这也难不倒我,估计EAX的高4位和要修改的地址的高4位应该是一样的如007D、0167等,那我只要把它的低4位改为6654就可以了,这样两句汇编就可以办到了。
修改后反汇编如下:
头部
00419001 pusha
00419002 call sub_419579
00419007 jmp short loc_41903C
00419009 db 87h ;
0041900A db 0DBh ;
0041900B db 90h ;
0041900C and eax, FFFF0000h <-低4位清0
00419012 add eax, 6654h <-低4位变为6654
00419017 mov dword ptr [eax+0], 01B800EBh <-将EB05变为EB00
0041901E jmp loc_4194FD <-回到出口
尾部
004194E3 push eax
004194E4 add eax, [ebp+444798h]
004194EA pop ecx
004194EB or ecx, ecx
004194ED mov [ebp+443E3Bh], eax
004194F3 jmp loc_41900C <-去执行SMC代码
004194F8 db 0 ; \
004194F9 db 0 ; \ 这些没用
004194FA db 0 ; /
004194FB db 0C2h ; 0 /
004194FC db 0Ch ;
004194FD popa <-出口
004194FE push 00000000
00419503 retn
收工,试一下一切OK。(需要重启到DOS下,再用修改好的覆盖)
附:程序下载地址为http://www.newhua.com.cn/down/fldrmrkr.zip
hying[CCG] 2001.1.21
