国外软件AVISplitter破解实例

软件名称:AVISplitter  大小:462KB  工具:PEID OD

昨天在网上下了个AVI分割的软件,共享版,一启动就弹出要注册的对话框,很烦,尝试破解之。
1、用PEID扫描:Microsoft Visual C++ 7.0,无壳,VC写的。
2、用OD载入,运行程序,弹出注册对话框,尝试输入用户名abcdef和密码123456789,点注册按钮,弹出错误提示:Registration failed!
3、根据提示,下断,来到下面的位置:
00405730    83EC 0C           sub esp,0C
00405733    55                push ebp
00405734    56                push esi
00405735    57                push edi
00405736    BF 01000000       mov edi,1
0040573B    57                push edi
0040573C    8BF1              mov esi,ecx
0040573E    E8 B6A70100       call AVISplit.0041FEF9
00405743    8B46 70           mov eax,dword ptr ds:[esi+70]   //注册码
00405746    8B68 F4           mov ebp,dword ptr ds:[eax-C]    //用户名长度
00405749    83FD 02           cmp ebp,2                                 //用户名长度是否大于2
0040574C    7D 15             jge short AVISplit.00405763
0040574E    6A 00             push 0
00405750    6A 00             push 0
00405752    68 6CD24200       push AVISplit.0042D26C                    ; ASCII “Please input correct User Name!”
00405757    E8 AB050200       call AVISplit.00425D07
0040575C    5F                pop edi
0040575D    5E                pop esi
0040575E    5D                pop ebp
0040575F    83C4 0C           add esp,0C
00405762    C3                retn
00405763    8B4E 74           mov ecx,dword ptr ds:[esi+74]
00405766    8379 F4 08        cmp dword ptr ds:[ecx-C],8       //注册码的长度是否大于8
0040576A    7D 15             jge short AVISplit.00405781
0040576C    6A 00             push 0
0040576E    6A 00             push 0
00405770    68 44D24200       push AVISplit.0042D244                    ; ASCII “Please input correct Registration Code!”
00405775    E8 8D050200       call AVISplit.00425D07

