首页
社区
课程
招聘
bxm的第5个CrackMe破解分析
2007-1-10 10:36 6062

bxm的第5个CrackMe破解分析

2007-1-10 10:36
6062

【文章标题】: bxm的第5个CrackMe破解分析
【文章作者】: netwind
【软件名称】: bxm的第5个CrackMe
【下载地址】: http://bbs.pediy.com/attachment.php?s=&attachmentid=3978
【作者声明】: 初学破解,有错误和疏漏之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
  用od载入crackme,然后下断点 bp MessageBox,按F9 执行,这时随便输入一个用户名,注册码就用默认的00000000,点注册程序中断在
  77d5050b这个地方,
  77D5050B >  8BFF            mov     edi, edi
  77D5050D    55              push    ebp
  77D5050E    8BEC            mov     ebp, esp
  77D50510    833D 1C04D777 0>cmp     dword ptr [77D7041C], 0
  。。。。。。。。
  
按ALT+F9(返回用户代码空间)这时程序弹出出错提示框 点确定,程序停在00401671这个地方。

0040166C   .  E8 B9050000   call    <jmp.&MFC42.#4224_CWnd::MessageBoxA>
  00401671   .  8B4C24 3C     mov     ecx, [esp+3C]

这时,我们就可以推断0040166C这个地方的call MessageBoxA就是调用错误提示框。
  顺着代码上下看看,有如下关键代码:

