QHQPatchme #1 破解手记
发表于:
2004-11-11 21:07
11491
QHQPatchme #1 破解手记
破解目标:QHQPatchme #1
工具:Ollydbg、FI、C32Asm
难度:极易
下载地址:http://www.crackmes.de/users/qhqcrk...mi_no2/download
作者:hefei2
QHQPatchme #1是一个非常简单的Patchme(在Crackmes.de上它被定为1级),如果您有一定的破解经历的话,我想您一定也可以自己完成它,您也就没有必要在我的文章上面浪费时间了。
我只是一个破解的新手,刚刚入门几天,如果有什么不恰当的地方还请高手们批评指正。
首先用FI检测,得到的结果是:PE Win32 GUI ,看来没有加壳,看来可以省掉一大堆脱壳的步骤了。
运行程序,得到作者给我的任务:
1.Patch this nag.
2.Patch the BADBOY static.
3.*Make Exit button is Visible.
用C32Asm打开作初步的分析:
::00401000:: 6A 00 PUSH 0
::00401002:: E8 2B050000 CALL 00401532 \:JMPDOWN >>>: KERNEL32.DLL:得到模块句柄
::00401007:: A3 40324000 MOV [403240],EAX
::0040100C:: 68 F4010000 PUSH 1F4
::00401011:: FF35 40324000 PUSH DWORD PTR [403240]
::00401017:: E8 40050000 CALL 0040155C \:JMPDOWN >>>: USER32.DLL:LoadIconA
::0040101C:: E8 F8040000 CALL 00401519 \:JMPDOWN
::00401021:: 6A 00 PUSH 0
::00401023:: 68 EB304000 PUSH 4030EB \->: Hi
::00401028:: 68 56304000 PUSH 403056 \->: Hello newbiez world. Try with me!\x0ARulez :\x0A 1. Patch this nag.\x0A 2. Patch the BADBOY static\x0A 3* Make Exit button is Visible.\x0A\x0A Hope you fun with me...
::0040102D:: 6A 00 PUSH 0
::0040102F:: E8 2E050000 CALL 00401562 \:JMPDOWN >>>: USER32.DLL:MessageBoxA
::00401034:: E8 0B050000 CALL 00401544 \:JMPDOWN >>>: KERNEL32.DLL:IsDebuggerPresent
::00401039:: 0BC0 OR EAX,EAX
::0040103B:: 74 07 JE SHORT 00401044 \:JMPDOWN
由于C32Asm已经为我添加了必要的注释,所以很容易就可以看出从401021到40102F是需要去除的nag窗口的代码,只需要把它们用nop替换了就可以了。可以直接在C32Asm中用Hex方式将偏移421处到433处的19个字节用90填充。再次反汇编就可以看到,从401021到401033已经全部变成了nop。再次运行程序,nag已被清除。
继续分析后面的代码:
::00401034:: E8 0B050000 CALL 00401544 \:JMPDOWN >>>: KERNEL32.DLL:IsDebuggerPresent
::00401039:: 0BC0 OR EAX,EAX
::0040103B:: 74 07 JE SHORT 00401044 \:JMPDOWN
::0040103D:: C605 01304000 01 MOV BYTE PTR [403001],1
::00401044:: E8 06000000 CALL 0040104F \:JMPDOWN\:BYJMP JmpBy:0040103B,
……
::0040104F:: 803D 00304000 01 CMP BYTE PTR [403000],1 \:BYCALL CallBy:00401044,
::00401056:: 0F85 A5010000 JNZ 00401201 \:JMPDOWN
::0040105C:: 803D 01304000 01 CMP BYTE PTR [403001],1
::00401063:: 0F85 98010000 JNZ 00401201 \:JMPDOWN
……
可以看出,这是一个简单的Anti-Debug,顺手破了它。将偏移43B处的74改为EB,即把JE改为JMP,使IsDebuggerPresent()函数侦测的结果不起作用。
用Hex方式查看文件,发现在偏移D97处到DC0处是字符串:--> Patch this message to good message <--这正是需要修改的内容,只需要把它用我们希望的字符串替换就可以了,我在这里把它改为:-----------------hEfEi2-------------------
再次运行程序,修改已经成功。
作者的最后一个要求是使得Exit button可用。在写程序时如果要使一个button不可用,需要把它的风格指定为WS_CHILD | WS_DISABLED,于是查阅winuser.h中的定义,知道WS_CHILD=0x50000000,WS_DISABLED=0x8000000,WS_CHILD | WS_DISABLED=0x58000000。于是查看代码,发现在:
::004013E7:: C707 00000058 MOV DWORD PTR [EDI],58000000
的这段代码十分可疑,于是将58000000改成50000000,即去掉WS_DISABLED风格。
运行程序,按钮还是不可用。仔细查看了代码几次,再没有发现其他可疑的地方,无奈中想用Ollydbg动态调试试试看。在Ollydbg中加载后,赫然发现居然在4013E7处还是58000000:
004013C0 |. 57 push edi ; |WideCharBuf
004013C1 |. 6A FF push -1 ; |StringSize = FFFFFFFF (-1.)
004013C3 |. 68 02324000 push QHQPatch.00403202 ; |StringToMap = "----------------------------"
004013C8 |. 6A 01 push 1 ; |Options = MB_PRECOMPOSED
004013CA |. 6A 00 push 0 ; |CodePage = CP_ACP
004013CC |. E8 79010000 call <jmp.&kernel32.MultiByteToWideC>; \MultiByteToWideChar
004013D1 |. 83C7 3A add edi,3A
004013D4 |. 83C7 01 add edi,1
004013D7 |. D1EF shr edi,1
004013D9 |. D1E7 shl edi,1
004013DB |. 83C7 02 add edi,2
004013DE |. 83C7 03 add edi,3
004013E1 |. C1EF 02 shr edi,2
004013E4 |. C1E7 02 shl edi,2
004013E7 |. C707 00000058 mov dword ptr ds:[edi],58000000 ;<----这是怎么回事???
004013ED |. 66:C747 08 3000 mov word ptr ds:[edi+8],30
004013F3 |. 66:C747 0A 3A00 mov word ptr ds:[edi+A],3A
004013F9 |. 66:C747 0C 3200 mov word ptr ds:[edi+C],32
004013FF |. 66:C747 0E 0C00 mov word ptr ds:[edi+E],0C
00401405 |. 66:C747 10 0200 mov word ptr ds:[edi+10],2
于是决定跟踪看看,就在401002处下断点,单步跟踪,在40101C处发现了一个奇怪的函数调用,看来刚才是粗心了:
00401000 Q>/$ 6A 00 push 0 ; /pModule = NULL
00401002 |. E8 2B050000 call <jmp.&kernel32.GetModuleHandleA>; \GetModuleHandleA
00401007 |. A3 40324000 mov dword ptr ds:[403240],eax
0040100C |. 68 F4010000 push 1F4 ; /RsrcName = 500.
00401011 |. FF35 40324000 push dword ptr ds:[403240] ; |hInst = NULL
00401017 |. E8 40050000 call <jmp.&user32.LoadIconA> ; \LoadIconA
0040101C |. E8 F8040000 call QHQPatch.00401519 ; <-----在这里调用它做什么?十分可疑!
于是跟入:
00401519 /$ BF EC134000 mov edi,QHQPatch.004013EC
0040151E |. 8D35 EE304000 lea esi,dword ptr ds:[4030EE]
00401524 |. B9 01000000 mov ecx,1
00401529 |. F3:A4 rep movs byte ptr es:[edi],byte ptr >
0040152B \. C3 retn
原来真是它在搞鬼,它将4013EC处即把50000000的50改成了4030EE的值。
查看4030EE发现是字符X。查看ASCII表,X的值为0x58,使用Ollydbg的数据编辑功能,把0x58改为0x50即字符P,并复制到可执行文件。
再次运行,Exit button变为可用!
单击,弹出对话框:
i.c. i.c. You become a newbiez (if you want it)!!!
See s. t in crackme???
成功!!!
hefei2 [hefei2@21cn.com]
2004.11.11 21:00
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!