最近一直在研究KeyFIle保护的软件破解,就到CCG的主页上下载了一个CrackMe,试着破了一下,请看:
由于笔者没有时间复查,所以如有错误的地方请大家支出!
这个crackme在咖菲猫的家(CCG)的主页有下载.
下载地址:http://go3.163.com/~gfcrack/crackme/Cruehead.3.zip
一个CrackMe的破解 *KeyFIle保护* (教你如何获得 KeyFile)
1/2破解人:TAE! 另外1/2破解人:XXX!!!
用FileMon检测出此CrackMe会读取crackme3.key这个文件,所以我们手动建立它,然后打开
这个文件,输入 1234567890abcd 这些字符.运行trw设置断点BPX CreateFilea.然后运
行程序,被中断,按F5,F12各一次.便来到了这儿:
* Possible StringData Ref from Data Obj ->"CRACKME3.KEY"
|
:00401028 68D7204000 push
004020D7
* Reference To: KERNEL32.CreateFileA, Ord:0000h
|
:0040102D E876040000 Call
004014A8
:00401032 83F8FF
cmp eax, FFFFFFFF <---我们到了这里,
:00401035 750C
jne 00401043 // 检测crackme3.key这个文件
是否存在.存在就跳走.
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00401035(C)
|
:00401043 A3F5204000 mov dword
ptr [004020F5], eax
:00401048 B812000000 mov eax,
00000012
:0040104D BB08204000 mov ebx,
00402008
:00401052 6A00
push 00000000
:00401054 68A0214000 push
004021A0
:00401059 50
push eax
:0040105A 53
push ebx
:0040105B FF35F5204000 push dword
ptr [004020F5]
* Reference To: KERNEL32.ReadFile, Ord:0000h
|
:00401061 E830040000 Call
00401496
//读取文件的字节数
:00401066 833DA021400012 cmp dword ptr [004021A0],
00000012 //比较字节数是不是12
:0040106D 75C8
jne 00401037
//小于12就跳走!完了
所以 Key 文件的大小应该为18个字节.
我们在Crackme3.key文件中输入18个字符,我是这样输的:1234567890abcdefgh
继续来到这里:
:0040106F 6808204000 push
00402008
:00401074 E898020000 call
00401311
*//对你输入的字符编码
:00401079 8135F920400078563412 xor dword ptr [004020F9], 12345678
注册成功后,编码后的
:00401083 83C404
add esp, 00000004
字符就是你的大名了!
:00401086 6808204000 push
00402008
:0040108B E8AC020000 call
0040133C
:00401090 83C404
add esp, 00000004
:00401093 3B05F9204000 cmp eax, dword
ptr [004020F9] //
:00401099 0F94C0
sete al
:0040109C 50
push eax
:0040109D 84C0
test al, al
:0040109F 7496
je 00401037
进入*那个Call看看吧!在这里,*****运算核心*****
:00401311 33C9
xor ecx, ecx
//清空寄存器ecx
:00401313 33C0
xor eax, eax
//清空寄存器eax
:00401315 8B742404
mov esi, dword ptr [esp+04] //Keyfile中的字符串给esi
:00401319 B341
mov bl, 41
//将A这个字符传给bl
:0040131B 8A06
mov al, byte ptr [esi] //KeyFile中第一个字符给al,就是我们输入的1
:0040131D 32C3
xor al, bl
//异或al,bl传给al
:0040131F 8806
mov byte ptr [esi], al //al给esi
:00401321 46
inc esi
//指向下一个esi中的字符
:00401322 FEC3
inc bl
//bl加1
:00401324 0105F9204000 add dword
ptr [004020F9], eax //异或后的每个ascii码的值相加给004020F9*(这个值很重要设为X)
:0040132A 3C00
cmp al, 00
:0040132C 7407
je 00401335
:0040132E FEC1
inc cl
:00401330 80FB4F
cmp bl, 4F
:00401333 75E6
jne 0040131B
//循环
从这里可以知道程序取keyfile中的字符串进行编码(第一个字符和A异或,第二个字符于B异或……,然后将结果保存在Esi中)
但Keyfile中的最后四个字符不参加运算,而是作为判断是否为真正keyfile的关键字符!)
(注意:若我们Keyfile文件中第一个字符为A那么破解后无法显示你的大名)
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040132C(C)
|
:00401335 890D49214000 mov dword
ptr [00402149], ecx
:0040133B C3
ret
运算完成后,我们便来到这里:*************(这也是我有疑问的地方,请各位帮忙!!!)*************
:00401079 8135F920400078563412 xor dword ptr [004020F9], 12345678
//X和12345678异或的值(设为Y)
:00401083 83C404
add esp, 00000004
:00401086 6808204000 push
00402008
:0040108B E8AC020000 call
0040133C
//取出keyfile最后四位字符
:00401090 83C404
add esp, 00000004
:00401093 3B05F9204000 cmp eax, dword
ptr [004020F9] //最后四位字符十六进制是否为X
:00401099 0F94C0
sete al
:0040109C 50
push eax
:0040109D 84C0
test al, al
:0040109F 7496
je 00401037
//不能跳!
所以要让我们keyfile的最后四位字符的十六进制的值=Y
异或后的结果的第1位开始到第14位就是你的姓名了!!!
这样,应该不难写出注册机了吧? 可惜我不懂编程;(
请教高手们:
如何在文本文件中输入那些很奇怪的字符?如:Keyfile文件的最后四位一定要为十六进制的:12345678
那么这个12的ascii字符怎么输入呢?是否需要编程来获得?请高人指点,小弟谢了!!!!!!!
TAE!
2001年2月5日
- 标 题:一个CrackMe的破解 *KeyFIle保护* (教你如何获得 KeyFile) (5千字)
- 作 者:TAE!
- 时 间:2001-2-6 18:18:15
- 链 接:http://bbs.pediy.com