|
好久没写破解文章,像BW所说'刀本来钝,现在还生锈了',再不用可能真不会破解了.这个软件是位朋友要求我帮忙破解,在精华III看到过它前面几个版本的破解过程,心里想应该不难.ok,开工干活..用Peid查出他是 ASProtect 1.2 的壳,脱壳后记得把2ce01的7434改为eb34,才可以运行,不过有个密码窗口出来,这方面我没再研究.请高手指点.. :0042DBEB E8D433FFFF call 00420FC4 //对假注册码进行比较和计算出三个数!!!! :0042DBF0 84C0 test al, al :0042DBF2 0F84A7000000 je 0042DC9F :0042DBF8 8B1500796400 mov edx, dword ptr [00647900] :0042DBFE 8B02 mov eax, dword ptr [edx] :0042DC00 8B9538FFFFFF mov edx, dword ptr [ebp+FFFFFF38] :0042DC06 E8C92DFFFF call 004209D4 //把注册名和序列号串起来计算出三个数!! :0042DC0B 84C0 test al, al :0042DC0D 0F848C000000 je 0042DC9F :0042DC13 EB04 jmp 0042DC19 :0042DC15 EB05 jmp 0042DC1C :0042DC17 8901 mov dword ptr [ecx], eax
* Referenced by a (U)nconditional or (C)onditional Jump at Address: |:0042DC13(U) | :0042DC19 8B8D34FFFFFF mov ecx, dword ptr [ebp+FFFFFF34] :0042DC1F 8B9538FFFFFF mov edx, dword ptr [ebp+FFFFFF38] :0042DC25 8B01 mov eax, dword ptr [ecx] :0042DC27 3B02 cmp eax, dword ptr [edx] //比较① :0042DC29 756E jne 0042DC99 :0042DC2B 8B8D34FFFFFF mov ecx, dword ptr [ebp+FFFFFF34] :0042DC31 8B9538FFFFFF mov edx, dword ptr [ebp+FFFFFF38] :0042DC37 8B4104 mov eax, dword ptr [ecx+04] :0042DC3A 3B4204 cmp eax, dword ptr [edx+04]//比较② :0042DC3D 755A jne 0042DC99 :0042DC3F 8B8D34FFFFFF mov ecx, dword ptr [ebp+FFFFFF34] :0042DC45 8B9538FFFFFF mov edx, dword ptr [ebp+FFFFFF38] :0042DC4B 8B4108 mov eax, dword ptr [ecx+08] :0042DC4E 3B4208 cmp eax, dword ptr [edx+08]//比较③ :0042DC51 7546 jne 0042DC99 :0042DC53 66C746109800 mov [esi+10], 0098 :0042DC59 BA33816300 mov edx, 00638133 :0042DC5E 8D45C4 lea eax, dword ptr [ebp-3C] :0042DC61 E8C66C1F00 call 0062492C :0042DC66 FF461C inc [esi+1C] :0042DC69 8B10 mov edx, dword ptr [eax] :0042DC6B A15C846400 mov eax, dword ptr [0064845C] :0042DC70 E8F3E21A00 call 005DBF68 :0042DC75 FF4E1C dec [esi+1C] :0042DC78 8D45C4 lea eax, dword ptr [ebp-3C] :0042DC7B BA02000000 mov edx, 00000002 :0042DC80 E81B6D1F00 call 006249A0 :0042DC85 8B8734030000 mov eax, dword ptr [edi+00000334] :0042DC8B 33D2 xor edx, edx :0042DC8D E8EADC1700 call 005AB97C :0042DC92 C687DC06000001 mov byte ptr [edi+000006DC], 01
* Referenced by a (U)nconditional or (C)onditional Jump at Addresses: |:0042DC29(C), :0042DC3D(C), :0042DC51(C) | :0042DC99 EB04 jmp 0042DC9F :0042DC9B EB05 jmp 0042DCA2 :0042DC9D 99 cdq :0042DC9E 018BC3E8624D add dword ptr [ebx+4D62E8C3], ecx :0042DCA4 17 pop ss :0042DCA5 00EB add bl, ch :0042DCA7 04EB add al, EB :0042DCA9 05890133D2 add eax, D2330189 :0042DCAE 33C9 xor ecx, ecx :0042DCB0 8997C0060000 mov dword ptr [edi+000006C0], edx :0042DCB6 898D3CFFFFFF mov dword ptr [ebp+FFFFFF3C], ecx :0042DCBC 80BFDC06000000 cmp byte ptr [edi+000006DC], 00 :0042DCC3 743E je 0042DD03 :0042DCC5 8B8534FFFFFF mov eax, dword ptr [ebp+FFFFFF34] :0042DCCB 8B8D38FFFFFF mov ecx, dword ptr [ebp+FFFFFF38] :0042DCD1 8B10 mov edx, dword ptr [eax] :0042DCD3 3B11 cmp edx, dword ptr [ecx]//比较④ :0042DCD5 752C jne 0042DD03 :0042DCD7 8B8534FFFFFF mov eax, dword ptr [ebp+FFFFFF34] :0042DCDD 8B8D38FFFFFF mov ecx, dword ptr [ebp+FFFFFF38] :0042DCE3 8B5004 mov edx, dword ptr [eax+04] :0042DCE6 3B5104 cmp edx, dword ptr [ecx+04]//比较⑤ :0042DCE9 7518 jne 0042DD03 :0042DCEB 8B8534FFFFFF mov eax, dword ptr [ebp+FFFFFF34] :0042DCF1 8B8D38FFFFFF mov ecx, dword ptr [ebp+FFFFFF38] :0042DCF7 8B5008 mov edx, dword ptr [eax+08] :0042DCFA 3B5108 cmp edx, dword ptr [ecx+08]//比较⑥ :0042DCFD 0F8440020000 je 0042DF43 ======================A===============================
上面通过六次比教其实只是三数值进行两次比较..这里不罗嗦了下面先进入假注册码的比较和计算过程看看.. ===================00420FC4 BEGIN======================
:00420FC4 53 push ebx :00420FC5 56 push esi :00420FC6 57 push edi :00420FC7 83C4E4 add esp, FFFFFFE4 :00420FCA 894C2404 mov dword ptr [esp+04], ecx :00420FCE 8BFA mov edi, edx :00420FD0 890424 mov dword ptr [esp], eax :00420FD3 8BC7 mov eax, edi :00420FD5 E882C61E00 call 0060D65C :00420FDA 83F80E cmp eax, 0000000E//比较假注册码为数是否14为 :00420FDD 750C jne 00420FEB :00420FDF 807F042D cmp byte ptr [edi+04], 2D//比较假注册码的第五位是否'-' :00420FE3 7506 jne 00420FEB :00420FE5 807F092D cmp byte ptr [edi+09], 2D//比较假注册码的第十位是否'-' :00420FE9 7407 je 00420FF2 从上面看出注册码的形式是:XXXX-XXXX-XXXX * Referenced by a (U)nconditional or (C)onditional Jump at Addresses: |:00420FDD(C), :00420FE3(C) | :00420FEB 33C0 xor eax, eax :00420FED E9E9000000 jmp 004210DB
* Referenced by a (U)nconditional or (C)onditional Jump at Address: |:00420FE9(C) | :00420FF2 33D2 xor edx, edx :00420FF4 8D442410 lea eax, dword ptr [esp+10] :00420FF8 89542408 mov dword ptr [esp+08], edx :00420FFC 89442418 mov dword ptr [esp+18], eax :00421000 33F6 xor esi, esi
* Referenced by a (U)nconditional or (C)onditional Jump at Address: |:00421082(C) | :00421002 8B542418 mov edx, dword ptr [esp+18] :00421006 66C7020000 mov word ptr [edx], 0000 :0042100B 33DB xor ebx, ebx :0042100D 8B442418 mov eax, dword ptr [esp+18] :00421011 8BD0 mov edx, eax
* Referenced by a (U)nconditional or (C)onditional Jump at Address: |:00421077(C) | :00421013 8D0CB6 lea ecx, dword ptr [esi+4*esi] :00421016 83C103 add ecx, 00000003 :00421019 2BCB sub ecx, ebx :0042101B 85DB test ebx, ebx :0042101D 8A040F mov al, byte ptr [edi+ecx] :00421020 7504 jne 00421026 :00421022 8844240C mov byte ptr [esp+0C], al
* Referenced by a (U)nconditional or (C)onditional Jump at Address: |:00421020(C) | :00421026 85DB test ebx, ebx :00421028 760A jbe 00421034 :0042102A 3A44240C cmp al, byte ptr [esp+0C] :0042102E 7504 jne 00421034 :00421030 FF442408 inc [esp+08]
* Referenced by a (U)nconditional or (C)onditional Jump at Addresses: |:00421028(C), :0042102E(C) | :00421034 3C30 cmp al, 30 :00421036 7204 jb 0042103C :00421038 3C46 cmp al, 46 :0042103A 7607 jbe 00421043
* Referenced by a (U)nconditional or (C)onditional Jump at Address: |:00421036(C) | :0042103C 33C0 xor eax, eax :0042103E E998000000 jmp 004210DB
* Referenced by a (U)nconditional or (C)onditional Jump at Address: |:0042103A(C) | :00421043 3C39 cmp al, 39 :00421045 760B jbe 00421052 :00421047 3C41 cmp al, 41 :00421049 7307 jnb 00421052 :0042104B 33C0 xor eax, eax :0042104D E989000000 jmp 004210DB
* Referenced by a (U)nconditional or (C)onditional Jump at Addresses: |:00421045(C), :00421049(C) | :00421052 3C41 cmp al, 41 :00421054 720B jb 00421061 :00421056 33C9 xor ecx, ecx :00421058 8AC8 mov cl, al :0042105A 83E937 sub ecx, 00000037 :0042105D 8BC1 mov eax, ecx :0042105F EB08 jmp 00421069
* Referenced by a (U)nconditional or (C)onditional Jump at Address: |:00421054(C) | :00421061 25FF000000 and eax, 000000FF :00421066 83E830 sub eax, 00000030
* Referenced by a (U)nconditional or (C)onditional Jump at Address: |:0042105F(U) | :00421069 8BCB mov ecx, ebx :0042106B C1E102 shl ecx, 02 :0042106E D3E0 shl eax, cl :00421070 660102 add word ptr [edx], ax :00421073 43 inc ebx :00421074 83FB04 cmp ebx, 00000004 :00421077 729A jb 00421013 :00421079 46 inc esi :0042107A 8344241802 add dword ptr [esp+18], 00000002 :0042107F 83FE03 cmp esi, 00000003 :00421082 0F827AFFFFFF jb 00421002 =============================================================
上面判断假注册码是否在0-9和A-Z范围,并把假注册码由ASCII转换成数字和字母存放,譬如假注册码为: 1234-6789-ABCD转换成34128967CDAB形式存放,.
:00421088 33DB xor ebx, ebx
* Referenced by a (U)nconditional or (C)onditional Jump at Address: |:004210A2(C) | :0042108A 6A06 push 00000006 :0042108C 8D442414 lea eax, dword ptr [esp+14] :00421090 50 push eax :00421091 8B542408 mov edx, dword ptr [esp+08] :00421095 52 push edx :00421096 E8ADFEFFFF call 00420F48//过程A :0042109B 83C40C add esp, 0000000C :0042109E 43 inc ebx :0042109F 83FB02 cmp ebx, 00000002 :004210A2 72E6 jb 0042108A ================================================================
把刚才的34128967CDAB分成六组A1=3412,A2=1289,A3=8967,A4=67CD,A5=CDAB,A6=AB34通过过程A换算,其算法如下: B1=((A1 SHL 1) AND $FFOO) SHR 8=68 B2=((A2 SHL 1) AND $FF00) SHR 8=25 B3=((A3 SHL 1) AND $FF00) SHR 8=12 B4=((A4 SHL 1) AND $FF00) SHR 8=CF B5=((A5 SHL 1) AND $FF00) SHR 8=9B B6=((A6 SHL 1) AND $FF00) SHR 8=56 然后将B1,B2,B3,B4,B5,B6在组成新六组数C1=6825,C2=2512,C3=12CF,C4=CF9B,C5=9B56在用过程A换算一次得出 D04A259F36AC ================================================================
:004210A4 33F6 xor esi, esi :004210A6 8B442404 mov eax, dword ptr [esp+04] :004210AA 8BD8 mov ebx, eax
* Referenced by a (U)nconditional or (C)onditional Jump at Address: |:004210CF(C) | :004210AC 8BD6 mov edx, esi :004210AE 03D2 add edx, edx :004210B0 8D442410 lea eax, dword ptr [esp+10] :004210B4 03D0 add edx, eax :004210B6 B902000000 mov ecx, 00000002 :004210BB 8B0424 mov eax, dword ptr [esp] :004210BE E8D10F0000 call 00422094 //将D04A259F36AC分成三组D1=D04A,D2=259F,D3=36AC进行换算,F8跟进.. :004210C3 0FB7D0 movzx edx, ax//将上面计算出来的数值保存 :004210C6 8913 mov dword ptr [ebx], edx :004210C8 46 inc esi :004210C9 83C304 add ebx, 00000004 :004210CC 83FE03 cmp esi, 00000003 :004210CF 72DB jb 004210AC :004210D1 33C0 xor eax, eax :004210D3 837C240808 cmp dword ptr [esp+08], 00000008 :004210D8 7701 ja 004210DB :004210DA 40 inc eax
* Referenced by a (U)nconditional or (C)onditional Jump at Addresses: |:00420FED(U), :0042103E(U), :0042104D(U), :004210D8(C) | :004210DB 83C41C add esp, 0000001C :004210DE 5F pop edi :004210DF 5E pop esi :004210E0 5B pop ebx :004210E1 C3 ret ======================00422094 BEGIN============================
:00422094 53 push ebx :00422095 56 push esi :00422096 57 push edi :00422097 83C494 add esp, FFFFFF94 :0042209A 8BF9 mov edi, ecx :0042209C 8BF2 mov esi, edx :0042209E 8BD8 mov ebx, eax :004220A0 54 push esp :004220A1 E816F4FFFF call 004214BC //初始化四个常数,A=$76543210,B=$FEDCBA98,C=$89ABCDEF,D=$01234567,看到这四个数是否很面熟,MD5??看清楚..不一样啊.. :004220A6 59 pop ecx :004220A7 57 push edi :004220A8 56 push esi :004220A9 8D442408 lea eax, dword ptr [esp+08] :004220AD 50 push eax :004220AE E835F4FFFF call 004214E8//初始化数组这和MD5一样.. :004220B3 83C40C add esp, 0000000C :004220B6 54 push esp :004220B7 8D54245C lea edx, dword ptr [esp+5C] :004220BB 52 push edx :004220BC E8BFF4FFFF call 00421580//这过过程我叫它为变形MD5,因为它所采用的数据和那四轮循环都和MD5一样,只是顺序变动..有兴趣的朋友可以进一步分析..这里分别将D1,D2,D3进行计算 :004220C1 83C408 add esp, 00000008 :004220C4 B910000000 mov ecx, 00000010 :004220C9 8BC3 mov eax, ebx :004220CB C644246800 mov [esp+68], 00 :004220D0 8D542458 lea edx, dword ptr [esp+58] :004220D4 E80BF0FFFF call 004210E4//将变形MD5计算出来的128BIT的数再进行计算,我叫这过程为过程B :004220D9 83C46C add esp, 0000006C :004220DC 5F pop edi :004220DD 5E pop esi :004220DE 5B pop ebx :004220DF C3 ret ==================00422094 END========================
通过过程B计算出来的三个数值将和注册名计算出来三个的数值比较..OK..假注册码的换算分析完毕下面简单说说注册名换算过程.. =============00420FC4 END===================注册名换算再过程004209D4完成,它的步骤大概如下:
1.将序列号换算,假设为11223344 2.将1122334400和注册名串起来,通过变形MD5和过程B计算出CODE1 3.将注册名和0011223344串起来,通过变形MD5和过程B计算出CODE2 4.将CODE1和CODE2串起来,通过变形MD5和过程B计算出CODE3 5.再将CODE1,CODE2,CODE3分别通过变形MD5和过程B计算出计算出三个数,这三个数就和假注册码计算出来的三个数进行比较... ========================================END=================================
这个软件是启动验证,所以这部分算法是在启动那里.在输入注册码那里主要的是分析序列号的换算过程..在拦截方面我开始也是'老鼠拉龟',后来得到DiKeN和PaulYoung的指点才找到方法,先用BPX GETCOMMANDLINEA,按3次F5,清除断点,再用BPC REGCREATEKEYEXA中断就可以到达上面...
ssljxOCG 2002.3.21 |
|