00401622   .  83F9 02       cmp     ecx, 2         ;判断用户名长度是否小于2
  00401625      73 21         jnb     short 00401648 ;小于2则错。
  00401627   .  50            push    eax
  00401628   .  50            push    eax
  00401629   .  68 48304000   push    00403048
  0040162E   .  8BCE          mov     ecx, esi
  00401630   .  E8 F5050000   call    <jmp.&MFC42.#4224_CWnd::MessageBoxA>
  00401635   .  8B4C24 3C     mov     ecx, [esp+3C]
  00401639   .  64:890D 00000>mov     fs:[0], ecx
  00401640   .  5F            pop     edi
  00401641   .  5E            pop     esi
  00401642   .  5D            pop     ebp
  00401643   .  5B            pop     ebx
  00401644   .  83C4 38       add     esp, 38
  00401647   .  C3            retn
  00401648   >  8B46 68       mov     eax, [esi+68]  ;取注册码第二部分就是第二个填充格里的内容
  0040164B   .  33DB          xor     ebx, ebx
  0040164D   .  3BC3          cmp     eax, ebx      
  0040164F      74 12         je      short 00401663 ;如果为0则出错。
  00401651   .  395E 70       cmp     [esi+70], ebx
  00401654      74 0D         je      short 00401663
  00401656   .  395E 78       cmp     [esi+78], ebx
  00401659      74 08         je      short 00401663
  0040165B   .  399E 80000000 cmp     [esi+80], ebx
  00401661      75 21         jnz     short 00401684 ;这段代码就是保证注册码偶数部分内容不为0,否则错。
  00401663   >  53            push    ebx
  00401664   .  53            push    ebx
  00401665   .  68 38304000   push    00403038
  0040166A   .  8BCE          mov     ecx, esi
  0040166C   .  E8 B9050000   call    <jmp.&MFC42.#4224_CWnd::MessageBoxA>
  00401671   .  8B4C24 3C     mov     ecx, [esp+3C]
  00401675   .  64:890D 00000>mov     fs:[0], ecx
  0040167C   .  5F            pop     edi
  0040167D   .  5E            pop     esi
  0040167E   .  5D            pop     ebp
  0040167F   .  5B            pop     ebx
  00401680   .  83C4 38       add     esp, 38
  00401683   .  C3            retn
  00401684   >  8D4C24 20     lea     ecx, [esp+20]  
  00401688   .  E8 E3020000   call    00401970
  0040168D   .  8D4C24 14     lea     ecx, [esp+14]
  00401691   .  895C24 44     mov     [esp+44], ebx
  00401695   .  E8 D6020000   call    00401970
  0040169A   .  8B6E 60       mov     ebp, [esi+60]
  0040169D   .  83C9 FF       or      ecx, FFFFFFFF
  004016A0   .  8BFD          mov     edi, ebp
  004016A2   .  33C0          xor     eax, eax
  004016A4   .  33D2          xor     edx, edx
  004016A6   .  C64424 44 01  mov     byte ptr [esp+44], 1
  004016AB   .  F2:AE         repne   scas byte ptr es:[edi]
  004016AD   .  F7D1          not     ecx
  004016AF   .  49            dec     ecx            //注册码长度
  004016B0   .  895C24 10     mov     [esp+10], ebx
  004016B4   .  74 31         je      short 004016E7
  004016B6   >  8BC2          mov     eax, edx        //循环开始
  004016B8   .  25 01000080   and     eax, 80000001
  004016BD   .  79 05         jns     short 004016C4
  004016BF   .  48            dec     eax
  004016C0   .  83C8 FE       or      eax, FFFFFFFE
  004016C3   .  40            inc     eax
  004016C4   >  74 0A         je      short 004016D0
  004016C6   .  0FBE0C2A      movsx   ecx, byte ptr [edx+ebp]
  004016CA   .  014C24 10     add     [esp+10], ecx
  004016CE   .  EB 06         jmp     short 004016D6
  004016D0   >  0FBE042A      movsx   eax, byte ptr [edx+ebp]
  004016D4   .  03D8          add     ebx, eax
  004016D6   >  8BFD          mov     edi, ebp
  004016D8   .  83C9 FF       or      ecx, FFFFFFFF
  004016DB   .  33C0          xor     eax, eax
  004016DD   .  42            inc     edx
  004016DE   .  F2:AE         repne   scas byte ptr es:[edi]
  004016E0   .  F7D1          not     ecx
  004016E2   .  49            dec     ecx
  004016E3   .  3BD1          cmp     edx, ecx
  004016E5   .^ 72 CF         jb      short 004016B6   //循环结束,分别计算用户名所有偶数位之和和寄数位之和。
  004016E7   >  8B4424 10     mov     eax, [esp+10]    //偶数位之和
  004016EB   .  8BEB          mov     ebp, ebx         //寄数位之和
  004016ED   .  8BF8          mov     edi, eax
  004016EF   .  83E3 0F       and     ebx, 0F         
  004016F2   .  C1FD 04       sar     ebp, 4
  004016F5   .  C1FF 04       sar     edi, 4
  004016F8   .  83E5 0F       and     ebp, 0F
  004016FB   .  83E7 0F       and     edi, 0F
  004016FE   .  83E0 0F       and     eax, 0F
  00401701   .  8BCD          mov     ecx, ebp
  00401703   .  8BD3          mov     edx, ebx
  00401705   .  0FAFC8        imul    ecx, eax
  00401708   .  0FAFD7        imul    edx, edi
  0040170B   .  3BD1          cmp     edx, ecx
  0040170D   .  894424 30     mov     [esp+30], eax
  00401711   .  75 01         jnz     short 00401714
  00401713   .  43            inc     ebx
  00401714   >  8B46 68       mov     eax, [esi+68] ;注册码第二部分
  00401717   .  8B4E 64       mov     ecx, [esi+64] ;注册码第一部分
  0040171A   .  50            push    eax
  0040171B   .  51            push    ecx
  0040171C   .  8D4C24 28     lea     ecx, [esp+28]
  00401720   .  E8 DB020000   call    00401A00                                   ;  交换注册码第一和第二部分在堆栈里的值
  00401725   .  8B56 70       mov     edx, [esi+70]
  00401728   .  8B46 6C       mov     eax, [esi+6C]
  0040172B   .  52            push    edx
  0040172C   .  50            push    eax
  0040172D   .  8D4C24 1C     lea     ecx, [esp+1C]
  00401731   .  E8 CA020000   call    00401A00                                   ;  交换注册码第三和第四字部分在堆栈里值
  00401736   .  57            push    edi
  00401737   .  8D4C24 24     lea     ecx, [esp+24]
  0040173B   .  E8 60020000   call    004019A0                                   ;  把注册码第一字部分乘以edi(用户名偶数位和16进制从右数第二位,若偶数和16进制为110,edi为1),放入0040187c
  00401740   .  8B4C24 30     mov     ecx, [esp+30]
  00401744   .  51            push    ecx
  00401745   .  8D4C24 18     lea     ecx, [esp+18]
  00401749   .  E8 52020000   call    004019A0                                   ; 把注册码第三部分乘以ecx(用户名偶数位和16进制从右数第一位,若偶数和16进制为110,ecx为0),放入00401868
  0040174E   .  8B5424 18     mov     edx, [esp+18]                              
  00401752   .  83EC 0C       sub     esp, 0C
  00401755   .  8BC4          mov     eax, esp
  00401757   .  896424 1C     mov     [esp+1C], esp
  0040175B   .  8950 04       mov     [eax+4], edx
  0040175E   .  8B4C24 28     mov     ecx, [esp+28]
  00401762   .  8948 08       mov     [eax+8], ecx
  00401765   .  8D4C24 2C     lea     ecx, [esp+2C]
  00401769   .  C700 40254000 mov     dword ptr [eax], 00402540
  0040176F   .  E8 3C020000   call    004019B0                                   ;(代码见下面)把00401868的值乘以注册码第二部分+注册码第四部分乘以0040187c的值放入堆栈12f878,把注册码第二部分乘以第四部分的内容放入堆栈12f87c
  00401774   .  8D4C24 20     lea     ecx, [esp+20]
  00401778   .  E8 63020000   call    004019E0                                   ;(代码见下面)当12f878的值同12f87c值相等eax 在call后才返回1
  0040177D   .  83F8 01       cmp     eax, 1
  00401780      0F85 61010000 jnz     004018E7                                   ; 第一部分算法完,若eax为1跳到正确地方。
  00401786   .  8B56 68       mov     edx, [esi+68]                              ;  注册码第二个字符
  00401789   .  8B46 64       mov     eax, [esi+64]                              ;  注册码第1个字符
  0040178C   .  52            push    edx
  0040178D   .  50            push    eax
  0040178E   .  8D4C24 28     lea     ecx, [esp+28]
  00401792   .  E8 69020000   call    00401A00                                   ;交换注册码第一和第二部分在堆栈里的值
  00401797   .  8B4E 70       mov     ecx, [esi+70]
  0040179A   .  8B56 6C       mov     edx, [esi+6C]
  0040179D   .  51            push    ecx
  0040179E   .  52            push    edx
  0040179F   .  8D4C24 1C     lea     ecx, [esp+1C]
  004017A3   .  E8 58020000   call    00401A00
  004017A8   .  55            push    ebp
  004017A9   .  8D4C24 24     lea     ecx, [esp+24]
  004017AD   .  E8 EE010000   call    004019A0                                  ;  把注册码第一字部分乘以ebp(用户名寄数位和16进制从右数第二位,若寄数和16进制为101,ebp为0),放入0040187c
  004017B2   .  53            push    ebx
  004017B3   .  8D4C24 18     lea     ecx, [esp+18]
  004017B7   .  E8 E4010000   call    004019A0                                  ;  把注册码第一字部分乘以ebx(用户名寄数位和16进制从右数第一位,若寄数和16进制为101,ebx为1),放入00401868
  004017BC   .  8B4C24 18     mov     ecx, [esp+18]
  004017C0   .  83EC 0C       sub     esp, 0C
  004017C3   .  8BC4          mov     eax, esp
  004017C5   .  896424 1C     mov     [esp+1C], esp
  004017C9   .  8948 04       mov     [eax+4], ecx
  004017CC   .  8B5424 28     mov     edx, [esp+28]
  004017D0   .  8D4C24 2C     lea     ecx, [esp+2C]
  004017D4   .  8950 08       mov     [eax+8], edx
  004017D7   .  C700 40254000 mov     dword ptr [eax], 00402540
  004017DD   .  E8 CE010000   call    004019B0                                   ;把00401868的值乘以注册码第二部分+注册码第四部分乘以0040187c的值放入堆栈12f878,把注册码第二部分乘以第四部分的内容放入堆栈12f87c   
  004017E2   .  8D4C24 20     lea     ecx, [esp+20]
  004017E6   .  E8 F5010000   call    004019E0                                   ;若堆栈12f878的值为0则eax返回0。
  004017EB   .  85C0          test    eax, eax
  004017ED      0F85 F4000000 jnz     004018E7                                   ; 第二部分算法完,若eax为0则正确跳转,它个第一部分算法完全一样,只是部分参数改变了
  004017F3   .  8B46 78       mov     eax, [esi+78]
  004017F6   .  8B4E 74       mov     ecx, [esi+74]
  004017F9   .  50            push    eax
  004017FA   .  51            push    ecx
  004017FB   .  8D4C24 28     lea     ecx, [esp+28]
  004017FF   .  E8 FC010000   call    00401A00
  00401804   .  8B96 80000000 mov     edx, [esi+80]
  0040180A   .  8B46 7C       mov     eax, [esi+7C]
  0040180D   .  52            push    edx
  0040180E   .  50            push    eax
  0040180F   .  8D4C24 1C     lea     ecx, [esp+1C]
  00401813   .  E8 E8010000   call    00401A00
  00401818   .  57            push    edi
  00401819   .  8D4C24 24     lea     ecx, [esp+24]
  0040181D   .  E8 7E010000   call    004019A0
  00401822   .  8B4C24 30     mov     ecx, [esp+30]
  00401826   .  51            push    ecx
  00401827   .  8D4C24 18     lea     ecx, [esp+18]
  0040182B   .  E8 70010000   call    004019A0
  00401830   .  8B5424 18     mov     edx, [esp+18]
  00401834   .  83EC 0C       sub     esp, 0C
  00401837   .  8BC4          mov     eax, esp
  00401839   .  896424 1C     mov     [esp+1C], esp
  0040183D   .  8950 04       mov     [eax+4], edx
  00401840   .  8B4C24 28     mov     ecx, [esp+28]
  00401844   .  8948 08       mov     [eax+8], ecx
  00401847   .  8D4C24 2C     lea     ecx, [esp+2C]
  0040184B   .  C700 40254000 mov     dword ptr [eax], 00402540
  00401851   .  E8 5A010000   call    004019B0
  00401856   .  8D4C24 20     lea     ecx, [esp+20]
  0040185A   .  E8 81010000   call    004019E0
  0040185F   .  85C0          test    eax, eax
  00401861      0F85 80000000 jnz     004018E7                                   ; eax为0跳到正确地方,第三部分算法完,跟第二部分完全相同,只是换了对注册码后四位运算。
  00401867   .  8B56 78       mov     edx, [esi+78]
  0040186A   .  8B46 74       mov     eax, [esi+74]
  0040186D   .  52            push    edx
  0040186E   .  50            push    eax
  0040186F   .  8D4C24 28     lea     ecx, [esp+28]
  00401873   .  E8 88010000   call    00401A00
  00401878   .  8B8E 80000000 mov     ecx, [esi+80]
  0040187E   .  8B56 7C       mov     edx, [esi+7C]
  00401881   .  51            push    ecx
  00401882   .  52            push    edx
  00401883   .  8D4C24 1C     lea     ecx, [esp+1C]
  00401887   .  E8 74010000   call    00401A00
  0040188C   .  55            push    ebp
  0040188D   .  8D4C24 24     lea     ecx, [esp+24]
  00401891   .  E8 0A010000   call    004019A0
  00401896   .  53            push    ebx
  00401897   .  8D4C24 18     lea     ecx, [esp+18]
  0040189B   .  E8 00010000   call    004019A0
  004018A0   .  8B4C24 18     mov     ecx, [esp+18]
  004018A4   .  83EC 0C       sub     esp, 0C
  004018A7   .  8BC4          mov     eax, esp
  004018A9   .  896424 1C     mov     [esp+1C], esp
  004018AD   .  8948 04       mov     [eax+4], ecx
  004018B0   .  8B5424 28     mov     edx, [esp+28]
  004018B4   .  8D4C24 2C     lea     ecx, [esp+2C]
  004018B8   .  8950 08       mov     [eax+8], edx
  004018BB   .  C700 40254000 mov     dword ptr [eax], 00402540
  004018C1   .  E8 EA000000   call    004019B0
  004018C6   .  8D4C24 20     lea     ecx, [esp+20]
  004018CA   .  E8 11010000   call    004019E0
  004018CF   .  83F8 01       cmp     eax, 1
  004018D2      75 13         jnz     short 004018E7                             ;  eax为1,跳到正确地方,第四部分算法完,与第一部分完全相同,注册码对后四位运算。
  004018D4   .  6A 00         push    0
  004018D6   .  68 30304000   push    00403030
  004018DB   .  68 20304000   push    00403020
  004018E0   .  8BCE          mov     ecx, esi
  004018E2   .  E8 43030000   call    <jmp.&MFC42.#4224_CWnd::MessageBoxA>       ;弹出正确提示框。
  004018E7   >  8D4C24 14     lea     ecx, [esp+14]
  004018EB   .  C64424 44 00  mov     byte ptr [esp+44], 0
  004018F0   .  E8 9B000000   call    00401990
  004018F5   .  8D4C24 20     lea     ecx, [esp+20]
  004018F9   .  C74424 44 FFF>mov     dword ptr [esp+44], -1
  00401901   .  E8 8A000000   call    00401990
  00401906   .  8B4C24 3C     mov     ecx, [esp+3C]
  0040190A   .  5F            pop     edi
  0040190B   .  5E            pop     esi
  0040190C   .  5D            pop     ebp
  0040190D   .  64:890D 00000>mov     fs:[0], ecx
  00401914   .  5B            pop     ebx
  00401915   .  83C4 38       add     esp, 38
  00401918   .  C3            retn
  
  
  004019A0和004019B0代码如下所示:
  
  
  004019A0  /$  8B4424 04     mov     eax, [esp+4]
  004019A4  |.  0FAF41 08     imul    eax, [ecx+8]                              
  004019A8  |.  8941 08       mov     [ecx+8], eax
  004019AB  \.  C2 0400       retn    4                                       ;  功能是做乘法运算。
  004019AE      90            nop
  004019AF      90            nop
  
  
  
  
  
  
  
  004019B0  /$  8B41 04       mov     eax, [ecx+4]                               ;  输入注册码的第二字符
  004019B3  |.  8B5424 08     mov     edx, [esp+8]                               ;  输入注册码的第四个字符
  004019B7  |.  56            push    esi
  004019B8  |.  57            push    edi
  004019B9  |.  8BF0          mov     esi, eax
  004019BB  |.  8BFA          mov     edi, edx
  004019BD  |.  0FAF7424 14   imul    esi, [esp+14]                              ;  把00401868的值乘以注册码第二部分
  004019C2  |.  0FAF79 08     imul    edi, [ecx+8]                               ;  注册码第四部分乘以0040187c的值
  004019C6  |.  0FAFC2        imul    eax, edx                                   ;前两部分算法时,注册码第二乘以第四部分。后面两部运算对应注册码第6乘以第8部分                                 
  004019C9  |.  03F7          add     esi, edi
  004019CB  |.  8941 04       mov     [ecx+4], eax
  004019CE  |.  8971 08       mov     [ecx+8], esi
  004019D1  |.  8D4C24 0C     lea     ecx, [esp+C]
  004019D5  |.  E8 B6FFFFFF   call    00401990
  004019DA  |.  5F            pop     edi
  004019DB  |.  5E            pop     esi
  004019DC  \.  C2 0C00       retn    0C
  
  004019E0算法代码如下:
  004019E0  /$  8B41 08       mov     eax, [ecx+8] //对应堆栈12f878里的值
  004019E3  |.  85C0          test    eax, eax
  004019E5  |.  75 01         jnz     short 004019E8  //若eax为0则返回。
  004019E7  |.  C3            retn
  004019E8  |>  2B41 04       sub     eax, [ecx+4]  //带借位减法 当eax与[ecx+4]相等运算完eax才为0,[eax+4]为12f87c的值,就是注册码第二部分乘以第四部分值
  004019EB  |.  F7D8          neg     eax
  004019ED  |.  1BC0          sbb     eax, eax
  004019EF  |.  83E0 02       and     eax, 2
  004019F2  |.  40            inc     eax
  004019F3  \.  C3            retn
  
  算法大概如下:
  用户名长度必须大于2,注册码偶数部分不能为0。
  设用户名寄数位和16进制为xyz,偶数位和为x1y1z1;
  设注册码为a-b-c-d-e-f-g-h
  那么可以列方程如下:
  第一部分算法:c*z1*b+d*y1*a=b*d
  第二部分算法:c*z*b+d*y*a=0
  第三部分算法:g*z1*f+d*y1*e=0
  第四部分算法:g*z*f+d*y*e=f*h
  
  剩下解方程了,我一开始默认为注册码每一部分都必须大于等于0的整数,我们就这样考虑。
  
  我们先看第一个方程,因为b,d都不为0那么方程左边必不为0也就是a,c不能同时为0;
  若a,c 都不为0,对于方程2,z,y必须同时为0 ,同理不满足方程四,因此a,c必有一个为0
  设c=0,a!=0,则y=0,y1!=0,e=0,g!=0.
  那么我们可以设定 xyz ,x1y1z1,abcdefgh如下:
  101,110,1-1-0-1-0-1-1-1.将其代入方程,验证成立。
  那么我们找到一字符串 其寄数位和16进制值为101,其偶数位和16进制值为110,比如05cm9n5然后注册码为1-1-0-1-0-1-1-1
  就达到目的了。
  
