【文章标题】: 第一次独立给cm写注册机
【文章作者】: 思远软件
【作者邮箱】: c_s_y@126.com
【作者主页】: http://blog.163.com/c_s_y@126/
【作者QQ号】: 495544622
【软件名称】: crackme
【软件大小】: 48.5 KB
【下载地址】: www.crackmes.de
【加壳方式】: 无
【保护方式】: 反调试
【编写语言】: MASM32 / TASM32
【使用工具】: OLLYDBG 1.1
【操作平台】: winXP
【软件介绍】: 一个很简单的cm
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
大家好,今天是我第二次写注册机,也是第一次独立完成写注册机。写的不好,不知道能不能得到精华
今天开刀的是我刚刚在crackmes.de下载的一个crackme,比较简单,高手就可以直接跳过了。
od查看 MASM32 / TASM32写的,用OD载入,可是跑飞了,怎么办呢?对,OD有附加进程的功能,先打开cm,然后打开od
用插件隐藏od,然后载入这个cm。 恩 可以运行了。
先用od的查找字符串插件查找字符,很容易可以找到正确和错误信息。向上找,很容易就可以找到关键算法!
下断点 我在这里输入用户名 exekill 密码495544622 点击确定
00401153 $ 55 push ebp
00401154 . 8BEC mov ebp, esp
00401156 . 68 B4304000 push 004030B4 ; /String = "exekill"
0040115B . E8 42010000 call <jmp.&kernel32.lstrlenA> ; \lstrlenA 取用户名长度
00401160 . BA 6A314000 mov edx, 0040316A
00401165 . 8902 mov dword ptr [edx], eax
00401167 . BF B4304000 mov edi, 004030B4 ; ASCII "exekill"
0040116C . BE 19314000 mov esi, 00403119 ; ASCII "331523541"
00401171 . 33C0 xor eax, eax
00401173 . 33DB xor ebx, ebx
00401175 . 33C9 xor ecx, ecx
00401177 . 33D2 xor edx, edx
00401179 . BA 6A314000 mov edx, 0040316A
0040117E . 8B12 mov edx, dword ptr [edx]
00401180 > 83C3 01 add ebx, 1
00401183 . 3BD3 cmp edx, ebx
00401185 . 74 15 je short 0040119C
00401187 . 8A07 mov al, byte ptr [edi] ; 取一个字符的asicc
00401189 . 3C 5A cmp al, 5A ; 和Z比较
0040118B . 7E 05 jle short 00401192 ; 小于就跳
0040118D > 03C8 add ecx, eax ; 加到ECX
0040118F . 47 inc edi
00401190 .^ EB EE jmp short 00401180
00401192 > 3C 41 cmp al, 41 ; 和A比较 大于等于就跳
00401194 . 7D 02 jge short 00401198
00401196 . EB 02 jmp short 0040119A ;
00401198 > 04 2C add al, 2C ; 加2C
0040119A >^ EB F1 jmp short 0040118D
0040119C > 81C1 9A020000 add ecx, 29A ; ECX=ECX+29A
004011A2 . 69C9 39300000 imul ecx, ecx, 3039 ; ECX=ECX*3039
004011A8 . 83E9 17 sub ecx, 17 ; ECX=ECX-17
004011AB . 6BC9 09 imul ecx, ecx, 9 ; ECX=ECX*9
004011AE . 33DB xor ebx, ebx ; EBX清0
004011B0 . 8BC1 mov eax, ecx ; eax=ecx
004011B2 . B9 0A000000 mov ecx, 0A ;
004011B7 > 33D2 xor edx, edx ;
004011B9 . F7F1 div ecx ; EAX/ECX(A) (取个位) (这里开始就是循环了)
004011BB . 80C2 30 add dl, 30 ; 余数+30 (就是存储数字的意思)
004011BE . 881433 mov byte ptr [ebx+esi], dl ; (存储)
004011C1 . 83C3 01 add ebx, 1
004011C4 . 83F8 00 cmp eax, 0
004011C7 . 74 02 je short 004011CB
004011C9 .^ EB EC jmp short 004011B7 ; ????????
004011CB > BF C8304000 mov edi, 004030C8 ; ASCII "145325133kill"
004011D0 > 8A4433 FF mov al, byte ptr [ebx+esi-1] ; !!!倒放
004011D4 . 8807 mov byte ptr [edi], al
004011D6 . 47 inc edi
004011D7 . 4B dec ebx
004011D8 . 83FB 00 cmp ebx, 0
004011DB .^ 75 F3 jnz short 004011D0
004011DD . C607 00 mov byte ptr [edi], 0
004011E0 . 8D3D B4304000 lea edi, dword ptr [4030B4]
004011E6 . 68 B7304000 push 004030B7 ; ASCII "kill"
004011EB . 68 C8304000 push 004030C8 ; ASCII "145325133kill"
004011F0 . E8 BB000000 call 004012B0
004011F5 . 68 C8304000 push 004030C8 ; /String2 = "145325133kill"
004011FA . 68 98314000 push 00403198 ; |String1 = "495544622"
004011FF . E8 98000000 call <jmp.&kernel32.lstrcmpA> ; \lstrcmpA
00401204 . 0BC0 or eax, eax
00401206 . 75 2B jnz short 00401233
00401208 . 68 B4304000 push 004030B4 ; ASCII "exekill"
0040120D . 68 83304000 push 00403083 ; ASCII "Good Job, Now write a keygen || Registered to: "
00401212 . E8 99000000 call 004012B0
00401217 . 6A 00 push 0 ; /Style = MB_OK|MB_APPLMODAL
00401219 . 68 13304000 push 00403013 ; |Title = "Good boy"
0040121E . 68 83304000 push 00403083 ; |Text = "Good Job, Now write a keygen || Registered to: "
00401223 . 6A 00 push 0 ; |hOwner = NULL
00401225 . E8 4E000000 call <jmp.&user32.MessageBoxA> ; \MessageBoxA
0040122A . 6A 00 push 0 ; /ExitCode = 0
0040122C . E8 59000000 call <jmp.&kernel32.ExitProcess> ; \ExitProcess
00401231 . EB 13 jmp short 00401246
00401233 > 6A 00 push 0 ; /Style = MB_OK|MB_APPLMODAL
00401235 . 68 04304000 push 00403004 ; |Title = "Error, Bad Boy"
0040123A . 68 3A304000 push 0040303A ; |Text = "Hey!, you are OK?, its for Newbies..."
0040123F . 6A 00 push 0 ; |hOwner = NULL
00401241 . E8 32000000 call <jmp.&user32.MessageBoxA> ; \MessageBoxA
00401246 > EB 13 jmp short 0040125B
00401248 . 6A 00 push 0 ; /Style = MB_OK|MB_APPLMODAL
0040124A . 68 04304000 push 00403004 ; |Title = "Error, Bad Boy"
0040124F . 68 60304000 push 00403060 ; |Text = "Where is the serial, Mr Cracker ? "
00401254 . 6A 00 push 0 ; |hOwner = NULL
00401256 . E8 1D000000 call <jmp.&user32.MessageBoxA> ; \MessageBoxA
0040125B > C9 leave
好了 分析一下,就很容易分析出来算法
1 先取注册名,若注册名长度为N 取前n-1个字符如果每一个数字为小写字母或者其他字符,那么就直接相加,如果为大写字母的话,
就加上2C,各个位相加,我们取这个和为S。
2 计算S1 S=((S+29A)*3039-17)*9
将S看成十进制,尾数加注册名(去除前4位)输出
c语言写的算法如下:
#include<stdio.h>
#include<windows.h>
#include<string.h>
void main()
{
char str[100];
char *p=str;
int s=0,l,i,l1;
puts("请输入您的用户名!");
gets(str);
l=strlen(str);
l1=l-3;
for(i=0;i<l-1;i++,p++)
{
if( *p<'Z' && *p>'A' )
s+=0x2c;
s+=*p;
}
s=((s+0x29A)*0x3039-0x17)*9;
printf("注册码为%d",s);
p=&str[3];
for(i=l1;i>0;i--)
printf("%c",str[l-i]);
system("pause");
}
在vc 9.0编译通过
注册机和crackme已经打包上传!!
--------------------------------------------------------------------------------
【经验总结】
学习破解,不但要有惊人的毅力,并且要有敢尝试困难的信心。
不懂编程,破解这条路是走不远的。
要熟练各种汇编指令。
最后提醒一句,耐心最重要的,这个浪费了我将近3个小时才搞定!
--------------------------------------------------------------------------------
【版权声明】: 本文原创于看雪技术论坛, 转载请注明作者并保持文章的完整, 谢谢!
2009年09月12日 16:13:13
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!