-
-
CRACKME分析(KEYFILE菜鸟巩固练习)
-
发表于:
2006-4-7 20:48
10132
-
【破文标题】CRACKME分析(KEYFILE菜鸟巩固练习)
【破文作者】逍遥风
【破解工具】winHex,OD
【破解平台】winxp
【破解声明】基本没什么技术含量,主要是熟练一下对付KEYFILE的套路。
1)用OD载入这个CRACKME,第一步还是先寻找文件名。
用字符串查找的方法会比较快,当然也可以再命令行下断bp ReadFile 或 bp CreateFileA
用字符串查找,找到ketfile not present\n\nor incorrec。很容易来到这里
------------------------------------------------------------------------00401557 > 6A 00 PUSH 0 ; /Style = MB_OK|MB_APPLMODAL
00401559 . 68 63364000 PUSH noodles-.00403663 ; |error!
0040155E . 68 6A364000 PUSH noodles-.0040366A ; |ketfile not present\n\nor incorrect
00401563 . 6A 00 PUSH 0 ; |hOwner = NULL
00401565 . E8 4A010000 CALL <JMP.&USER32.MessageBoxA> ; \MessageBoxA
------------------------------------------------------------------------
向上找找到有CreateFileA字样的地方
在这里找到了。。。并在这里下断
004014AB . 68 F1354000 PUSH noodles-.004035F1 ; |spook.key
004014B0 . E8 6F010000 CALL <JMP.&KERNEL32.CreateFileA> ; \CreateFileA (下断)
004014B5 . 83F8 FF CMP EAX,-1 ; 检查有spook.key这个文件吗?
004014B8 . 0F84 99000000 JE noodles-.00401557 ; 没有就跳向失败
这段代码是对KEY文件是否存在进行一个检测。注释信息的‘spook.key’就是KEY文件的文件名了。
现在,只需用WINHEX建立一个名位spook.key的文件就可以继续分析了
------------------------------------------------------------------------
004014BE . A3 E9354000 MOV DWORD PTR DS:[4035E9],EAX
004014C3 . FF35 E9354000 PUSH DWORD PTR DS:[4035E9] ; /hFile = 0000014C
004014C9 . E8 32010000 CALL <JMP.&KERNEL32.GetFileType> ; \GetFileType
004014CE . 68 FB354000 PUSH noodles-.004035FB ; /pFileSizeHigh = noodles-.004035FB
004014D3 . FF35 E9354000 PUSH DWORD PTR DS:[4035E9] ; |hFile = 0000014C (window)
004014D9 . E8 1C010000 CALL <JMP.&KERNEL32.GetFileSize> ; \GetFileSize
004014DE . A3 ED354000 MOV DWORD PTR DS:[4035ED],EAX ; 检查文件字节数
004014E3 . 83F8 08 CMP EAX,8 ; 字节为8吗?
004014E6 . 75 6F JNZ SHORT noodles-.00401557 ; 不为8就跳向失败
这段代码是检测文件的字节数的,这个CRACKME所要的KEY文件的字节数必须为8。所以还是用WINHEX把刚才建立的
文件字节数定为8,就可以继续分析了。
----------------------------------------------------------------------
经过前两关。下面开始对文件的内容进行计算和检验。
004014E8 . 6A 00 PUSH 0 ; /pOverlapped = NULL
004014EA . 68 FB354000 PUSH noodles-.004035FB ; |pBytesRead = noodles-.004035FB
004014EF . 50 PUSH EAX ; |BytesToRead
004014F0 . 68 FF354000 PUSH noodles-.004035FF ; |Buffer = noodles-.004035FF
004014F5 . FF35 E9354000 PUSH DWORD PTR DS:[4035E9] ; |hFile = 0000014C (window)
004014FB . E8 BE000000 CALL <JMP.&KERNEL32.ReadFile> ; \ReadFile
00401500 . 85C0 TEST EAX,EAX ; 开始读取文件内容
00401502 . 74 53 JE SHORT noodles-.00401557
00401504 . 33C0 XOR EAX,EAX ; EAX清空
00401506 . FF35 E9354000 PUSH DWORD PTR DS:[4035E9] ; /hObject = 0000014C (window)
0040150C . E8 A7000000 CALL <JMP.&KERNEL32.CloseHandle> ; \CloseHandle
00401511 . B8 FF354000 MOV EAX,noodles-.004035FF ; 取文件的前4个字节(倒序)
00401516 . C100 05 ROL DWORD PTR DS:[EAX],5 ; 循环左移
00401519 . 8300 0F ADD DWORD PTR DS:[EAX],0F ; 结果加上0F
0040151C . C148 04 07 ROR DWORD PTR DS:[EAX+4],7 ; 取文件的后4个字节(倒序),并循环右移
00401520 . 8368 04 05 SUB DWORD PTR DS:[EAX+4],5 ; 结果减去5
00401524 . 8178 04 BDD84>CMP DWORD PTR DS:[EAX+4],C642D8BD ; 后4个字节的计算结果与C642D8BD相比较
0040152B . 75 2A JNZ SHORT noodles-.00401557
0040152D . 8138 FC098E2E CMP DWORD PTR DS:[EAX],2E8E09FC ; 前4个字节的运算结果与2E8E09FC相比较
可以看出程序对文件内容的计算和检测是分段进行的。
计算也很简单,就是循环左移,循环右移。在加,减一下
把后四个字节的内容进行计算后将结果与C642D8BD比较
再把前四个字节的内容进行计算后将结果与2E8E09FC比较
如果两段都相等就成功。
------------------------------------------------------------------------
00401533 . 75 22 JNZ SHORT noodles-.00401557
00401535 . 68 88130000 PUSH 1388
0040153A . 68 94334000 PUSH noodles-.00403394 ; /your keyfile is fine happy happy joy joy
0040153F . 68 8B130000 PUSH 138B ; |ControlID = 138B (5003.)
00401544 . FF75 08 PUSH DWORD PTR SS:[EBP+8] ; |hWnd
00401547 . E8 62010000 CALL <JMP.&USER32.SetDlgItemTextA> ; \SetDlgItemTextA
0040154C . 8B25 BD334000 MOV ESP,DWORD PTR DS:[4033BD]
00401552 .^ E9 CBFDFFFF JMP noodles-.00401322
------------------------------------------------------------------------
整个分析过程非常简单,但是这个KEYFILE的格式非常典型。很有代表性。
------------------------------------------------------------------------
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!