首页
社区
课程
招聘
[旧帖] [原创]爆破一个简单反调试的CrackMe.exe 0.00雪花
发表于: 2015-12-24 19:31 2028

[旧帖] [原创]爆破一个简单反调试的CrackMe.exe 0.00雪花

2015-12-24 19:31
2028
爆破一个简单反调试的CrackMe.exe

CrackMe.exe提供者:Pr0Zel
原帖见:http://bbs.pediy.com/showthread.php?t=12375
作者不仅提供了样例程序,而且提供了源码和破文。我之前学习的几个程序都未见源码,在此向作者致以谢意,感谢作者的无私共享精神!
首次接触反调试,不得其门而入,百度科普了一下。找到shellwolf大牛的文章,一并致谢。原文见http://bbs.pediy.com/showthread.php?t=70470
爆破之后学习了源码和破文看了跟帖,我的思路略有不同。下面开始爆破:
工具:od,winhex

1、爆破反调试1
00401719  |.  8B4C24 0C     mov     ecx, dword ptr [esp+C]
0040171D  |.  57            push    edi
0040171E  |.  51            push    ecx                                                    ; /FileName
0040171F  |.  FF15 04304000 call    dword ptr [<&KERNEL32.LoadLibraryA>]                   ; \LoadLibraryA
00401725  |.  68 EC404000   push    004040EC
0040172A  |.  8D4C24 14     lea     ecx, dword ptr [esp+14]
0040172E  |.  8BF8          mov     edi, eax
00401730  |.  E8 AD050000   call    <jmp.&MFC42.#860_CString::operator=>
00401735  |.  8B1D 00324000 mov     ebx, dword ptr [<&USER32.PostQuitMessage>]             ;  USER32.PostQuitMessage
0040173B  |.  85FF          test    edi, edi
0040173D  |.  74 2C         je      short 0040176B
0040173F  |.  33F6          xor     esi, esi
00401741  |>  8A5434 24     /mov     dl, byte ptr [esp+esi+24]
00401745  |.  8D4C24 10     |lea     ecx, dword ptr [esp+10]
00401749  |.  52            |push    edx
0040174A  |.  E8 C9050000   |call    <jmp.&MFC42.#940_CString::operator+=>
0040174F  |.  46            |inc     esi
00401750  |.  83FE 11       |cmp     esi, 11
00401753  |.^ 7C EC         \jl      short 00401741
00401755  |.  8B4424 10     mov     eax, dword ptr [esp+10]
00401759  |.  50            push    eax                                                    ; /ProcNameOrOrdinal
0040175A  |.  57            push    edi                                                    ; |hModule
0040175B  |.  FF15 00304000 call    dword ptr [<&KERNEL32.GetProcAddress>]                 ; \GetProcAddress
00401761  |.  FFD0          call    eax                                   ;调用IsDebuggerPresent检测是否被调试
00401763  |.  85C0          test    eax, eax
00401765      74 04         je      short 0040176B                        ;此处爆破
把文件偏移0x1765处字节7404改为EB04即可

2、爆破反调试2
爆破反调试1后继续运行,发现程序仍是一晃而退。显然作者还有反调试手段未破。
跟踪发现程序初始化时设置了定时器:
00401300   .  56            push    esi                                                    ;  MFC42.#1130_AfxDlgProc
00401301   .  57            push    edi
00401302   .  8BF1          mov     esi, ecx
00401304   .  E8 F1090000   call    <jmp.&MFC42.#4710_CDialog::OnInitDialog>
00401309   .  8B46 20       mov     eax, dword ptr [esi+20]
0040130C   .  6A 00         push    0                                                      ; /Timerproc = NULL
0040130E   .  68 F4010000   push    1F4                                                    ; |Timeout = 500. ms
00401313   .  6A 02         push    2                                                      ; |TimerID = 2
00401315   .  50            push    eax                                                    ; |hWnd
00401316   .  FF15 F4314000 call    dword ptr [<&USER32.SetTimer>]                         ; \SetTimer

