【破文标题】:AVI Joiner 1.0.31 完整算法分析 + VC 注册机
【破文作者】:KuNgBiM[DFCG][BCG][SLT][NCPH]
【作者邮箱】:kungbim@163.com
【软件名称】:AVI Joiner 1.0.31
【软件大小】:410 KB
【软件语言】:英文
【软件类别】:国外软件 / 共享版 / 视频工具
【整理时间】:2006-01-01
【开 发 商】:http://www.brizsoft.com/
【下载地址】:http://nj.onlinedown.net/soft/22537.htm
【软件简介】:AVI 影片合并的工具软件 - AVI Joiner,是一款很容易操作的软件,它能够将多个 AVI 影片档案加以合并成
一个单一档案,如此对观看、烧录、传送给他人都更加的方便,您只要选择所要合并的AVI档案,再按下Joiner,一切就大功告成了。
【保护方式】:注册码 + 启动NAG + 功能限制
【编译语言】:Microsoft Visual C++ 7.0
【调试环境】:WinXP、PEiD、Ollydbg、Turbo C
【破解日期】:2006-01-01
【破解目的】:研究算法分析
【作者声明】:初学Crack,只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
—————————————————————————————————
【破解过程】:
侦测:用PEiD查壳,无壳,Microsoft Visual C++ 7.0 编译。
试探:运行主程序注册,输入试炼码,确认!程序提示:"Registration failed!"
对症下药:Ollydbg载入主程序,用查找字符串插件查找 "Registration failed!" 这个信息!双击来到 00407E95 处,向上来
到 00407BC0 处下断,F9运行,输入试炼信息:
************ 试炼信息 *************
User Name:KuNgBiM
Registration Code:9876543210
***********************************
00407BC0 55 push ebp ; 在这里F2设断,F9运行
00407BC1 8BEC mov ebp,esp
00407BC3 83EC 20 sub esp,20
00407BC6 894D E0 mov dword ptr ss:[ebp-20],ecx
00407BC9 6A 01 push 1
00407BCB 8B4D E0 mov ecx,dword ptr ss:[ebp-20]
00407BCE E8 68950100 call AVIJoine.0042113B
00407BD3 8B4D E0 mov ecx,dword ptr ss:[ebp-20]
00407BD6 83C1 70 add ecx,70
00407BD9 E8 F2F4FFFF call AVIJoine.004070D0 ; 取用户名长度
00407BDE 83F8 02 cmp eax,2 ; 是否大于或等于2位
00407BE1 7D 13 jge short AVIJoine.00407BF6 ; 是则继续下一步
00407BE3 6A 00 push 0
00407BE5 6A 00 push 0
00407BE7 68 64E54200 push AVIJoine.0042E564 ; ASCII "Please input correct User Name!"
00407BEC E8 54F00100 call AVIJoine.00426C45
00407BF1 E9 A9020000 jmp AVIJoine.00407E9F ; 返回程序,重新注册
00407BF6 8B4D E0 mov ecx,dword ptr ss:[ebp-20]
00407BF9 83C1 74 add ecx,74
00407BFC E8 CFF4FFFF call AVIJoine.004070D0 ; 取注册码长度
00407C01 83F8 08 cmp eax,8 ; 是否大于或等于8位
00407C04 7D 13 jge short AVIJoine.00407C19 ; 是则继续下一步
00407C06 6A 00 push 0
00407C08 6A 00 push 0
00407C0A 68 84E54200 push AVIJoine.0042E584 ; ASCII "Please input correct Registration Code!"
00407C0F E8 31F00100 call AVIJoine.00426C45
00407C14 E9 86020000 jmp AVIJoine.00407E9F ; 返回程序,重新注册
00407C19 6A 00 push 0 ; 算法初始化
00407C1B 8B4D E0 mov ecx,dword ptr ss:[ebp-20]
00407C1E 83C1 70 add ecx,70
00407C21 E8 CAECFFFF call AVIJoine.004068F0
00407C26 8845 EF mov byte ptr ss:[ebp-11],al ; 取用户名第一位字符ASCII值,al=4B ('K')
00407C29 6A 01 push 1
00407C2B 8B4D E0 mov ecx,dword ptr ss:[ebp-20]
00407C2E 83C1 70 add ecx,70
00407C31 E8 BAECFFFF call AVIJoine.004068F0
00407C36 8845 F8 mov byte ptr ss:[ebp-8],al ; 取用户名第二位字符ASCII值,al=75 ('u')
00407C39 6A 00 push 0
00407C3B 8B4D E0 mov ecx,dword ptr ss:[ebp-20]
00407C3E 83C1 70 add ecx,70
00407C41 E8 AAECFFFF call AVIJoine.004068F0
00407C46 8845 FF mov byte ptr ss:[ebp-1],al ; 再次取用户名第一位字符ASCII值,al=4B ('K')
00407C49 6A 01 push 1
00407C4B 8B4D E0 mov ecx,dword ptr ss:[ebp-20]
00407C4E 83C1 70 add ecx,70
00407C51 E8 9AECFFFF call AVIJoine.004068F0
00407C56 8845 FA mov byte ptr ss:[ebp-6],al ; 再次取用户名第二位字符ASCII值,al=75 ('u')
00407C59 0FB645 EF movzx eax,byte ptr ss:[ebp-11] ; 第一个字符(K)送到EAX里
00407C5D 83C8 41 or eax,41 ; EAX=EAX or 0x41
00407C60 8845 EF mov byte ptr ss:[ebp-11],al ; 把第一次或运算结果先保存起来
00407C63 0FB64D F8 movzx ecx,byte ptr ss:[ebp-8] ; 第二个字符(u)送到ECX里
00407C67 83C9 56 or ecx,56 ; ECX=ECX or 0x56
00407C6A 884D F8 mov byte ptr ss:[ebp-8],cl ; 把第二次或运算结果先保存起来
00407C6D 0FB655 FF movzx edx,byte ptr ss:[ebp-1] ; 再次把第一个字符(K)送到EDX里
00407C71 83CA 49 or edx,49 ; EDX=EDX or 0x49
00407C74 8855 FF mov byte ptr ss:[ebp-1],dl ; 把第三次或运算结果先保存起来
00407C77 0FB645 FA movzx eax,byte ptr ss:[ebp-6] ; 再次把第二个字符(u)送到EAX里
00407C7B 83C8 4A or eax,4A ; EAX=EAX or 0x4A
00407C7E 8845 FA mov byte ptr ss:[ebp-6],al ; 把第四次或运算结果先保存起来
00407C81 0FB645 EF movzx eax,byte ptr ss:[ebp-11] ; 把第一次或运算结果送到EAX里
00407C85 99 cdq
00407C86 B9 0A000000 mov ecx,0A
00407C8B F7F9 idiv ecx ; EAX=EAX mod ECX(0A),余数为5
00407C8D 8855 EF mov byte ptr ss:[ebp-11],dl
00407C90 0FB645 F8 movzx eax,byte ptr ss:[ebp-8] ; 把第二次或运算结果送到EAX里
00407C94 99 cdq
00407C95 B9 0A000000 mov ecx,0A
00407C9A F7F9 idiv ecx ; EAX=EAX mod ECX(0A),余数为9
00407C9C 8855 F8 mov byte ptr ss:[ebp-8],dl
00407C9F 0FB645 FF movzx eax,byte ptr ss:[ebp-1] ; 把第三次或运算结果送到EAX里
00407CA3 99 cdq
00407CA4 B9 0A000000 mov ecx,0A
00407CA9 F7F9 idiv ecx ; EAX=EAX mod ECX(0A),余数为5
00407CAB 8855 FF mov byte ptr ss:[ebp-1],dl
00407CAE 0FB645 FA movzx eax,byte ptr ss:[ebp-6] ; 把第四次或运算结果送到EAX里
00407CB2 99 cdq
00407CB3 B9 0A000000 mov ecx,0A
00407CB8 F7F9 idiv ecx ; EAX=EAX mod ECX(0A),余数为7
00407CBA 8855 FA mov byte ptr ss:[ebp-6],dl
00407CBD C745 F0 0000000>mov dword ptr ss:[ebp-10],0
00407CC4 C745 E8 0000000>mov dword ptr ss:[ebp-18],0
00407CCB EB 09 jmp short AVIJoine.00407CD6
00407CCD 8B55 E8 mov edx,dword ptr ss:[ebp-18] ; 循环点
00407CD0 83C2 01 add edx,1
00407CD3 8955 E8 mov dword ptr ss:[ebp-18],edx
00407CD6 8B4D E0 mov ecx,dword ptr ss:[ebp-20]
00407CD9 83C1 70 add ecx,70
00407CDC E8 EFF3FFFF call AVIJoine.004070D0 ; 检查注册码长度,并累加用户名的ASCII值
00407CE1 3945 E8 cmp dword ptr ss:[ebp-18],eax
00407CE4 7D 1E jge short AVIJoine.00407D04
00407CE6 8B45 E8 mov eax,dword ptr ss:[ebp-18]
00407CE9 50 push eax
00407CEA 8B4D E0 mov ecx,dword ptr ss:[ebp-20]
00407CED 83C1 70 add ecx,70
00407CF0 E8 FBEBFFFF call AVIJoine.004068F0
00407CF5 8845 E7 mov byte ptr ss:[ebp-19],al
00407CF8 0FB64D E7 movzx ecx,byte ptr ss:[ebp-19]
00407CFC 034D F0 add ecx,dword ptr ss:[ebp-10]
00407CFF 894D F0 mov dword ptr ss:[ebp-10],ecx
00407D02 ^ EB C9 jmp short AVIJoine.00407CCD ; 循环检查用户名
00407D04 8B45 F0 mov eax,dword ptr ss:[ebp-10] ; 这部分是用户名的ASCII累加值(即:KuNgBiM-->EAX=0x26D)
00407D07 99 cdq
00407D08 B9 0A000000 mov ecx,0A
00407D0D F7F9 idiv ecx ; EAX=EAX mod ECX(0A),余数为1
00407D0F 8855 F4 mov byte ptr ss:[ebp-C],dl
00407D12 6A 00 push 0
00407D14 8B4D E0 mov ecx,dword ptr ss:[ebp-20]
00407D17 83C1 74 add ecx,74
00407D1A E8 D1EBFFFF call AVIJoine.004068F0
00407D1F 8845 FC mov byte ptr ss:[ebp-4],al ; 取假注册码第一位ASCII值,al=39 ('9')
00407D22 6A 01 push 1
00407D24 8B4D E0 mov ecx,dword ptr ss:[ebp-20]
00407D27 83C1 74 add ecx,74
00407D2A E8 C1EBFFFF call AVIJoine.004068F0
00407D2F 8845 FD mov byte ptr ss:[ebp-3],al ; 取假注册码第二位ASCII值,al=38 ('8')
00407D32 6A 02 push 2
00407D34 8B4D E0 mov ecx,dword ptr ss:[ebp-20]
00407D37 83C1 74 add ecx,74
00407D3A E8 B1EBFFFF call AVIJoine.004068F0
00407D3F 8845 F6 mov byte ptr ss:[ebp-A],al ; 取假注册码第三位ASCII值,al=37 ('7')
00407D42 6A 03 push 3
00407D44 8B4D E0 mov ecx,dword ptr ss:[ebp-20]
00407D47 83C1 74 add ecx,74
00407D4A E8 A1EBFFFF call AVIJoine.004068F0
00407D4F 8845 F5 mov byte ptr ss:[ebp-B],al ; 取假注册码第四位ASCII值,al=36 ('6')
00407D52 6A 04 push 4
00407D54 8B4D E0 mov ecx,dword ptr ss:[ebp-20]
00407D57 83C1 74 add ecx,74
00407D5A E8 91EBFFFF call AVIJoine.004068F0
00407D5F 8845 F9 mov byte ptr ss:[ebp-7],al ; 取假注册码第五位ASCII值,al=35 ('5')
00407D62 6A 05 push 5
00407D64 8B4D E0 mov ecx,dword ptr ss:[ebp-20]
00407D67 83C1 74 add ecx,74
00407D6A E8 81EBFFFF call AVIJoine.004068F0
00407D6F 8845 F7 mov byte ptr ss:[ebp-9],al ; 取假注册码第六位ASCII值,al=34 ('4')
00407D72 6A 06 push 6
00407D74 8B4D E0 mov ecx,dword ptr ss:[ebp-20]
00407D77 83C1 74 add ecx,74
00407D7A E8 71EBFFFF call AVIJoine.004068F0
00407D7F 8845 FE mov byte ptr ss:[ebp-2],al ; 取假注册码第七位ASCII值,al=33 ('3')
00407D82 6A 07 push 7
00407D84 8B4D E0 mov ecx,dword ptr ss:[ebp-20]
00407D87 83C1 74 add ecx,74
00407D8A E8 61EBFFFF call AVIJoine.004068F0
00407D8F 8845 FB mov byte ptr ss:[ebp-5],al ; 取假注册码最后一位(第八位)ASCII值,al=32 ('2')
00407D92 0FB655 EF movzx edx,byte ptr ss:[ebp-11]
00407D96 0FB645 FC movzx eax,byte ptr ss:[ebp-4]
00407D9A 83E8 30 sub eax,30
00407D9D 3BD0 cmp edx,eax
00407D9F 75 3C jnz short AVIJoine.00407DDD ; 若第一位不是“5”则跳死!★爆破点A★
00407DA1 0FB64D F8 movzx ecx,byte ptr ss:[ebp-8] ; 判断假注册码的第五位,余数是否为1,不是则OVER了
00407DA5 0FB655 FD movzx edx,byte ptr ss:[ebp-3]
00407DA9 83EA 30 sub edx,30
00407DAC 3BCA cmp ecx,edx
00407DAE 75 2D jnz short AVIJoine.00407DDD ; 若第二位不是“9”则跳死!★爆破点B★
00407DB0 0FB645 FF movzx eax,byte ptr ss:[ebp-1]
00407DB4 0FB64D F6 movzx ecx,byte ptr ss:[ebp-A]
00407DB8 83E9 30 sub ecx,30
00407DBB 3BC1 cmp eax,ecx
00407DBD 75 1E jnz short AVIJoine.00407DDD ; 若第三位不是“5”则跳死!★爆破点C★
00407DBF 0FB655 FA movzx edx,byte ptr ss:[ebp-6]
00407DC3 0FB645 F5 movzx eax,byte ptr ss:[ebp-B]
00407DC7 83E8 30 sub eax,30
00407DCA 3BD0 cmp edx,eax
00407DCC 75 0F jnz short AVIJoine.00407DDD ; 若第四位不是“7”则跳死!★爆破点D★
00407DCE 0FB64D F4 movzx ecx,byte ptr ss:[ebp-C] ; 判断假注册码的第五位,余数是否为1,不是则OVER了
00407DD2 0FB655 F9 movzx edx,byte ptr ss:[ebp-7]
00407DD6 83EA 30 sub edx,30
00407DD9 3BCA cmp ecx,edx
00407DDB 74 58 je short AVIJoine.00407E35 ; 跳向成功!★验证爆破点E★
00407DDD 0FB645 FC movzx eax,byte ptr ss:[ebp-4] ; 【注册码验证黑名单】满足条件则挂!!
00407DE1 83F8 39 cmp eax,39 ; 第一位为“9”
00407DE4 0F85 A7000000 jnz AVIJoine.00407E91
00407DEA 0FB64D FD movzx ecx,byte ptr ss:[ebp-3]
00407DEE 83F9 33 cmp ecx,33 ; 第二位为“3”
00407DF1 0F85 9A000000 jnz AVIJoine.00407E91
00407DF7 0FB655 F6 movzx edx,byte ptr ss:[ebp-A]
00407DFB 83FA 30 cmp edx,30 ; 第三位为“0”
00407DFE 0F85 8D000000 jnz AVIJoine.00407E91
00407E04 0FB645 F5 movzx eax,byte ptr ss:[ebp-B]
00407E08 83F8 32 cmp eax,32 ; 第四位为“2”
00407E0B 0F85 80000000 jnz AVIJoine.00407E91
00407E11 0FB64D F9 movzx ecx,byte ptr ss:[ebp-7]
00407E15 83F9 33 cmp ecx,33 ; 第五位为“3”
00407E18 75 77 jnz short AVIJoine.00407E91
00407E1A 0FB655 F7 movzx edx,byte ptr ss:[ebp-9]
00407E1E 83FA 31 cmp edx,31 ; 第六位为“1”
00407E21 75 6E jnz short AVIJoine.00407E91
00407E23 0FB645 FE movzx eax,byte ptr ss:[ebp-2]
00407E27 83F8 34 cmp eax,34 ; 第七位为“4”
00407E2A 75 65 jnz short AVIJoine.00407E91
00407E2C 0FB64D FB movzx ecx,byte ptr ss:[ebp-5]
00407E30 83F9 37 cmp ecx,37 ; 第八位为“7”
00407E33 75 5C jnz short AVIJoine.00407E91
00407E35 6A 00 push 0 ; 注册成功
00407E37 6A 00 push 0
00407E39 68 ACE54200 push AVIJoine.0042E5AC ; ASCII "Registration has succeeded!"
00407E3E E8 02EE0100 call AVIJoine.00426C45
00407E43 8B4D E0 mov ecx,dword ptr ss:[ebp-20]
00407E46 83C1 70 add ecx,70
00407E49 E8 A2F6FFFF call AVIJoine.004074F0
00407E4E 50 push eax ; 用户名写入注册表
00407E4F 68 C8E54200 push AVIJoine.0042E5C8 ; ASCII "username"
00407E54 68 D4E54200 push AVIJoine.0042E5D4 ; ASCII "Option"
00407E59 E8 E2ECFFFF call AVIJoine.00406B40
00407E5E 8BC8 mov ecx,eax
00407E60 E8 1CEF0100 call AVIJoine.00426D81
00407E65 8B4D E0 mov ecx,dword ptr ss:[ebp-20]
00407E68 83C1 74 add ecx,74
00407E6B E8 80F6FFFF call AVIJoine.004074F0
00407E70 50 push eax ; 注册码写入注册表
00407E71 68 DCE54200 push AVIJoine.0042E5DC ; ASCII "registration_code"
00407E76 68 F0E54200 push AVIJoine.0042E5F0 ; ASCII "Option"
00407E7B E8 C0ECFFFF call AVIJoine.00406B40
00407E80 8BC8 mov ecx,eax
00407E82 E8 FAEE0100 call AVIJoine.00426D81
00407E87 8B4D E0 mov ecx,dword ptr ss:[ebp-20]
00407E8A E8 607C0100 call AVIJoine.0041FAEF
00407E8F EB 0E jmp short AVIJoine.00407E9F
00407E91 6A 00 push 0 ; 注册失败
00407E93 6A 00 push 0
00407E95 68 F8E54200 push AVIJoine.0042E5F8 ; ASCII "Registration failed!"
00407E9A E8 A6ED0100 call AVIJoine.00426C45
00407E9F 8BE5 mov esp,ebp
00407EA1 5D pop ebp
00407EA2 C3 retn
........
-------------------------------------------------------------------------------------------
【算法总结】
注册验证非常简单:
1、注册码和用户名有关,长度必须大于等于2位。
2、注册码必须大于等于8位。
3、8位里只有前5位起作用,后面N位不参与计算。
【VC6注册机源码】
#include "stdio.h"
int main()
{ int i,n,n1,n2,n3,n4,n5=0;
char name[255]={0};
printf("////////////////////////////////////////////////////\n");
printf("// AVI Joiner 1.0.31 - KeyMaker //\n");
printf("// //\n");
printf("// Author: KuNgBiM[DFCG][BCG][SLT][NCPH] //\n");
printf("// //\n");
printf("// E-mail: kungbim@163.com //\n");
printf("// //\n");
printf("// OS : WinXP, PEiD, Ollydbg, Turbo C //\n");
printf("// //\n");
printf("// Date : 2006-01-01 //\n");
printf("// //\n");
printf("// :) Happy new years!!! :) //\n");
printf("////////////////////////////////////////////////////\n\n");
printf("Please Input User Name[User Name>= 2]: ");
scanf("%s",&name);
n=strlen(name);
for (i=0;i<n;i++)
n5+=name[i];
n5%=0xA;
n1=name[0]|0x41;
n1%=0xA;
n2=name[1]|0x56;
n2%=0xA;
n3=name[0]|0x49;
n3%=0xA;
n4=name[1]|0x4A;
n4%=0xA;
printf("\nYour Registration Code is : %d%d%d%d%d888",n1,n2,n3,n4,n5);
return 0;
}
============================================================================================
【注册信息】:
User Name:KuNgBiM
Registration Code:59571888
--------------------------------------------------------------------------------------------------------
版权所有(C)2006 KuNgBiM[DFCG][BCG][SLT][NCPH] Copyright (C) 2006 KuNgBiM[DFCG][BCG][SLT][NCPH]
--------------------------------------------------------------------------------------------------------
Cracked By KuNgBiM[DFCG][BCG][SLT][NCPH]
2006-01-01
:) Happy new years!!! :)
14:30:00 PM
附件:KeyMaker_src.rar