--------------------------------------------------------------------------------
【经验总结】
  方程里系数确定时总是搞混,于是我先用nftwind作为用户名,它偶数位和是14B,寄数位和是1AF,这两个值右边两位没相
  同字符就可以了,注册码用11111111,确定方程里的xyz,x1y1z1,然后把注册码换为01110111来确定方程里a,c,e,g,主要保
  证第1和3,5和7位不同就可以了。
  另外找到注册算法位置的方式,可能有更简单的方法,望高手指导
  这个算法分析可能走弯路,或有错误的地方也请批指导!
  
--------------------------------------------------------------------------------
【版权声明】: 本文原创于看雪技术论坛, 转载请注明作者并保持文章的完整, 谢谢!

                                                       2007年01月10日 10:33:28


[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

最后于 2020-7-8 15:10 被netwind编辑 ,原因:
收藏
免费 7
打赏
分享
最新回复 (8)
雪    币: 461
活跃值: (93)
能力值: ( LV9,RANK:1170 )
在线值:
发帖
回帖
粉丝
bxm 29 2007-1-10 12:27
2
0
楼主强啊,支持!
雪    币: 625
活跃值: (1072)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
xzchina 1 2007-1-10 13:45
3
0
厉害!
学习.!
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
beyondhkm 2007-1-10 13:53
4
0
牛人牛贴,菜学菜顶
雪    币: 8269
活跃值: (2855)
能力值: (RANK:520 )
在线值:
发帖
回帖
粉丝
netwind 13 2007-1-10 15:15
5
0
向 bxm大侠学习.上面分析有不正确的还希望指点批评!
能看到crackme代码就更好了 呵呵.

因为注册码允许负数,那么可以直接指定用户名,然后根据方程 1,2 可解得注册码前四部分,方程3,4可解得注册码后四部分.直接手工算还简单,写下面代码,可能画蛇添足了,只当练习.
本人不才,代码编码水平实在差劲,对算法认识也太少
做了个注册算法的的c代码,实际上也就是解方程的代码,
希望能起到抛专引玉的效果.
代码如下:
代码以netwind  为用户名 计算注册码
#include <stdio.h>
#include <string.h>
/*typedef struct res{
        int a[1000];
        int b[1000];
        int c[1000];
        int d[1000];
}result;
*/
void main()
{
        char name[]="netwind";
        int i=0;
        long num=0,num1=0;
        //result r1,r2;             //分别放注册码前四部分和后四部分;
        for(i;i<strlen(name);i+=2)
        {
                if(!name[i])break;
                num+=name[i];
                if(!name[i+1])break;
                num1+=name[i+1];
        }
        int x=num/256,y=(num/16)&0x00F,z=num&0x00F;
        int x1=num1/256,y1=(num1/16)&0x00F,z1=num1&0x00F;
    int a,b,c,d;
        int done1=0,done2=0;
        int j=0,k=0;
        a=b=c=d-100;
        for(i=0;i<2;i++)
        {
                for(;a<101;a++)
                {
                        b=-100;
                        for(;b<101;b++)
                        {
                                c=-100;
                                if(b==0)continue;
                                for(;c<101;c++)
                                {
                                        d=-100;
                                        for(;d<101;d++)
                                        {
                                                if(d==0)continue;
                                                if(done1==0)
                                                {
                                                        if(b*d==c*z1*b+d*y1*a)
                                                        {
                                                                if(c*z*b+d*y*a==0)
                                                                {
                                                                //        r1.a[j++]=a;
                                                                //        r1.b[j++]=b;
                                                                //        r1.c[j++]=c;
                                                                //        r1.d[j++]=d;
                                                                        printf("%d,%d,%d,%d\n",a,b,c,d);  //注册码前四部分
                                                                        done1=1;
                                                                        break;
                                                                }
                                                                else continue;
                                                        }
                                                        else continue;
                                                }
                                                if(done1==1)
                                                {
                                                        if(b*d==c*z*b+d*y*a)
                                                        {
                                                                if(c*z1*b+d*y1*a==0)
                                                                {
                                                                //        r2.a[k++]=a;
                                                                //        r2.b[k++]=b;
                                                                //        r2.c[k++]=c;
                                                                //        r2.d[k++]=d;
                                                                                printf("%d,%d,%d,%d\n",a,b,c,d); //注册码后四部分
                                                                        done2=1;
                                                                        break;
                                                                }
                                                                else continue;
                                                        }
                                                        else continue;
                                                       
                                                }
                                               
                                                if(done1==1&&done2==1)break;
                                        }
                                }
                                if(done1==1&&done2==1)break;
                        }
                        if(done1==1&&done2==1)break;
                }
        }
        //printf("%x,%x,%x\n%x,%x,%x\n",x,y,z,x1,y1,z1);
}
运行结果如下:

-36,96,-25,-100     //注册码前四部分

-25,-100,-10,100 //以下是注册码后四部分 任一组 配合前四部分都可用
-25,-100,-9,90
-25,-100,-8,80
-25,-100,-7,70
-25,-100,-6,60
-25,-100,-5,50
-25,-100,-4,40
-25,-100,-3,30
-25,-100,-2,20
-25,-100,-1,10
-25,-100,1,-10
-25,-100,2,-20
-25,-100,3,-30
-25,-100,4,-40
-25,-100,5,-50
-25,-100,6,-60
-25,-100,7,-70
-25,-100,8,-80
-25,-100,9,-90
-25,-100,10,-100
-25,-100,-10,100
-25,-100,-9,90
-25,-100,-8,80
-25,-100,-7,70
-25,-100,-6,60
-25,-100,-5,50
-25,-100,-4,40
-25,-100,-3,30
-25,-100,-2,20
-25,-100,-1,10
-25,-100,1,-10
-25,-100,2,-20
-25,-100,3,-30
-25,-100,4,-40
-25,-100,5,-50
-25,-100,6,-60
-25,-100,7,-70
-25,-100,8,-80
-25,-100,9,-90
-25,-100,10,-100
Press any key to continue

代码写得实在很差劲,n个 for 以消耗时间为代价,高手见笑了,望高手指点一二,给出最好的破解方法和注册机代码,谢谢!
雪    币: 461
活跃值: (93)
能力值: ( LV9,RANK:1170 )
在线值:
发帖
回帖
粉丝
bxm 29 2007-1-10 20:32
6
0
雪    币: 405
活跃值: (10)
能力值: ( LV9,RANK:1130 )
在线值:
发帖
回帖
粉丝
binbinbin 28 2007-1-13 10:50
7
0
多谢分享源码和分享分析
雪    币: 250
活跃值: (11)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
邪秀才 2 2007-1-13 11:41
8
0
厉害,学习一下
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
zcam 2007-1-15 20:26
9
0
学习学习~~~~
游客
登录 | 注册 方可回帖
返回