首页
论坛
专栏
课程

CRACKME分析(KEYFILE进阶--陷阱)

2006-4-1 14:20 6896

CRACKME分析(KEYFILE进阶--陷阱)

2006-4-1 14:20
6896
【破文标题】CRACKME分析
【破文作者】逍遥风
【破解工具】OD      WINHEX
【破解平台】WINXP
【破解声明】这一个很简单的KEYFILE,但是有陷阱,所以思路要灵活。
------------------------------------------------------------------------
1)脱壳后用OD载入这个KeyFile。可以在命令行下断:BP CreateFileA,运行后注意堆栈提示,就可以找到关键信息。
但是今天时间比较紧(刚考完2级VF。。。)。为了省事所以用字符串查找,任意找一句:key file is not valid.
很容易来到以下代码处。。
004266D3    BA B8674200     MOV EDX,UP1.004267B8                     ; key file contains wrong serial!
004266D8    8B83 B0010000   MOV EAX,DWORD PTR DS:[EBX+1B0]
004266DE    E8 B1B5FEFF     CALL UP1.00411C94
004266E3    EB 10           JMP SHORT UP1.004266F5
004266E5    BA E0674200     MOV EDX,UP1.004267E0                     ; key file is not valid!
这里已经是结果,向上找找到程序开始的地方。
来到这里。。。。。。
00426572    BA 4C674200     MOV EDX,UP1.0042674C                     ; ctm_cm02.key(注意这个,并在这里下断)
00426577    8D85 A8FEFEFF   LEA EAX,DWORD PTR SS:[EBP+FFFEFEA8]
省略一些代码。。。
004265A5    E8 5AD9FDFF     CALL UP1.00403F04
004265AA    E8 F9C0FDFF     CALL UP1.004026A8                        ; 取KEY文件的字节数
004265AF    8945 FC         MOV DWORD PTR SS:[EBP-4],EAX
004265B2    837D FC 00      CMP DWORD PTR SS:[EBP-4],0               ; 文件字节数是否为0
004265B6    75 15           JNZ SHORT UP1.004265CD                   ; 为0就出现错误
004265B8    BA 64674200     MOV EDX,UP1.00426764                     ; key file is empty!
不用多想:ctm_cm02.key,就是KEY文件的文件名了。用WINHEX任意建立一个文件后。下断,重新载入继续分析
直接来到这里:
004265CD    817D FC 0000010>CMP DWORD PTR SS:[EBP-4],10000           
004265D4    7E 07           JLE SHORT UP1.004265DD
004265D6    C745 FC 0000010>MOV DWORD PTR SS:[EBP-4],10000           
004265DD    6A 00           PUSH 0
004265DF    8D95 FCFFFEFF   LEA EDX,DWORD PTR SS:[EBP+FFFEFFFC]
004265E5    8B4D FC         MOV ECX,DWORD PTR SS:[EBP-4]
004265E8    8D85 A8FEFEFF   LEA EAX,DWORD PTR SS:[EBP+FFFEFEA8]
004265EE    E8 71D8FDFF     CALL UP1.00403E64
004265F3    E8 B0C0FDFF     CALL UP1.004026A8                        ; 取KEY文件的字节数
004265F8    53              PUSH EBX
004265F9    57              PUSH EDI
004265FA    56              PUSH ESI
004265FB    8D75 FC         LEA ESI,DWORD PTR SS:[EBP-4]
004265FE    8B0E            MOV ECX,DWORD PTR DS:[ESI]
00426600    8DB5 FCFFFEFF   LEA ESI,DWORD PTR SS:[EBP+FFFEFFFC]
00426606    8DBD FBFFFEFF   LEA EDI,DWORD PTR SS:[EBP+FFFEFFFB]
0042660C    31C0            XOR EAX,EAX                              ; EAX清空
0042660E    83CA FF         OR EDX,FFFFFFFF
00426611    31DB            XOR EBX,EBX
00426613    40              INC EAX                                  ; EAX+1
00426614    F7D2            NOT EDX
00426616    8A1C16          MOV BL,BYTE PTR DS:[ESI+EDX]             ; 取每个字节的值
00426619    84DB            TEST BL,BL                               ; 字节中的内容为0吗?
0042661B    74 29           JE SHORT UP1.00426646                    ; 为0就跳走。 (注意这里)
0042661D    E8 16000000     CALL UP1.00426638
00426622    52              PUSH EDX
00426623    F7E3            MUL EBX                                  ; EAX的值等于EAX*EBX
00426625    5A              POP EDX
00426626    35 326D5463     XOR EAX,63546D32                         ; EAX的值与63546D32做XOR运算
0042662B    FEC2            INC DL                                   ; DL=DL+1
0042662D    39CA            CMP EDX,ECX                              ; 计算完了吗?
0042662F    74 42           JE SHORT UP1.00426673                    ; 计算完了就跳走
00426631    80FA FF         CMP DL,0FF                               ; 如果DL的值(计算次数)超过0FF(255)也跳走
00426634    74 3D           JE SHORT UP1.00426673
00426636  ^ EB DE           JMP SHORT UP1.00426616                   ; 继续计算
这里很像算法,还十分的简单,好象成功就在眼前了。一般情况下就要开始一步一步跟踪,分析出具体的算法了。
但是在这里如果这样计算完以后,无一例外都会跳向失败
。这就是陷阱了。只要到这里就会失败。如何跳过这个陷阱呢?向上看那个需要注意的地方。
来到这里。。。
00426646    E8 EDFFFFFF     CALL UP1.00426638
0042664B    42              INC EDX                                  ; EDX=EDX+1
0042664C    83C2 04         ADD EDX,4                                ; EDX=EDX+4
0042664F    39D1            CMP ECX,EDX                              ; ECX=KEY文件的字节数。
00426651    75 20           JNZ SHORT UP1.00426673                   ; 文件的字节数与EDX的计算结果不相等就跳走
这里程序先使EDX=1,在给EDX+4,使EDX=5。然后再取用KEY文件的字节数与之比较。不相等就跳向失败。
所以,这段代码的作用就是对文件字节数的检测(阴。。。)。文件必须是5个字节。再修改文件,继续分析
来到这里。。。。。。
00426658   /76 02           JBE SHORT UP1.0042665C
0042665A   |D1E8            SHR EAX,1
0042665C   \3B0416          CMP EAX,DWORD PTR DS:[ESI+EDX]           ; EAX的值与字节内容向比较
0042665F    75 09           JNZ SHORT UP1.0042666A
00426661    B8 00000000     MOV EAX,0
00426666    8907            MOV DWORD PTR DS:[EDI],EAX
00426668    EB 10           JMP SHORT UP1.0042667A
0042666A    B8 01000000     MOV EAX,1
0042666F    8907            MOV DWORD PTR DS:[EDI],EAX
00426671    EB 07           JMP SHORT UP1.0042667A
省略一些代码。。。
0042667A    5E              POP ESI
0042667B    5F              POP EDI
0042667C    5B              POP EBX
0042667D    8A85 FBFFFEFF   MOV AL,BYTE PTR SS:[EBP+FFFEFFFB]
00426683    2C 01           SUB AL,1                                 ; 注意这里
00426685    72 08           JB SHORT UP1.0042668F                    ; 注意这里
00426687    74 4A           JE SHORT UP1.004266D3
00426689    FEC8            DEC AL
0042668B    74 58           JE SHORT UP1.004266E5
0042668D    EB 66           JMP SHORT UP1.004266F5
0042668F    BA 80674200     MOV EDX,UP1.00426780                     ; valid key file found!
00426694    8B83 B0010000   MOV EAX,DWORD PTR DS:[EBX+1B0]
0042669A    E8 F5B5FEFF     CALL UP1.00411C94
0042669F    BA A0674200     MOV EDX,UP1.004267A0                     ; registered to:
004266A4    8D85 A4FEFEFF   LEA EAX,DWORD PTR SS:[EBP+FFFEFEA4]
004266AA    E8 05CCFDFF     CALL UP1.004032B4
004266AF    8D85 A4FEFEFF   LEA EAX,DWORD PTR SS:[EBP+FFFEFEA4]
004266B5    8B95 F4FFFEFF   MOV EDX,DWORD PTR SS:[EBP+FFFEFFF4]
004266BB    E8 DCCCFDFF     CALL UP1.0040339C
004266C0    8B95 A4FEFEFF   MOV EDX,DWORD PTR SS:[EBP+FFFEFEA4]
004266C6    8B83 C0010000   MOV EAX,DWORD PTR DS:[EBX+1C0]
004266CC    E8 C3B5FEFF     CALL UP1.00411C94
004266D1    EB 22           JMP SHORT UP1.004266F5
004266D3    BA B8674200     MOV EDX,UP1.004267B8                     ; key file contains wrong serial!
004266D8    8B83 B0010000   MOV EAX,DWORD PTR DS:[EBX+1B0]
004266DE    E8 B1B5FEFF     CALL UP1.00411C94
004266E3    EB 10           JMP SHORT UP1.004266F5
004266E5    BA E0674200     MOV EDX,UP1.004267E0                     ; key file is not valid

