首页
社区
课程
招聘
QHQPatchme #1 破解手记
发表于: 2004-11-11 21:07 11492

QHQPatchme #1 破解手记

2004-11-11 21:07
11492

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


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 7
支持
分享
最新回复 (11)
雪    币: 47147
活跃值: (20445)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
2
不要多个分论坛同时发。
2004-11-11 21:32
0
雪    币: 332
活跃值: (479)
能力值: ( LV9,RANK:330 )
在线值:
发帖
回帖
粉丝
3
不错!
2004-11-12 09:58
0
雪    币: 3686
活跃值: (1036)
能力值: (RANK:760 )
在线值:
发帖
回帖
粉丝
4
:D
2004-11-12 13:41
0
雪    币: 231
活跃值: (465)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
:)
2004-11-12 14:23
0
雪    币: 97697
活跃值: (200824)
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
6
支持!!!
2004-11-13 19:41
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
收藏
2004-11-14 01:01
0
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
SLI
8
2004-11-15 02:42
0
雪    币: 206
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
厉害!
2004-11-25 21:45
0
雪    币: 100
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
好,我喜欢,真希望自已做到。
2004-11-27 12:18
0
雪    币: 212
活跃值: (14)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
其实使得按钮可用,我有办法,用窗口激活大师就可以啦
2004-11-29 12:28
0
雪    币: 61
活跃值: (160)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
12
:D :D :D :D 好
2004-12-7 22:05
0
游客
登录 | 注册 方可回帖
返回
//