-
-
[原创]AVI Joiner 1.0.31 完整算法分析 + VC 注册机
-
发表于:
2006-1-1 14:55
8190
-
[原创]AVI Joiner 1.0.31 完整算法分析 + VC 注册机
【破文标题】: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
[课程]Android-CTF解题方法汇总!