终于找到一个最适合新手的Crackme(算法分析+注册机)(转载)
【原创】终于找到一个最适合新手的Crackme(算法分析+注册机)
【文章标题】: 终于找到一个最适合新手的Crackme(算法分析+注册机)
【文章作者】: qwgboy2000
【作者邮箱】:
qwgboy2000@126.com
【作者主页】: http://mland.icpcn.com/
【作者QQ号】:
27141459
【软件名称】: AD_CM#2.exe
【软件大小】: 4K
【下载地址】: 自己搜索下载
【加壳方式】:
无
【保护方式】: name、Serial
【编写语言】: MASM32/TASM32
【使用工具】: PEiD、OD
【操作平台】:
WINXP
【软件介绍】: 从www.crackme.de上找来的一个简单crackme
【作者声明】:
只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
首先用PEiD查看无壳
;)
OD载入,熟悉大致流程以后,按下CTRL+N,出现以下部分:
名称位于 AD_CM#2
地址 区段 类型 (已知) 名称
注释
00402020 .rdata 输入 (已知) USER32.DialogBoxParamA
00402018 .rdata 输入 (已知)
USER32.EndDialog
00402004 .rdata 输入 (已知) KERNEL32.ExitProcess
00402010
.rdata 输入 (已知) USER32.GetDlgItem
0040200C .rdata 输入 (已知)
USER32.GetDlgItemTextA ;应该就是它了
00402000 .rdata 输入 (已知)
KERNEL32.GetModuleHandleA
0040201C .rdata 输入 (已知)
USER32.MessageBoxA
00402024 .rdata 输入 (已知) USER32.SendMessageA
00402014
.rdata 输入 (已知) USER32.SetFocus
00401000 .text 输出
<模块入口点>
看到以上的内容,不难知道下什么断点了
Command: bpx
getdlgitemtexta
按下F9运行程序,输入name和Serial
我name=qwgboy2000、Serial=7878781234确定以后
中断到了以下关键部分
004010FC
/$ 55 push ebp
004010FD |. 8BEC mov ebp, esp
004010FF |. 6A 14 push 14 ;
/Count = 14 (20.)
00401101 |. 68 80304000 push 00403080 ; |Buffer =
AD_CM#2.00403080
00401106 |. 68 B80B0000 push 0BB8 ; |ControlID = BB8
(3000.)
0040110B |. FF75 08 push dword ptr [ebp+8] ; |hWnd
0040110E |. E8
77000000 call <jmp.&USER32.GetDlgItemTextA> ;
\GetDlgItemTextA
00401113 |. 8BF0 mov esi, eax
00401115 |. 8D01 lea eax,
[ecx]
00401117 |. 83FE 05 cmp esi, 5 ; 比较name是否大于等于5个字符,小于则game
over
0040111A |. 7D 18 jge short 00401134
0040111C |. 6A 40 push 40 ;
/Style = MB_OK|MB_ICONASTERISK|MB_APPLMODAL
0040111E |. 68 12304000 push
00403012 ; |Title = "ArturDents CrackMe#2"
00401123 |. 68 44304000 push
00403044 ; |Text = "Your name must be at least five characters
long!"
00401128 |. FF75 08 push dword ptr [ebp+8] ; |hOwner
0040112B
|. E8 60000000 call <jmp.&USER32.MessageBoxA> ;
\MessageBoxA
00401130 |. 33C0 xor eax, eax
00401132 |. EB 40 jmp short
00401174
00401134 |> 6A 14 push 14 ; /Count = 14 (20.)
00401136 |. 68
80324000 push 00403280 ; |Buffer = AD_CM#2.00403280
0040113B |. 68 B90B0000
push 0BB9 ; |ControlID = BB9 (3001.)
00401140 |. FF75 08 push dword ptr
[ebp+8] ; |hWnd
00401143 |. E8 42000000 call
<jmp.&USER32.GetDlgItemTextA> ; \GetDlgItemTextA
00401148 |. B8
80304000 mov eax, 00403080 ; ASCII "qwgboy2000"
0040114D |. BB 80324000 mov
ebx, 00403280 ; ASCII "7878781234"
00401152 |. 8BCE mov ecx, esi ;
准备循环了,循环次数为name长度
00401154 |> 8A10 /mov dl, [eax] ;
依次开始从name的第一个字符取起
00401156 |. 2AD1 |sub dl, cl ;
新字符=原来字符-循环剩下的次数,第一次为name长度
00401158 |. 3813 |cmp [ebx], dl ;
新字符和Serial的对应字符进行比较
0040115A |. 75 18 |jnz short 00401174 ; 如果不相同,则game
over(从这里我们可以知道name和
Serial
字符长度相同)
0040115C |. 40 |inc eax ;
eax=eax+1,为取下一个字符进行下一次的循环运算做好准备
0040115D |. 43 |inc ebx ;
ebx=ebx+1,为取下一个Serial进行下一次的比较做好准备
0040115E |.^ E2 F4 \loopd short 00401154 ;
循环
00401160 |. 6A 40 push 40 ; /Style =
MB_OK|MB_ICONASTERISK|MB_APPLMODAL
00401162 |. 68 12304000 push 00403012 ;
|Title = "ArturDents CrackMe#2"
00401167 |. 68 27304000 push 00403027 ; |Text
= "Yeah, you did it!"
0040116C |. FF75 08 push dword ptr [ebp+8] ;
|hOwner
0040116F |. E8 1C000000 call <jmp.&USER32.MessageBoxA> ;
\MessageBoxA
00401174 |> C9 leave
00401175 \. C2 0400 retn
4
--------------------------------------------------------------------------------
【经验总结】
这个crackme绝对是新手拿来练习的好东东
程序首先判断输入的name长度,只有大于等于5才可以
且Serial长度和name长度是相等的
算法很简单:Serial的每个字符=name对应的字符-对应长度
本人name:qwgboy2000
那么Serial依次应该为:q-10、w-9、g-8、b-7、o-6、y-5、2-4、0-3、0-2、0-1
即Serial:gn_[it.-./
注册机部分如下:
#include"string.h"
main()
{
char
name[32];
int i,j;
printf("please input your
name:");
scanf("%s",name);
i=strlen(name);
if(i<5)
{
printf("Your
name must be at least five characters\n");
printf("please input your name
again:");
scanf("%s",name);
i=strlen(name);
}
printf("your Serial
is:");
for(i;i>=1;i--)
{
j=strlen(name)-i;
printf("%c",name[j]-i);
}
}
以上程序TC2.0调试通过
【文章作者】: qwgboy2000
【作者邮箱】:
qwgboy2000@126.com
【作者主页】: http://mland.icpcn.com/
【作者QQ号】:
27141459
【软件名称】: AD_CM#2.exe
【软件大小】: 4K
【下载地址】: 自己搜索下载
【加壳方式】:
无
【保护方式】: name、Serial
【编写语言】: MASM32/TASM32
【使用工具】: PEiD、OD
【操作平台】:
WINXP
【软件介绍】: 从www.crackme.de上找来的一个简单crackme
【作者声明】:
只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
首先用PEiD查看无壳
;)
OD载入,熟悉大致流程以后,按下CTRL+N,出现以下部分:
名称位于 AD_CM#2
地址 区段 类型 (已知) 名称
注释
00402020 .rdata 输入 (已知) USER32.DialogBoxParamA
00402018 .rdata 输入 (已知)
USER32.EndDialog
00402004 .rdata 输入 (已知) KERNEL32.ExitProcess
00402010
.rdata 输入 (已知) USER32.GetDlgItem
0040200C .rdata 输入 (已知)
USER32.GetDlgItemTextA ;应该就是它了
00402000 .rdata 输入 (已知)
KERNEL32.GetModuleHandleA
0040201C .rdata 输入 (已知)
USER32.MessageBoxA
00402024 .rdata 输入 (已知) USER32.SendMessageA
00402014
.rdata 输入 (已知) USER32.SetFocus
00401000 .text 输出
<模块入口点>
看到以上的内容,不难知道下什么断点了
Command: bpx
getdlgitemtexta
按下F9运行程序,输入name和Serial
我name=qwgboy2000、Serial=7878781234确定以后
中断到了以下关键部分
004010FC
/$ 55 push ebp
004010FD |. 8BEC mov ebp, esp
004010FF |. 6A 14 push 14 ;
/Count = 14 (20.)
00401101 |. 68 80304000 push 00403080 ; |Buffer =
AD_CM#2.00403080
00401106 |. 68 B80B0000 push 0BB8 ; |ControlID = BB8
(3000.)
0040110B |. FF75 08 push dword ptr [ebp+8] ; |hWnd
0040110E |. E8
77000000 call <jmp.&USER32.GetDlgItemTextA> ;
\GetDlgItemTextA
00401113 |. 8BF0 mov esi, eax
00401115 |. 8D01 lea eax,
[ecx]
00401117 |. 83FE 05 cmp esi, 5 ; 比较name是否大于等于5个字符,小于则game
over
0040111A |. 7D 18 jge short 00401134
0040111C |. 6A 40 push 40 ;
/Style = MB_OK|MB_ICONASTERISK|MB_APPLMODAL
0040111E |. 68 12304000 push
00403012 ; |Title = "ArturDents CrackMe#2"
00401123 |. 68 44304000 push
00403044 ; |Text = "Your name must be at least five characters
long!"
00401128 |. FF75 08 push dword ptr [ebp+8] ; |hOwner
0040112B
|. E8 60000000 call <jmp.&USER32.MessageBoxA> ;
\MessageBoxA
00401130 |. 33C0 xor eax, eax
00401132 |. EB 40 jmp short
00401174
00401134 |> 6A 14 push 14 ; /Count = 14 (20.)
00401136 |. 68
80324000 push 00403280 ; |Buffer = AD_CM#2.00403280
0040113B |. 68 B90B0000
push 0BB9 ; |ControlID = BB9 (3001.)
00401140 |. FF75 08 push dword ptr
[ebp+8] ; |hWnd
00401143 |. E8 42000000 call
<jmp.&USER32.GetDlgItemTextA> ; \GetDlgItemTextA
00401148 |. B8
80304000 mov eax, 00403080 ; ASCII "qwgboy2000"
0040114D |. BB 80324000 mov
ebx, 00403280 ; ASCII "7878781234"
00401152 |. 8BCE mov ecx, esi ;
准备循环了,循环次数为name长度
00401154 |> 8A10 /mov dl, [eax] ;
依次开始从name的第一个字符取起
00401156 |. 2AD1 |sub dl, cl ;
新字符=原来字符-循环剩下的次数,第一次为name长度
00401158 |. 3813 |cmp [ebx], dl ;
新字符和Serial的对应字符进行比较
0040115A |. 75 18 |jnz short 00401174 ; 如果不相同,则game
over(从这里我们可以知道name和
Serial
字符长度相同)
0040115C |. 40 |inc eax ;
eax=eax+1,为取下一个字符进行下一次的循环运算做好准备
0040115D |. 43 |inc ebx ;
ebx=ebx+1,为取下一个Serial进行下一次的比较做好准备
0040115E |.^ E2 F4 \loopd short 00401154 ;
循环
00401160 |. 6A 40 push 40 ; /Style =
MB_OK|MB_ICONASTERISK|MB_APPLMODAL
00401162 |. 68 12304000 push 00403012 ;
|Title = "ArturDents CrackMe#2"
00401167 |. 68 27304000 push 00403027 ; |Text
= "Yeah, you did it!"
0040116C |. FF75 08 push dword ptr [ebp+8] ;
|hOwner
0040116F |. E8 1C000000 call <jmp.&USER32.MessageBoxA> ;
\MessageBoxA
00401174 |> C9 leave
00401175 \. C2 0400 retn
4
--------------------------------------------------------------------------------
【经验总结】
这个crackme绝对是新手拿来练习的好东东
程序首先判断输入的name长度,只有大于等于5才可以
且Serial长度和name长度是相等的
算法很简单:Serial的每个字符=name对应的字符-对应长度
本人name:qwgboy2000
那么Serial依次应该为:q-10、w-9、g-8、b-7、o-6、y-5、2-4、0-3、0-2、0-1
即Serial:gn_[it.-./
注册机部分如下:
#include"string.h"
main()
{
char
name[32];
int i,j;
printf("please input your
name:");
scanf("%s",name);
i=strlen(name);
if(i<5)
{
printf("Your
name must be at least five characters\n");
printf("please input your name
again:");
scanf("%s",name);
i=strlen(name);
}
printf("your Serial
is:");
for(i;i>=1;i--)
{
j=strlen(name)-i;
printf("%c",name[j]-i);
}
}
以上程序TC2.0调试通过