一.abex’crackme1

调试前先运行abex’crackme #1这个程序,大致了解一下它。双击运行程序后弹出一个消息窗口,显示“Make me think your HD is a CD-Rom”消息。不太理解这句英文。消息的最后部分出现了“CD-Rom”这个词,我们只能根据它大致推测出前面的HD为HDD(Hard Disk Drive)的意思。由于没有更多选择,我们继续按消息窗口中的“确定”按钮。

1

程序弹出Error消息窗后就终止运行了。但是abex到底想要干什么(要怎样破解什么)仍然不得而知。下面直接调试分析它,把握这个小程序的意图。

2

二.开始调试

3

由于代码非常简短,我们一点点地分析,重点看右上部分关于Win32 API调用的内容。如果之前大家从事过Windows应用程序的开发,那么对以上几个函数的含义应该非常了解。从上述代码的分析中,我们能够准确把握程序制作者的真正意图。在消息窗口按“确定”后,程序会调用GetDriveType() API,获取C驱动器的类型(大部分返回的是HDD类型),然后操作它,使之被识别为CD-ROM类型,再在消息窗口中输出“OK, I really think that your HD is a CD-ROM!:p”消息。下面逐行分析crackme的代码。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
;调用NessageBoxA()函数00401000 PUSH 0
00404000 PUSH 0 ;Style =MB_OKIMB_APPLMODAL
00401002 PUSH 402000 ;Title = "abex1st crackme”
00401007 PUSH 402012 ;Text =“Make me think your HD is a CD-Rom.”
0040100c PUSH 0 ; hOwner - NULL
0040100E CALL 00401061 ; MessageBoxA
:在函数肉部ESI被设置为FFFFFFFF
;调用GetDriveType()函数
00401013 PUSH 402094 ;RootPathName = "c: 1”
00401018 CALL 00401055 ; GetDriveTypeA
;返回值(EAX)是3(DRIVE_FIXED)
0040101D INC ESI ; ESI =0
0040101E DEC EAX ;EAX =2
0040101F JMP SHORT 00401021
00401021 INC ESI ;ESI = 1
00401022 INC ESI ;ESI =2
00401023 DEC EAX ;EAX=1

;条件分支(401028或40103D)
00401024 CMP EAX,ESI ;比较EAX(1)与EAX(2)
00401026 JE SHORT 0040103D ;JE (Jump if Equal)条件分支命令;若两值相等,则跳转到40103D,
;若两值不等,则从401028继续执行;在40103D地址为消息框输出代码

;MessageBo×A()函数调用失败
00401028 PUSH 0 ; Style = MB_OK|MB_APPLMODAL
0040102A PUSH 402035 ;Title = "Error”
0040102F PUSH 40203B :Text -"Nah. . . This is not a CD-ROM Drive!"
00401034 PUSH 0 ;hOwner - NULL
00401036 CALL 00401061 ; MessageBoxA
0040103B JMP SHORT 00401050

;MessageBoxA(函数调用成功
0040103D PUSH 0 ;Style=MB_OKIMB_APPLMODAL
0040103F PUSH 40205E ; Title = "YEAH!"
00401044 PUSH 402064 ;Text -"Ok,Ireally think that your HDis a CD-ROM! :p”
00401049 PUSH 0 ;hOwner = NULL
0040104B CALL 00401061 ;MessageBoxA

;终止进程
00401050 CALL 0040105B ;ExitProcess

可以看到就是通过比较AX和SI的值,等于就跳转,只需要把JE修改为无条件跳转指令JMP就可以了

4

得到最后的结果。