国外软件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位 ***
输入用户名和注册码 ,点击注册,提示注册成功,重启程序,不再弹出烦人的注册对话框了!
至此,软件破解成功!
本来想写个注册机的,但是太懒了,下次吧~~~