• 标 题:一个CrackMe的破解 *KeyFIle保护* (教你如何获得 KeyFile) (5千字)
  • 作 者:TAE!
  • 时 间:2001-2-6 18:18:15
  • 链 接:http://bbs.pediy.com

最近一直在研究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日