【破文标题】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
------------------------------------------------------------------------
还想总结一下算法,但是这里的算法居然是用来骗人的。不知如何是好
呵呵
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!