注意以上代码中两个要注意的地方。这又是一个陷阱,如果KEY文件中包含0以外的内容,都会跳向失败。
所以KEY文件应该为
文件名: ctm_cm02.key
字节数:5
内容:
00000000:00 00 00 00 00

------------------------------------------------------------------------
还想总结一下算法,但是这里的算法居然是用来骗人的。不知如何是好
呵呵

2020安全开发者峰会(2020 SDC)议题征集 中国.北京 7月!

上传的附件:
最新回复 (7)
WAKU 7 2006-4-1 18:39
2
0
呵呵,逍遥风不应该今天弄这个CrackMe
爱在天涯 3 2006-4-1 19:17
3
0
分析的得很好! 支持!
逍遥风 55 2006-4-1 20:25
4
0
最初由 WAKU 发布
呵呵,逍遥风不应该今天弄这个CrackMe

呵呵~为什么呢,说说看
WAKU 7 2006-4-2 04:58
5
0
愚人节么难免会被骗
cmosa 2006-4-2 15:37
6
0
不错,值得学习
sltpgm 2013-3-22 22:36
7
0
”文件必须是5个字节“,这句是错的,
keyfile的格式为   用户名+00+4个字节
后面的4个字节是根据用户名算出来的,是明文比较,在比较的地方下断点
0042665C    3B0416          cmp     eax, dword ptr [esi+edx]

key示例:
00000000h: 70 65 64 69 79 00 D1 63 2B 63                   ; pediy.裞+c
曙光o 2014-8-8 16:53
8
0
这个怎么写进这个key文件,00转不成字符串.
游客
登录 | 注册 方可回帖
返回