如果用户名长度大于等于2且注册码长度大于等于8,则来到下面的算法部分:
00405781    8B46 70           mov eax,dword ptr ds:[esi+70]  //输入的用户名
00405784    8B48 F4           mov ecx,dword ptr ds:[eax-C]   //用户名长度
00405787    85C9              test ecx,ecx
00405789    7D 0A             jge short AVISplit.00405795
0040578B    68 57000780       push 80070057
00405790    E8 8BC1FFFF       call AVISplit.00401920
00405795    8A10              mov dl,byte ptr ds:[eax]   //取用户名第一位
00405797    8B46 70           mov eax,dword ptr ds:[esi+70]
0040579A    3978 F4           cmp dword ptr ds:[eax-C],edi
0040579D    7D 0A             jge short AVISplit.004057A9
0040579F    68 57000780       push 80070057
004057A4    E8 77C1FFFF       call AVISplit.00401920
004057A9    8A40 01           mov al,byte ptr ds:[eax+1]   //取用户名第二位
004057AC    884424 0E         mov byte ptr ss:[esp+E],al   //保存第二位
004057B0    8B46 70           mov eax,dword ptr ds:[esi+70]
004057B3    8B48 F4           mov ecx,dword ptr ds:[eax-C]
004057B6    85C9              test ecx,ecx
004057B8    7D 0A             jge short AVISplit.004057C4
004057BA    68 57000780       push 80070057
004057BF    E8 5CC1FFFF       call AVISplit.00401920
004057C4    8B4E 70           mov ecx,dword ptr ds:[esi+70]
004057C7    53                push ebx
004057C8    8A18              mov bl,byte ptr ds:[eax]
004057CA    3979 F4           cmp dword ptr ds:[ecx-C],edi  //用户名长度是否小于1
004057CD    7D 0A             jge short AVISplit.004057D9
004057CF    68 57000780       push 80070057
004057D4    E8 47C1FFFF       call AVISplit.00401920
004057D9    0FB6C2            movzx eax,dl   //用户名第一位扩展到EAX
004057DC    83C8 53           or eax,53      //或53,得到73
004057DF    99                cdq                //扩展到EDX
004057E0    BF 0A000000       mov edi,0A
004057E5    F7FF              idiv edi          //除以0A  EAX=B  EDX=5
004057E7    0FB64424 12       movzx eax,byte ptr ss:[esp+12]   //取用户名第二位并扩展到EAX
004057EC    83C8 41           or eax,41       //或41  得到63
004057EF    885424 16         mov byte ptr ss:[esp+16],dl    
004057F3    99                cdq
004057F4    F7FF              idiv edi      //除以0A  EAX=9  EDX=9
004057F6    0FB6C3            movzx eax,bl   //用户名第一位扩展到EAX
004057F9    83C8 56           or eax,56    //或56 得到77
004057FC    885424 12         mov byte ptr ss:[esp+12],dl  //保存第二位第一次余数
00405800    99                cdq
00405801    F7FF              idiv edi  //除以0A  EAX=b  EDX=9 
00405803    0FB641 01         movzx eax,byte ptr ds:[ecx+1]  //用户名第二位扩展到EAX
00405807    83C8 49           or eax,49    //或49  得到6b
0040580A    8BCF              mov ecx,edi
0040580C    885424 17         mov byte ptr ss:[esp+17],dl   //保存第一位余数
00405810    99                cdq
00405811    F7F9              idiv ecx     //除以0A  EAX=9  EDX=7
00405813    33C0              xor eax,eax
00405815    33C9              xor ecx,ecx
00405817    85ED              test ebp,ebp
00405819    885424 18         mov byte ptr ss:[esp+18],dl   //保存第二位第二次余数
0040581D    7E 20             jle short AVISplit.0040583F
0040581F    90                nop
00405820    85C9              test ecx,ecx
00405822    0F8C D2000000     jl AVISplit.004058FA
00405828    8B7E 70           mov edi,dword ptr ds:[esi+70] //用户名
0040582B    3B4F F4           cmp ecx,dword ptr ds:[edi-C]  //用户名长度与0比较
0040582E    0F8F C6000000     jg AVISplit.004058FA
00405834    0FB6140F          movzx edx,byte ptr ds:[edi+ecx]   //用户名第一位
00405838    03C2              add eax,edx      //用户名ASSIC值累加
0040583A    41                inc ecx
0040583B    3BCD              cmp ecx,ebp
0040583D  ^ 7C E1             jl short AVISplit.00405820
0040583F    8B4E 74           mov ecx,dword ptr ds:[esi+74]  //注册码
00405842    8B51 F4           mov edx,dword ptr ds:[ecx-C]   //注册码长度
00405845    85D2              test edx,edx
00405847    7D 0A             jge short AVISplit.00405853
00405849    68 57000780       push 80070057
0040584E    E8 CDC0FFFF       call AVISplit.00401920
00405853    8A11              mov dl,byte ptr ds:[ecx]    //注册码第一位
00405855    8B4E 74           mov ecx,dword ptr ds:[esi+74]
00405858    8379 F4 01        cmp dword ptr ds:[ecx-C],1   //注册码长度是于大于等于1
0040585C    885424 19         mov byte ptr ss:[esp+19],dl
00405860    7D 0A             jge short AVISplit.0040586C
00405862    68 57000780       push 80070057
00405867    E8 B4C0FFFF       call AVISplit.00401920
0040586C    8A49 01           mov cl,byte ptr ds:[ecx+1]  //取注册码第二位
0040586F    8B7E 74           mov edi,dword ptr ds:[esi+74]   //EDI存放注册码
00405872    884C24 13         mov byte ptr ss:[esp+13],cl     //保存注册码第二位
00405876    837F F4 02        cmp dword ptr ds:[edi-C],2   //注册码长度是于大于等于2
0040587A    7D 0A             jge short AVISplit.00405886
0040587C    68 57000780       push 80070057
00405881    E8 9AC0FFFF       call AVISplit.00401920
00405886    8A4F 02           mov cl,byte ptr ds:[edi+2]    //取注册码第三位
00405889    8B7E 74           mov edi,dword ptr ds:[esi+74]
0040588C    884C24 14         mov byte ptr ss:[esp+14],cl  //保存注册码第三位
00405890    837F F4 03        cmp dword ptr ds:[edi-C],3   //注册码长度是于大于等于3
00405894    7D 0A             jge short AVISplit.004058A0
00405896    68 57000780       push 80070057
0040589B    E8 80C0FFFF       call AVISplit.00401920
004058A0    8A4F 03           mov cl,byte ptr ds:[edi+3]    //取注册码第四位
004058A3    8B7E 74           mov edi,dword ptr ds:[esi+74]
004058A6    884C24 15         mov byte ptr ss:[esp+15],cl   //保存注册码第四位
004058AA    837F F4 04        cmp dword ptr ds:[edi-C],4     //注册码长度是于大于等于4
004058AE    7D 0A             jge short AVISplit.004058BA
004058B0    68 57000780       push 80070057
004058B5    E8 66C0FFFF       call AVISplit.00401920
004058BA    8A4F 04           mov cl,byte ptr ds:[edi+4]       //取注册码第五位
004058BD    8B7E 74           mov edi,dword ptr ds:[esi+74]
004058C0    837F F4 05        cmp dword ptr ds:[edi-C],5    //注册码长度是于大于等于5
004058C4    7D 0A             jge short AVISplit.004058D0
004058C6    68 57000780       push 80070057
004058CB    E8 50C0FFFF       call AVISplit.00401920
004058D0    8A5F 05           mov bl,byte ptr ds:[edi+5]     //取注册码第6位
004058D3    8B7E 74           mov edi,dword ptr ds:[esi+74]
004058D6    885C24 1A         mov byte ptr ss:[esp+1A],bl     //保存注册码第6位
004058DA    837F F4 06        cmp dword ptr ds:[edi-C],6   //注册码长度是于大于等于6
004058DE    7D 0A             jge short AVISplit.004058EA
004058E0    68 57000780       push 80070057
004058E5    E8 36C0FFFF       call AVISplit.00401920
004058EA    8A5F 06           mov bl,byte ptr ds:[edi+6]      //取注册码第7位
004058ED    8B7E 74           mov edi,dword ptr ds:[esi+74]
004058F0    885C24 1B         mov byte ptr ss:[esp+1B],bl        //保存注册码第7位
004058F4    837F F4 07        cmp dword ptr ds:[edi-C],7    //注册码长度是于大于等于7
004058F8    7D 0A             jge short AVISplit.00405904
004058FA    68 57000780       push 80070057
004058FF    E8 1CC0FFFF       call AVISplit.00401920
00405904    8A5F 07           mov bl,byte ptr ds:[edi+7]         //取注册码第8位
00405907    0FB67C24 16       movzx edi,byte ptr ss:[esp+16]   //值为5
0040590C    0FB6D2            movzx edx,dl         //注册码第一位31
0040590F    83EA 30           sub edx,30             //减去30
00405912    3BFA              cmp edi,edx             //是否相等
00405914    75 48             jnz short AVISplit.0040595E   //不相等则跳
00405916    0FB65424 13       movzx edx,byte ptr ss:[esp+13]    //9
0040591B    0FB67C24 12       movzx edi,byte ptr ss:[esp+12]   //取注册码第二位
00405920    83EA 30           sub edx,30
00405923    3BFA              cmp edi,edx                  //不相等
00405925    75 37             jnz short AVISplit.0040595E
00405927    0FB65424 14       movzx edx,byte ptr ss:[esp+14]
0040592C    0FB67C24 17       movzx edi,byte ptr ss:[esp+17]
00405931    83EA 30           sub edx,30
00405934    3BFA              cmp edi,edx
00405936    75 26             jnz short AVISplit.0040595E
00405938    0FB65424 15       movzx edx,byte ptr ss:[esp+15]
0040593D    0FB67C24 18       movzx edi,byte ptr ss:[esp+18]
00405942    83EA 30           sub edx,30
00405945    3BFA              cmp edi,edx
00405947   /75 15             jnz short AVISplit.0040595E
00405949   |99                cdq            
0040594A   |BF 0A000000       mov edi,0A
0040594F   |F7FF              idiv edi     //用户名ASSIC值的和除以A   EAX=3b  EDX=7
00405951   |0FB6C2            movzx eax,dl     //余数到EAX
00405954   |0FB6D1            movzx edx,cl     //CL为注册码第五位
00405957   |83EA 30           sub edx,30  
0040595A   |3BC2              cmp eax,edx
0040595C   |74 3A             je short AVISplit.00405998      // 注册码第五位是用户名ASSIC和除A的余数
0040595E   \807C24 19 39      cmp byte ptr ss:[esp+19],39    //第1位是否为9
00405963    0F85 85000000     jnz AVISplit.004059EE
00405969    807C24 13 33      cmp byte ptr ss:[esp+13],33     //第2位是否为3
0040596E    75 7E             jnz short AVISplit.004059EE
00405970    8A5424 14         mov dl,byte ptr ss:[esp+14]
00405974    B0 38             mov al,38
00405976    3AD0              cmp dl,al                                            //第3位是否为8
00405978    75 74             jnz short AVISplit.004059EE
0040597A    384424 15         cmp byte ptr ss:[esp+15],al         //第4位是否为8
0040597E    75 6E             jnz short AVISplit.004059EE
00405980    80F9 33           cmp cl,33                           //第5位是否为3
00405983    75 69             jnz short AVISplit.004059EE
00405985    807C24 1A 31      cmp byte ptr ss:[esp+1A],31           //第6位是否为1
0040598A    75 62             jnz short AVISplit.004059EE
0040598C    807C24 1B 34      cmp byte ptr ss:[esp+1B],34              //第7位是否为4
00405991    75 5B             jnz short AVISplit.004059EE
00405993    80FB 36           cmp bl,36                                     //第8位是否为6
00405996    75 56             jnz short AVISplit.004059EE
00405998    6A 00             push 0                  //弹出注册成功对话框
0040599A    6A 00             push 0
0040599C    68 28D24200       push AVISplit.0042D228          ; ASCII “Registration has succeeded!”
004059A1    E8 61030200       call AVISplit.00425D07
004059A6    8B7E 70           mov edi,dword ptr ds:[esi+70]
004059A9    E8 502B0200       call AVISplit.004284FE
004059AE    8B40 04           mov eax,dword ptr ds:[eax+4]
004059B1    57                push edi
004059B2    68 00D14200       push AVISplit.0042D100                    ; ASCII “username”
004059B7    68 B0CC4200       push AVISplit.0042CCB0                    ; ASCII “Option”

总结:
    用户名长度必须大于等于2,注册码长度必须大于等于8.

第一种:
用户名任意
注册码:93883146   这个注册码可以说是万能注册码

第二种:

用户名只取前两位做二次或运算之后MOD 0xA,作为前4位值,取整个用户名的ASSIC和MOD 0xA,余数作为第5位,第6-8位值为任意

用户名:abcdef

注册码:59977000 

第1位(a or 53) % a   = 5
第2位(b or 41) % a   = 9
第3位(a or 56) % a   = 9
第4位(b or 49) % a   = 7
第5位(a+b+c+d+e+f) % a = 7
第6-8位  ***

输入用户名和注册码 ,点击注册,提示注册成功,重启程序,不再弹出烦人的注册对话框了!

至此,软件破解成功!

本来想写个注册机的,但是太懒了,下次吧~~~

相关推荐

发表评论

您的电子邮箱地址不会被公开。

QQ点我咨询