首页
社区
课程
招聘
CRACKME分析(KEYFILE进阶篇)
2006-3-26 12:21 6686

CRACKME分析(KEYFILE进阶篇)

2006-3-26 12:21
6686
【破文标题】CRACKME分析
【破文作者】逍遥风
【作者邮箱】tc-xb@163.com
【破解工具】OD
【破解平台】WINXP
【破解声明】keyFile进阶
------------------------------------------------------------------------
由于这个KEYFILE,必须读取指定文件的内容。所以,不能像上次那个一样任意建立一个KEY文件去分析,在具体分析之前
必须收集一些关于程序指定KEY文件的一些基本信息。具体到这个KEYFILE就是在分析之前需要知道KEY文件的文件名和文
件字的节数。一步一步走。
1)OD载入程序。命令行下断bp CreateFileA,F9运行后,停在这里
7C801A24 >  8BFF            MOV EDI,EDI                              ; ntdll.7C930738
7C801A26    55              PUSH EBP
7C801A27    8BEC            MOV EBP,ESP
7C801A29    FF75 08         PUSH DWORD PTR SS:[EBP+8]
7C801A2C    E8 73C80000     CALL kernel32.7C80E2A4
7C801A31    85C0            TEST EAX,EAX
此时注意看堆栈的提示。如下。。。。。。
         {                0012FFA4   00401032  /CALL 到 CreateFileA 来自 echap544.0040102D  。。。。。。注意这里
                          0012FFA8   004020D7  |FileName = "CRACKME3.KEY" 。。。。。。注意这里
                          0012FFAC   C0000000  |Access = GENERIC_READ|GENERIC_WRITE
                          0012FFB0   00000003  |ShareMode = FILE_SHARE_READ|FILE_SHARE_WRITE
                          0012FFB4   00000000  |pSecurity = NULL
                          0012FFB8   00000003  |Mode = OPEN_EXISTING
                          0012FFBC   00000080  |Attributes = NORMAL                                                            
                          0012FFC0   00000000  \hTemplateFile = NULL                                             }
