首页
社区
课程
招聘
[原创]AVI Joiner 1.0.31 完整算法分析 + VC 注册机
发表于: 2006-1-1 14:55 8191

[原创]AVI Joiner 1.0.31 完整算法分析 + VC 注册机

2006-1-1 14:55
8191
【破文标题】: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: [email]kungbim@163.com[/email]           //\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

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

收藏
免费 7
支持
分享
最新回复 (11)
雪    币: 277
活跃值: (312)
能力值: ( LV9,RANK:330 )
在线值:
发帖
回帖
粉丝
2
新年新气象。
2006-1-1 16:10
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
谢谢老K的破文攒一下:)
2006-1-1 16:35
0
雪    币: 146
活跃值: (72)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
4
问下楼主,排版如此整齐,中间的汇编代码是怎样弄成不同颜色的?
2006-1-1 17:01
0
雪    币: 817
活跃值: (1927)
能力值: ( LV12,RANK:2670 )
在线值:
发帖
回帖
粉丝
5
最初由 playx 发布
问下楼主,排版如此整齐,中间的汇编代码是怎样弄成不同颜色的?


我在看学里好象发了的哦~~~

现在上传功能有问题~~~

到我的空间下载吧~~~
2006-1-1 17:05
0
雪    币: 214
活跃值: (70)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
6
是C语言吧
2006-1-1 18:32
0
雪    币: 212
活跃值: (40)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
7
KuNgBiM
老大强啊!向你学习
2006-1-1 18:38
0
雪    币: 671
活跃值: (723)
能力值: ( LV9,RANK:1060 )
在线值:
发帖
回帖
粉丝
8
K的文一定要支持。
2006-1-1 18:57
0
雪    币: 300
活跃值: (412)
能力值: ( LV9,RANK:410 )
在线值:
发帖
回帖
粉丝
9
k兄的文章一向简明扼要!
2006-1-1 19:35
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
一个字  强
我何时能达到这种境界啊
2006-4-13 16:11
0
雪    币: 223
活跃值: (262)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
新手,学习.........
2006-4-13 17:06
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
学习一下.  写的非常好啊``
2006-4-13 22:59
0
游客
登录 | 注册 方可回帖
返回
//