好友
阅读权限 25
听众
最后登录 1970-1-1
选了一个从来没有做过的 keyfile 保护模式的来做做,毕竟做了好些 Name/Serial 模式的除了个别分析后,表示臣妾做不到的情况。。。其它的都还好,有些经验了
一、基础信息
总结: 汇编写的软件,无壳,应该是正常的keyfile模式软件
二、暴力一试
OD通过查找字符串找到了关键跳转
[Asm] 纯文本查看 复制代码
0040116A |. A3 04204000 mov dword ptr ds:[0x402004],eax ; Cruehead.0040210E
0040116F |. 6A 01 push 0x1 ; /ShowState = SW_SHOWNORMAL
00401171 |. FF35 04204000 push dword ptr ds:[0x402004] ; |hWnd = 00300642 ('CrackMe v3.0 - Uncracked',class='No need to disasm the code!')
00401177 |. E8 90020000 call <jmp.&USER32.ShowWindow> ; \ShowWindow
0040117C |. FF35 04204000 push dword ptr ds:[0x402004] ; /hWnd = 00300642 ('CrackMe v3.0 - Uncracked',class='No need to disasm the code!')
00401182 |. E8 9D020000 call <jmp.&USER32.UpdateWindow> ; \UpdateWindow
00401187 |. 58 pop eax ; kernel32.7C817077
00401188 |. 3C 01 cmp al,0x1
0040118A |. 75 17 jnz short Cruehead.004011A3 ; 关键跳转
0040118C |. 68 86214000 push Cruehead.00402186 ; Now try the next crackme!
00401191 |. 68 6A214000 push Cruehead.0040216A ; Cracked by: Now try the next crackme!
00401196 |. 68 08204000 push Cruehead.00402008
0040119B |. E8 C2010000 call Cruehead.00401362
004011A0 |. 83C4 0C add esp,0xC
004011A3 |> 6A 00 /push 0x0 ; /MsgFilterMax = 0x0
004011A5 |. 6A 00 |push 0x0 ; |MsgFilterMin = 0x0
004011A7 |. 6A 00 |push 0x0 ; |hWnd = NULL
004011A9 |. 68 5A204000 |push Cruehead.0040205A ; |pMsg = Cruehead.0040205A
004011AE |. E8 B9020000 |call <jmp.&USER32.GetMessageA> ; \GetMessageA
修改标志位后完成暴力破解
三、注册机分析
像我们这样的新手接触,自然是一步一步来,度娘各种搜索keyfile 怎么入手,需要注意的是什么云云云·。。。。其间学习不足和外人道也··
一个成功果然不是表面上看起来的那么容易啊··
上关键代码:
[Asm] 纯文本查看 复制代码
00401000 >/$ 6A 00 push 0x0 ; /pModule = NULL
00401002 |. E8 7D040000 call <jmp.&KERNEL32.GetModuleHandleA> ; \GetModuleHandleA
00401007 |. A3 E9204000 mov dword ptr ds:[0x4020E9],eax ; Cruehead.0040210E
0040100C |. C705 F9204000>mov dword ptr ds:[0x4020F9],0x0
00401016 |. 6A 00 push 0x0 ; /hTemplateFile = NULL
00401018 |. 68 80000000 push 0x80 ; |Attributes = NORMAL
0040101D |. 6A 03 push 0x3 ; |Mode = OPEN_EXISTING
0040101F |. 6A 00 push 0x0 ; |pSecurity = NULL
00401021 |. 6A 03 push 0x3 ; |ShareMode = FILE_SHARE_READ|FILE_SHARE_WRITE
00401023 |. 68 000000C0 push 0xC0000000 ; |Access = GENERIC_READ|GENERIC_WRITE
00401028 |. 68 D7204000 push Cruehead.004020D7 ; |CRACKME3.KEY
0040102D |. E8 76040000 call <jmp.&KERNEL32.CreateFileA> ; \CreateFileA
00401032 |. 83F8 FF cmp eax,-0x1 ; CreateFilA用来打开或者创建一个文件,返回文件句柄
00401035 |. 75 0C jnz short Cruehead.00401043
00401037 |> 68 0E214000 push Cruehead.0040210E ; CrackMe v3.0 - Cracked!!
0040103C |. E8 B4020000 call Cruehead.004012F5
00401041 |. EB 6B jmp short Cruehead.004010AE
00401043 |> A3 F5204000 mov dword ptr ds:[0x4020F5],eax ; D
00401048 |. B8 12000000 mov eax,0x12 ; 读取字节数
0040104D |. BB 08204000 mov ebx,Cruehead.00402008
00401052 |. 6A 00 push 0x0 ; /pOverlapped = NULL
00401054 |. 68 A0214000 push Cruehead.004021A0 ; |pBytesRead = Cruehead.004021A0
00401059 |. 50 push eax ; |BytesToRead = 40210E (4202766.)
0040105A |. 53 push ebx ; |Buffer = 7FFDF000
0040105B |. FF35 F5204000 push dword ptr ds:[0x4020F5] ; |D
00401061 |. E8 30040000 call <jmp.&KERNEL32.ReadFile> ; \ReadFile 从文件指针指向的位置开始将数据读出到一个文件中
00401066 |. 833D A0214000>cmp dword ptr ds:[0x4021A0],0x12
0040106D |.^ 75 C8 jnz short Cruehead.00401037 ; 不是18个字节就跳走
0040106F |. 68 08204000 push Cruehead.00402008
00401074 |. E8 98020000 call Cruehead.00401311 ; 重要call
00401079 |. 8135 F9204000>xor dword ptr ds:[0x4020F9],0x12345678 ; 4020f9 14次异或之和
00401083 |. 83C4 04 add esp,0x4
00401086 |. 68 08204000 push Cruehead.00402008
0040108B |. E8 AC020000 call Cruehead.0040133C
00401090 |. 83C4 04 add esp,0x4
00401093 |. 3B05 F9204000 cmp eax,dword ptr ds:[0x4020F9] ; 关键
00401099 |. 0f94c0 sete al ; 关键
重要call:
[Asm] 纯文本查看 复制代码
00401311 /$ 33C9 xor ecx,ecx
00401313 |. 33C0 xor eax,eax ; Cruehead.0040210E
00401315 |. 8B7424 04 mov esi,dword ptr ss:[esp+0x4]
00401319 |. B3 41 mov bl,0x41
0040131B |> 8A06 /mov al,byte ptr ds:[esi]
0040131D |. 32C3 |xor al,bl ; xor " " ,41
0040131F |. 8806 |mov byte ptr ds:[esi],al
00401321 |. 46 |inc esi ; esi ++ ???
00401322 |. FEC3 |inc bl ; bl ++
00401324 |. 0105 F9204000 |add dword ptr ds:[0x4020F9],eax ; Cruehead.0040210E
0040132A |. 3C 00 |cmp al,0x0
0040132C |. 74 07 |je short Cruehead.00401335
0040132E |. FEC1 |inc cl ; cl=14停
00401330 |. 80FB 4F |cmp bl,0x4F
00401333 |.^ 75 E6 \jnz short Cruehead.0040131B
00401335 |> 890D 49214000 mov dword ptr ds:[0x402149],ecx[/size]
[size=5]0040133B \. C3 retn
总结:
程序运行前打开了位于CrakeMe文件夹中的CRACKME3.KEY 注册文件,判断了下是不是18个字节,然后截取了14个字节进行操作,遍历这14个字节,从第一个字节开始和41 异或 ,并每遍历一次 41就自加一次:
遍历完成后的结果再与12345678 异或 。上面的异或结束后的值再和最后4个字节的16进制进行比较(上面的操作的数字都是16进制,emmmm ,最后4个字节的16进制怎么在栈里存储你们也应该懂··)
[C] 纯文本查看 复制代码
#include<stdio.h>
#include<string.h>
#include<iostream>
int main()
{
int bl=65;
long int Integer,b=0;
char ch[20]={0};
char name[20]={0};
printf("Warm reminder: your registration name must be 14 bytes. \n");
printf("Input yous name : \n");
scanf("%s",name);
int len = strlen(name);
for(int i=0;i<len;i++)
{
int x =name[i]^bl;
b=x+b;
bl++;
}
b=b^305419896; //12345678 -> 305419896
printf("%d \n",b);
sprintf(ch, "%X", b);
printf("This your key:%s\n",ch);
system("pause");
return 0;
}
我不管···· 我注册机就写成这样了。。 本来是强迫症就是要代码短,玩骚操作··· 结果卡在了16进制转字符上了··我16进制存储的还是char型···· 烦死,索性破罐子破摔就这样了··
学了那么多语言,结果学一门忘一门,我就呵呵了···
注册机用法: 输入14个字节的东西,注册机会生成4个字节的尾巴例:生成 12345517 请自行转换成 17553412 扔到在线16进制转字符网站解·· 最后在CrakeMe文件夹中创建CRACKME3.KEY 粘如你的14字节+4字节保存即可
例我的:www.52pojie.cn -》U4
心疼的安慰自己,打神都是从菜鸟开始的····· 加油!
如有错误,请大佬指出,小生不胜感激!!
免费评分
查看全部评分
发帖前要善用【论坛搜索 】 功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。