【破文标题】: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