CRACKME分析(KEYFILE菜鸟巩固练习)
标 题: CRACKME分析(KEYFILE菜鸟巩固练习)作 者: 逍遥风
时 间: 2006-04-07,20:48:09
链 接: http://bbs.pediy.com/showthread.php?t=23785
【破文标题】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:,EAX
004014C3 .FF35 E9354000 PUSH DWORD PTR DS: ; /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: ; |hFile = 0000014C (window)
004014D9 .E8 1C010000 CALL <JMP.&KERNEL32.GetFileSize> ; \GetFileSize
004014DE .A3 ED354000 MOV DWORD PTR DS:,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: ; |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: ; /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:,5 ;循环左移
00401519 .8300 0F ADD DWORD PTR DS:,0F ;结果加上0F
0040151C .C148 04 07 ROR DWORD PTR DS:,7 ;取文件的后4个字节(倒序),并循环右移
00401520 .8368 04 05 SUB DWORD PTR DS:,5 ;结果减去5
00401524 .8178 04 BDD84>CMP DWORD PTR DS:,C642D8BD ;后4个字节的计算结果与C642D8BD相比较
0040152B .75 2A JNZ SHORT noodles-.00401557
0040152D .8138 FC098E2E CMP DWORD PTR DS:,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: ; |hWnd
00401547 .E8 62010000 CALL <JMP.&USER32.SetDlgItemTextA> ; \SetDlgItemTextA
0040154C .8B25 BD334000 MOV ESP,DWORD PTR DS:
00401552 .^ E9 CBFDFFFF JMP noodles-.00401322
------------------------------------------------------------------------
整个分析过程非常简单,但是这个KEYFILE的格式非常典型。很有代表性。
------------------------------------------------------------------------ 就喜欢这种教程!支持一个! 不错不错 跟着做一做 提高一下
页:
[1]