根据堆栈的提示,了解到指定的KEY文件的文件名是CRACKME3.KEY。还要注意一个地方"来自 echap544.0040102D"
来到0040102D处,看到如下代码:
0040102D  |.  E8 76040000   CALL <JMP.&KERNEL32.CreateFileA>         ; \CreateFileA
00401032  |.  83F8 FF       CMP EAX,-1                               ;  开始检查是否有CRACKME3.KEY这个文件
00401035  |.  75 0C         JNZ SHORT echap544.00401043              ;  有这个文件就跳走,没有就出现未注册的字样
00401037  |>  68 0E214000   PUSH echap544.0040210E                   ;  ASCII "CrackMe v3.0             "
0040103C  |.  E8 B4020000   CALL echap544.004012F5
00401041  |.  EB 6B         JMP SHORT echap544.004010AE
00401043  |>  A3 F5204000   MOV DWORD PTR DS:[4020F5],EAX
00401048  |.  B8 12000000   MOV EAX,12                               ;  使EAX=12(18)
0040104D  |.  BB 08204000   MOV EBX,echap544.00402008                ;  开始读取文件信息
00401052  |.  6A 00         PUSH 0                                   ; /pOverlapped = NULL
00401054  |.  68 A0214000   PUSH echap544.004021A0                   ; |pBytesRead = echap544.004021A0
00401059  |.  50            PUSH EAX                                 ; |BytesToRead => 12 (18.)
0040105A  |.  53            PUSH EBX                                 ; |Buffer => echap544.00402008
0040105B  |.  FF35 F5204000 PUSH DWORD PTR DS:[4020F5]               ; |hFile = 00000040 (window)
00401061  |.  E8 30040000   CALL <JMP.&KERNEL32.ReadFile>            ; \ReadFile
00401066  |.  833D A0214000>CMP DWORD PTR DS:[4021A0],12             ;  检查文件是否为18字节
0040106D  |.^ 75 C8         JNZ SHORT echap544.00401037              ;  不相等就出现未注册
0040106F  |.  68 08204000   PUSH echap544.00402008                   ;  
00401074  |.  E8 98020000   CALL echap544.00401311                   ;  关键CALL
以上代码的作用就是,检验KEY文件的相关信息后,如果信息符合要求,就对KEY文件的内容做进一步的处理,以检验
内容的有效性。所以,一般KEYFILE都是分两步走的,先检验文件形式的有效性,再检验文件内容的有效性。要知道程序
对文件内容是如何处理的,F7跟进上面的那个关键CALL。
00401311  /$  33C9          XOR ECX,ECX                              ;  kernel32.7C801898
00401313  |.  33C0          XOR EAX,EAX
00401315  |.  8B7424 04     MOV ESI,DWORD PTR SS:[ESP+4]
00401319  |.  B3 41         MOV BL,41                                ;  BL=41
0040131B  |>  8A06          /MOV AL,BYTE PTR DS:[ESI]                ;  取第一个字节
0040131D  |.  32C3          |XOR AL,BL                               ;  第一个字节与41做XOR运算
0040131F  |.  8806          |MOV BYTE PTR DS:[ESI],AL
00401321  |.  46            |INC ESI                                 ;  每计算一次就指向下一字节
00401322  |.  FEC3          |INC BL                                  ;  每计算一次BL+1
00401324  |.  0105 F9204000 |ADD DWORD PTR DS:[4020F9],EAX           ;  把每一次XOR运算后的结果累加
0040132A  |.  3C 00         |CMP AL,0
0040132C  |.  74 07         |JE SHORT echap544.00401335
0040132E  |.  FEC1          |INC CL                                  ;  每计算一次CL+1
00401330  |.  80FB 4F       |CMP BL,4F                               ;  注意这里
00401333  |.^ 75 E6         \JNZ SHORT echap544.0040131B
00401335  |>  890D 49214000 MOV DWORD PTR DS:[402149],ECX
0040133B  \.  C3            RETN
这段代码就是对文件内容做进一步的处理,注意00401330处的CMP BL,4F。
4F对应的是字母o,从这个CALL可以看出,BL的值是从41(A)开始的到4F(O)结束。所以这个CALL
的作用就是对KEY文件的前14个字节按顺序与ABCDEFGHIJKLMN做XOR运算,并把结果相加,得到一个值设为A
前14字节计算完毕后,会来到这里。。。。。。
00401079  |.  8135 F9204000>XOR DWORD PTR DS:[4020F9],12345678       ;  计算结果与12345678做XOR运算,结果设为B
00401083  |.  83C4 04       ADD ESP,4
00401086  |.  68 08204000   PUSH echap544.00402008                   ;  
0040108B  |.  E8 AC020000   CALL echap544.0040133C
00401090  |.  83C4 04       ADD ESP,4
00401093  |.  3B05 F9204000 CMP EAX,DWORD PTR DS:[4020F9]            ;  B与KEY文件的后四个字节进行比较
00401099  |.  0F94C0        SETE AL                                                                       
0040109C  |.  50            PUSH EAX
0040109D  |.  84C0          TEST AL,AL
0040109F  |.^ 74 96         JE SHORT echap544.00401037
比较后,如果相等就会出现成功的提示。
------------------------------------------------------------------------
1)KEY文件的文件名为CrackMe v3.0,18字节
2)KEY的前14个字节,按次与ABCDEFGHIJKLMN做XOR运算,并把结果累加,设为A
3)A与12345678做XOR运算,结果设为B
4)B与KEY的后4个字节比较,相等就注册成功。
例:用WINHEX创建一个新文件
文件名:CrackMe v3.0
字节数:18
内容:
00000000 :31 32 33 34 35 36 37 38 39 30 31 32 33 34 22 50
00000010: 34 12
------------------------------------------------------------------------
【版权声明】欢迎转载,请保留作者及文章完整性

[培训]二进制漏洞攻防(第3期);满10人开班;模糊测试与工具使用二次开发;网络协议漏洞挖掘;Linux内核漏洞挖掘与利用;AOSP漏洞挖掘与利用;代码审计。

上传的附件:
收藏
点赞7
打赏
分享
最新回复 (8)
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
viviann 2006-3-26 13:13
2
0
支持兄弟~
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
星愿 2006-3-26 14:41
3
0
学习中~~~
雪    币: 250
活跃值: (103)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
ah007 2 2006-3-26 15:13
4
0
支持!
雪    币: 50
活跃值: (145)
能力值: ( LV12,RANK:290 )
在线值:
发帖
回帖
粉丝
zhaoocn 7 2006-3-26 16:38
5
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
jinyu 2006-3-27 09:25
6
0
学习一下,支持
雪    币: 203
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
yujinjianx 2006-3-27 12:08
7
0
学习中
雪    币: 214
活跃值: (15)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
ljy3282393 1 2006-3-28 01:35
8
0
最初由 yujinjianx 发布
学习中
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
山贼 2006-3-29 17:55
9
0
学习.......
游客
登录 | 注册 方可回帖
返回