锁定定时器:
00401A10   .  56            push    esi
00401A11   .  8BF1          mov     esi, ecx
00401A13   .  E8 28000000   call    00401A40                                ;反调试2
00401A18   .  85C0          test    eax, eax
00401A1A      75 07         jnz     short 00401A23                          ;此处爆破
00401A1C   .  50            push    eax                                                    ; /ExitCode
00401A1D   .  FF15 00324000 call    dword ptr [<&USER32.PostQuitMessage>]                  ; \PostQuitMessage
00401A23   >  8BCE          mov     ecx, esi
00401A25   .  E8 16000000   call    00401A40
00401A2A   .  8BCE          mov     ecx, esi
00401A2C   .  E8 CF020000   call    <jmp.&MFC42.#2379_CWnd::Default>
00401A31   .  5E            pop     esi
00401A32   .  C2 0400       retn    4

可以看到函数中有验证错误要求程序退出的代码,爆破。
把文件偏移0x1A1A处字节7507改为EB07即可

3、爆破注册
00401546   .  E8 D9070000   call    <jmp.&MFC42.#6334_CWnd::UpdateData>
0040154B   .  8B46 64       mov     eax, dword ptr [esi+64]
0040154E   .  8B2D D4314000 mov     ebp, dword ptr [<&MSVCRT._mbscmp>]                     ;  msvcrt._mbscmp
00401554   .  68 EC404000   push    004040EC                                               ; /s2 = ""
00401559   .  50            push    eax                                                    ; |s1
0040155A   .  FFD5          call    ebp                                                    ; \_mbscmp
0040155C   .  83C4 08       add     esp, 8
0040155F   .  85C0          test    eax, eax
00401561      74 7A         je      short 004015DD                          ;此处爆破

可以看到函数中有字符串比较,这个函数有多个爆破点,这儿是第一个。是用来验证用户名输入了没有的。你问我是怎么知道的,不修改继续运行看程序提示就知道了。
把文件偏移0x1561处字节747A改为EB45即可,至此爆破完毕。

4、爆破补漏
刚准备收工,按惯例上传之前测试一下。出洋相了,程序一闪而退。怎么回事?把爆破后的程序载入调试,原来反调试一还有一处需要爆破。
0040176D   .  E8 2E000000   call    004017A0
00401772   .  85C0          test    eax, eax
00401774   .  5F            pop     edi
00401775   .  75 03         jnz     short 0040177A       ;此处也要爆破

把文件偏移0x1775处字节7503改为EB03即可,至此爆破真正完毕。

这个示例是MFC框架程序,难点在于个功能函数定位。我是在系统调用丛林中苦苦寻找的,既耗时又费力还容易迷路。不知道其他同道有没有更简便的方法。
另外,反调试2在破解的时候进去看过,没看明白。后来看源码和跟帖才知道是CRC校验,惭愧!

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

上传的附件:
收藏
免费 0
支持
分享
最新回复 (2)
雪    币: 226
活跃值: (44)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
叼叼叼,正在学习中!!!
2015-12-24 19:38
0
雪    币: 106
活跃值: (25)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
谢谢捧场!

看见有兄弟捧场,兴致大增。再换一种思路爆破。
1、爆破反调试1
和一楼一样无变化。
2、爆破反调试2
此次换思路。见代码
0040171D  |.  57            push    edi
0040171E  |.  51            push    ecx                              ; /FileName
0040171F  |.  FF15 04304000 call    dword ptr [<&KERNEL32.LoadLibrar>; \LoadLibraryA
00401725  |.  68 EC404000   push    004040EC
0040172A  |.  8D4C24 14     lea     ecx, dword ptr [esp+14]
0040172E  |.  8BF8          mov     edi, eax
00401730  |.  E8 AD050000   call    <jmp.&MFC42.#860_CString::operat>
00401735  |.  8B1D 00324000 mov     ebx, dword ptr [<&USER32.PostQui>;  USER32.PostQuitMessage
0040173B  |.  85FF          test    edi, edi
0040173D  |.  74 2C         je      short 0040176B
0040173F  |.  33F6          xor     esi, esi
00401741  |>  8A5434 24     /mov     dl, byte ptr [esp+esi+24]
00401745  |.  8D4C24 10     |lea     ecx, dword ptr [esp+10]
00401749  |.  52            |push    edx
0040174A  |.  E8 C9050000   |call    <jmp.&MFC42.#940_CString::opera>
0040174F  |.  46            |inc     esi
00401750  |.  83FE 11       |cmp     esi, 11
00401753  |.^ 7C EC         \jl      short 00401741
00401755  |.  8B4424 10     mov     eax, dword ptr [esp+10]
00401759  |.  50            push    eax                              ; /ProcNameOrOrdinal
0040175A  |.  57            push    edi                              ; |hModule
0040175B  |.  FF15 00304000 call    dword ptr [<&KERNEL32.GetProcAdd>; \GetProcAddress
00401761  |.  FFD0          call    eax                          ;反调试1
00401763  |.  85C0          test    eax, eax
00401765      74 04         jmp     short 0040176B               ;已爆破反调试1
00401767  |.  6A 00         push    0
00401769  |.  FFD3          call    ebx
0040176B  |>  8BCD          mov     ecx, ebp
0040176D  |.  E8 2E000000   call    004017A0                     ;此处跟进

见代码
004017A0  /$  81EC 0C010000 sub     esp, 10C
004017A6  |.  8D4424 08     lea     eax, dword ptr [esp+8]
004017AA  |.  53            push    ebx
004017AB  |.  55            push    ebp
004017AC  |.  56            push    esi
004017AD  |.  68 04010000   push    104                              ; /BufSize = 104 (260.)
004017B2  |.  50            push    eax                              ; |PathBuffer
004017B3  |.  8BE9          mov     ebp, ecx                         ; |
004017B5  |.  6A 00         push    0                                ; |hModule = NULL
004017B7  |.  FF15 18304000 call    dword ptr [<&KERNEL32.GetModuleF>; \GetModuleFileNameA
004017BD  |.  6A 00         push    0                                ; /hTemplateFile = NULL
004017BF  |.  68 80000000   push    80                               ; |Attributes = NORMAL
004017C4  |.  6A 03         push    3                                ; |Mode = OPEN_EXISTING
004017C6  |.  6A 00         push    0                                ; |pSecurity = NULL
004017C8  |.  6A 01         push    1                                ; |ShareMode = FILE_SHARE_READ
004017CA  |.  8D4C24 28     lea     ecx, dword ptr [esp+28]          ; |
004017CE  |.  68 00000080   push    80000000                         ; |Access = GENERIC_READ
004017D3  |.  51            push    ecx                              ; |FileName
004017D4  |.  FF15 14304000 call    dword ptr [<&KERNEL32.CreateFile>; \CreateFileA
004017DA  |.  8BD8          mov     ebx, eax
004017DC  |.  83FB FF       cmp     ebx, -1
004017DF  |.  75 0C         jnz     short 004017ED
004017E1  |.  5E            pop     esi
004017E2  |.  5D            pop     ebp
004017E3  |.  33C0          xor     eax, eax
004017E5  |.  5B            pop     ebx
004017E6  |.  81C4 0C010000 add     esp, 10C
004017EC  |.  C3            retn
004017ED  |>  6A 00         push    0                                ; /pFileSizeHigh = NULL
004017EF  |.  53            push    ebx                              ; |hFile
004017F0  |.  FF15 10304000 call    dword ptr [<&KERNEL32.GetFileSiz>; \GetFileSize
004017F6  |.  8BF0          mov     esi, eax
004017F8  |.  83FE FF       cmp     esi, -1
004017FB  |.  75 0C         jnz     short 00401809
004017FD  |.  5E            pop     esi
004017FE  |.  5D            pop     ebp
004017FF  |.  33C0          xor     eax, eax
00401801  |.  5B            pop     ebx
00401802  |.  81C4 0C010000 add     esp, 10C
00401808  |.  C3            retn
00401809  |>  57            push    edi
0040180A  |.  56            push    esi
0040180B  |.  E8 1A050000   call    <jmp.&MFC42.#823_operator new>
00401810  |.  83C4 04       add     esp, 4
00401813  |.  8D5424 14     lea     edx, dword ptr [esp+14]
00401817  |.  8BF8          mov     edi, eax
00401819  |.  6A 00         push    0                                ; /pOverlapped = NULL
0040181B  |.  52            push    edx                              ; |pBytesRead
0040181C  |.  56            push    esi                              ; |BytesToRead
0040181D  |.  57            push    edi                              ; |Buffer
0040181E  |.  53            push    ebx                              ; |hFile
0040181F  |.  FF15 0C304000 call    dword ptr [<&KERNEL32.ReadFile>] ; \ReadFile
00401825  |.  53            push    ebx                              ; /hObject
00401826  |.  FF15 08304000 call    dword ptr [<&KERNEL32.CloseHandl>; \CloseHandle
0040182C  |.  8A47 3C       mov     al, byte ptr [edi+3C]
0040182F  |.  884424 10     mov     byte ptr [esp+10], al
00401833  |.  8B4424 10     mov     eax, dword ptr [esp+10]
00401837  |.  25 FF000000   and     eax, 0FF
0040183C  |.  2BF0          sub     esi, eax
0040183E  |.  8D0C38        lea     ecx, dword ptr [eax+edi]
00401841  |.  56            push    esi
00401842  |.  51            push    ecx
00401843  |.  8B79 FC       mov     edi, dword ptr [ecx-4]
00401846  |.  8BCD          mov     ecx, ebp
00401848  |.  E8 23000000   call    00401870                ;核心校验,跟进
见代码
00401870  /$  81EC 00040000 sub     esp, 400
00401876  |.  33C9          xor     ecx, ecx
00401878  |.  8D5424 00     lea     edx, dword ptr [esp]
0040187C  |.  56            push    esi
0040187D  |>  8BC1          /mov     eax, ecx
0040187F  |.  BE 08000000   |mov     esi, 8
00401884  |>  A8 01         |/test    al, 1
00401886  |.  74 09         ||je      short 00401891
00401888  |.  D1E8          ||shr     eax, 1
0040188A  |.  35 2083B8ED   ||xor     eax, EDB88320
0040188F  |.  EB 02         ||jmp     short 00401893
00401891  |>  D1E8          ||shr     eax, 1
00401893  |>  4E            ||dec     esi
00401894  |.^ 75 EE         |\jnz     short 00401884
00401896  |.  8902          |mov     dword ptr [edx], eax
00401898  |.  41            |inc     ecx
00401899  |.  83C2 04       |add     edx, 4
0040189C  |.  81F9 00010000 |cmp     ecx, 100
004018A2  |.^ 7C D9         \jl      short 0040187D
004018A4  |.  8B8C24 0C0400>mov     ecx, dword ptr [esp+40C]
004018AB  |.  83C8 FF       or      eax, FFFFFFFF
004018AE  |.  8BD1          mov     edx, ecx
004018B0  |.  49            dec     ecx
004018B1  |.  85D2          test    edx, edx
004018B3  |.  74 27         je      short 004018DC
004018B5  |.  8D71 01       lea     esi, dword ptr [ecx+1]
004018B8  |.  8B8C24 080400>mov     ecx, dword ptr [esp+408]
004018BF  |.  53            push    ebx
004018C0  |>  8BD0          /mov     edx, eax
004018C2  |.  33DB          |xor     ebx, ebx
004018C4  |.  8A19          |mov     bl, byte ptr [ecx]
004018C6  |.  81E2 FF000000 |and     edx, 0FF
004018CC  |.  33D3          |xor     edx, ebx
004018CE  |.  C1E8 08       |shr     eax, 8
004018D1  |.  8B5494 08     |mov     edx, dword ptr [esp+edx*4+8]
004018D5  |.  33C2          |xor     eax, edx
004018D7  |.  41            |inc     ecx
004018D8  |.  4E            |dec     esi
004018D9  |.^ 75 E5         \jnz     short 004018C0
004018DB  |.  5B            pop     ebx
004018DC      F7D0          not     eax       ;此处爆破
把文件偏移0x18DC处字节F7D0改为8BC7即可

3、爆破注册
和一楼一样无变化。

爆破反调试2的思路变化带来的好处就是不用千辛万苦寻找定时器响应函数了。我当初找得好辛苦。
上传的附件:
2015-12-24 22:19
0
游客
登录 | 注册 方可回帖
返回
//