crackme#15 解析手引き



今回はアンチデバッガがついたパス入力です。
動作確認するためにまずは、crkme15.exeだけを起動してみましょう。
crackme #15のウィンドウが表示され、パス入力状態になります。

では、一度終了させ、OllyDbgを起動させたあとcrkme15.exeを起動して
エラー画面(OllyDbgを検出しました)が出力されたかと思います。
OKボタンを押して終了させて下さい。

エラーは、メッセージボックスだったのでまずは、MessageBoxAを探します。
OllyDBGを、起動して「crkme15.exe」を読込んでください。

CPUウィンドウで、右クリックをして、
「検索」→「ラベル一覧」(「Search for」→「Name(Label)」)で、ラベル一覧の一覧を表示します。

Names in CRKME15
Address Section Type (Known) Name Comment
00401000 .text Export <ModuleEntryPoint>
00402000 .rdata Import (Known) KERNEL32.lstrlenA
00402004 .rdata Import (Known) KERNEL32.lstrcmpA
00402008 .rdata Import (Known) KERNEL32.ExitProcess
0040200C .rdata Import (Known) KERNEL32.CreateFileA
00402010 .rdata Import (Known) KERNEL32.GetModuleHandleA
00402014 .rdata Import (Known) KERNEL32.CloseHandle
0040201C .rdata Import (Known) USER32.LoadIconA
00402020 .rdata Import (Known) USER32.GetClassNameA
00402024 .rdata Import (Known) USER32.GetDlgItemTextA
00402028 .rdata Import (Known) USER32.SendMessageA
0040202C .rdata Import (Known) USER32.SetDlgItemTextA
00402030 .rdata Import (Known) USER32.GetWindowTextA
00402034 .rdata Import (Known) USER32.GetDlgItem
00402038 .rdata Import (Known) USER32.EnableWindow
0040203C .rdata Import (Known) USER32.EnumWindows
00402040 .rdata Import (Known) USER32.EndDialog
00402044 .rdata Import (Known) USER32.MessageBeep
00402048 .rdata Import (Known) USER32.DialogBoxParamA
0040204C .rdata Import (Known) USER32.MessageBoxA


0040204C .rdata Import (Known) USER32.MessageBoxA
を選択して、「Enter」キーを押してください。
「References in crkme15:.text to USER32.MessageBoxA」というウィンドウが表示されます。

References in CRKME15:.text to USER32.MessageBoxA
Address Disassembly Comment
004013DF CALL <JMP.&USER32.MessageBoxA>
0040143E JMP DWORD PTR DS:[<&USER32.MessageBoxA>]


004013DF CALL <JMP.&USER32.MessageBoxA>

をダブルクリックすると、CPUウィンドウに移ります。

00401000 > $ 6A 00 PUSH 0 ; /pModule = NULL
00401002 . E8 5B040000 CALL <JMP.&KERNEL32.GetModuleHandleA> ; \GetModuleHandleA
00401007 . A3 6A304000 MOV DWORD PTR DS:[40306A],EAX
0040100C . 6A 00 PUSH 0 ; /lParam = NULL
0040100E . 68 FD114000 PUSH CRKME15.004011FD ; |DlgProc = CRKME15.004011FD
00401013 . 6A 00 PUSH 0 ; |hOwner = NULL
00401015 . 6A 01 PUSH 1 ; |pTemplate = 1
00401017 . FF35 6A304000 PUSH DWORD PTR DS:[40306A] ; |hInst = NULL
0040101D . E8 E0030000 CALL <JMP.&USER32.DialogBoxParamA> ; \DialogBoxParamA
00401022 . 50 PUSH EAX ; /ExitCode
00401023 . E8 34040000 CALL <JMP.&KERNEL32.ExitProcess> ; \ExitProcess
00401028 . 55 PUSH EBP
00401029 . 8BEC MOV EBP,ESP
0040102B . 53 PUSH EBX
0040102C . 56 PUSH ESI
0040102D . 57 PUSH EDI
0040102E . 837D 0C 10 CMP DWORD PTR SS:[EBP+C],10
00401032 . 75 0C JNZ SHORT CRKME15.00401040
00401034 > 6A 00 PUSH 0 ; /Result = 0
00401036 . FF75 08 PUSH DWORD PTR SS:[EBP+8] ; |hWnd
00401039 . E8 D0030000 CALL <JMP.&USER32.EndDialog> ; \EndDialog
0040103E . EB 4C JMP SHORT CRKME15.0040108C
00401040 > 817D 0C 11010000 CMP DWORD PTR SS:[EBP+C],111
00401047 . 75 0C JNZ SHORT CRKME15.00401055
00401049 . 66:817D 10 EB03 CMP WORD PTR SS:[EBP+10],3EB
0040104F . 75 3B JNZ SHORT CRKME15.0040108C
00401051 .^EB E1 JMP SHORT CRKME15.00401034
00401053 . EB 37 JMP SHORT CRKME15.0040108C
00401055 > 817D 0C 10010000 CMP DWORD PTR SS:[EBP+C],110
0040105C . 75 2E JNZ SHORT CRKME15.0040108C
0040105E . EB 06 JMP SHORT CRKME15.00401066
00401060 . 41 62 6F 75 74 00>ASCII "About",0
00401066 > 68 60104000 PUSH CRKME15.00401060 ; /lParam = 401060
0040106B . 6A 00 PUSH 0 ; |wParam = 0
0040106D . 6A 0C PUSH 0C ; |Message = WM_SETTEXT
0040106F . FF75 08 PUSH DWORD PTR SS:[EBP+8] ; |hWnd
00401072 . E8 CD030000 CALL <JMP.&USER32.SendMessageA> ; \SendMessageA
00401077 . FF35 6E304000 PUSH DWORD PTR DS:[40306E] ; /lParam = 0
0040107D . 6A 01 PUSH 1 ; |wParam = 1
0040107F . 68 80000000 PUSH 80 ; |Message = WM_SETICON
00401084 . FF75 08 PUSH DWORD PTR SS:[EBP+8] ; |hWnd
00401087 . E8 B8030000 CALL <JMP.&USER32.SendMessageA> ; \SendMessageA
0040108C > 5F POP EDI
0040108D . 5E POP ESI
0040108E . 5B POP EBX
0040108F . 33C0 XOR EAX,EAX
00401091 . C9 LEAVE
00401092 . C2 1000 RETN 10
00401095 /. 55 PUSH EBP
00401096 |. 8BEC MOV EBP,ESP
00401098 |. 68 FF000000 PUSH 0FF ; /Count = FF (255.)
0040109D |. 68 04314000 PUSH CRKME15.00403104 ; |Buffer = CRKME15.00403104
004010A2 |. FF75 08 PUSH DWORD PTR SS:[EBP+8] ; |hWnd
004010A5 |. E8 70030000 CALL <JMP.&USER32.GetClassNameA> ; \GetClassNameA
004010AA |. 68 FF000000 PUSH 0FF ; /Count = FF (255.)
004010AF |. 68 04314000 PUSH CRKME15.00403104 ; |Buffer = CRKME15.00403104
004010B4 |. FF75 08 PUSH DWORD PTR SS:[EBP+8] ; |hWnd
004010B7 |. E8 70030000 CALL <JMP.&USER32.GetWindowTextA> ; \GetWindowTextA
004010BC |. 85C0 TEST EAX,EAX
004010BE |. 74 36 JE SHORT CRKME15.004010F6
004010C0 |. 68 73304000 PUSH CRKME15.00403073 ; /String = ""
004010C5 |. E8 A4030000 CALL <JMP.&KERNEL32.lstrlenA> ; \lstrlenA
004010CA |. C680 04314000 00 MOV BYTE PTR DS:[EAX+403104],0
004010D1 |. 68 04314000 PUSH CRKME15.00403104 ; /String2 = ""
004010D6 |. 68 73304000 PUSH CRKME15.00403073 ; |String1 = ""
004010DB |. E8 88030000 CALL <JMP.&KERNEL32.lstrcmpA> ; \lstrcmpA
004010E0 |. 85C0 TEST EAX,EAX
004010E2 |. 75 12 JNZ SHORT CRKME15.004010F6
004010E4 |. C605 72304000 01 MOV BYTE PTR DS:[403072],1
004010EB |. B8 01000000 MOV EAX,1
004010F0 |. 33C0 XOR EAX,EAX
004010F2 |. C9 LEAVE
004010F3 |. C2 0800 RETN 8
004010F6 |> B8 01000000 MOV EAX,1
004010FB |. C9 LEAVE
004010FC \. C2 0800 RETN 8
004010FF /$ 55 PUSH EBP
00401100 |. 8BEC MOV EBP,ESP
00401102 |. 8B75 08 MOV ESI,DWORD PTR SS:[EBP+8]
00401105 |. B9 0C000000 MOV ECX,0C
0040110A |> 807431 FF 5C /XOR BYTE PTR DS:[ECX+ESI-1],5C
0040110F |.^E2 F9 \LOOPD SHORT CRKME15.0040110A
00401111 |. 6A 00 PUSH 0 ; /hTemplateFile = NULL
00401113 |. 68 80000000 PUSH 80 ; |Attributes = NORMAL
00401118 |. 6A 03 PUSH 3 ; |Mode = OPEN_EXISTING
0040111A |. 6A 00 PUSH 0 ; |pSecurity = NULL
0040111C |. 6A 01 PUSH 1 ; |ShareMode = FILE_SHARE_READ
0040111E |. 68 000000C0 PUSH C0000000 ; |Access = GENERIC_READ|GENERIC_WRITE
00401123 |. FF75 08 PUSH DWORD PTR SS:[EBP+8] ; |FileName
00401126 |. E8 2B030000 CALL <JMP.&KERNEL32.CreateFileA> ; \CreateFileA
0040112B |. 83F8 FF CMP EAX,-1
0040112E |. 74 0F JE SHORT CRKME15.0040113F
00401130 |. 50 PUSH EAX ; /hObject
00401131 |. E8 1A030000 CALL <JMP.&KERNEL32.CloseHandle> ; \CloseHandle
00401136 |. B8 01000000 MOV EAX,1
0040113B |. C9 LEAVE
0040113C |. C2 0400 RETN 4
0040113F |> 33C0 XOR EAX,EAX
00401141 |. C9 LEAVE
00401142 \. C2 0400 RETN 4
00401145 /$ 55 PUSH EBP
00401146 |. 8BEC MOV EBP,ESP
00401148 |. C605 83304000 00 MOV BYTE PTR DS:[403083],0
0040114F |. 6A 7E PUSH 7E ; /Count = 7E (126.)
00401151 |. 68 84304000 PUSH CRKME15.00403084 ; |Buffer = CRKME15.00403084
00401156 |. 6A 64 PUSH 64 ; |ControlID = 64 (100.)
00401158 |. FF75 08 PUSH DWORD PTR SS:[EBP+8] ; |hWnd
0040115B |. E8 C6020000 CALL <JMP.&USER32.GetDlgItemTextA> ; \GetDlgItemTextA
00401160 |. 83E8 0F SUB EAX,0F
00401163 |. 83F8 01 CMP EAX,1
00401166 |. B8 01000000 MOV EAX,1
0040116B |. 83D0 FF ADC EAX,-1
0040116E |. 85C0 TEST EAX,EAX
00401170 |. 74 46 JE SHORT CRKME15.004011B8
00401172 |. B9 05000000 MOV ECX,5
00401177 |> 0FBE044D 82304000 /MOVSX EAX,BYTE PTR DS:[ECX*2+403082]
0040117F |. 0FBE1C4D 83304000 |MOVSX EBX,BYTE PTR DS:[ECX*2+403083]
00401187 |. 03C3 |ADD EAX,EBX
00401189 |. 33D2 |XOR EDX,EDX
0040118B |. F7E1 |MUL ECX
0040118D |. 83E0 4F |AND EAX,4F
00401190 |. 3A81 8D304000 |CMP AL,BYTE PTR DS:[ECX+40308D]
00401196 |. 75 20 |JNZ SHORT CRKME15.004011B8
00401198 |.^E2 DD \LOOPD SHORT CRKME15.00401177
0040119A |. C605 83304000 01 MOV BYTE PTR DS:[403083],1
004011A1 |. 68 E8030000 PUSH 3E8 ; /ControlID = 3E8 (1000.)
004011A6 |. FF75 08 PUSH DWORD PTR SS:[EBP+8] ; |hWnd
004011A9 |. E8 72020000 CALL <JMP.&USER32.GetDlgItem> ; \GetDlgItem
004011AE |. 6A 01 PUSH 1 ; /Enable = TRUE
004011B0 |. 50 PUSH EAX ; |hWnd
004011B1 |. E8 52020000 CALL <JMP.&USER32.EnableWindow> ; \EnableWindow
004011B6 |. EB 15 JMP SHORT CRKME15.004011CD
004011B8 |> 68 E8030000 PUSH 3E8 ; /ControlID = 3E8 (1000.)
004011BD |. FF75 08 PUSH DWORD PTR SS:[EBP+8] ; |hWnd
004011C0 |. E8 5B020000 CALL <JMP.&USER32.GetDlgItem> ; \GetDlgItem
004011C5 |. 6A 00 PUSH 0 ; /Enable = FALSE
004011C7 |. 50 PUSH EAX ; |hWnd
004011C8 |. E8 3B020000 CALL <JMP.&USER32.EnableWindow> ; \EnableWindow
004011CD |> C9 LEAVE
004011CE \. C2 0400 RETN 4
004011D1 /$ B9 0C000000 MOV ECX,0C
004011D6 |. BE 73304000 MOV ESI,CRKME15.00403073
004011DB |> 807431 FF 4F /XOR BYTE PTR DS:[ECX+ESI-1],4F
004011E0 |.^E2 F9 \LOOPD SHORT CRKME15.004011DB
004011E2 |. 6A 00 PUSH 0 ; /lParam = 0
004011E4 |. 68 95104000 PUSH CRKME15.00401095 ; |Callback = CRKME15.00401095
004011E9 |. E8 26020000 CALL <JMP.&USER32.EnumWindows> ; \EnumWindows
004011EE |. 0FBE05 72304000 MOVSX EAX,BYTE PTR DS:[403072]
004011F5 |. C605 72304000 00 MOV BYTE PTR DS:[403072],0
004011FC \. C3 RETN
004011FD . 55 PUSH EBP
004011FE . 8BEC MOV EBP,ESP
00401200 . 53 PUSH EBX
00401201 . 56 PUSH ESI
00401202 . 57 PUSH EDI
00401203 . 817D 0C 11010000 CMP DWORD PTR SS:[EBP+C],111
0040120A . 0F85 C8000000 JNZ CRKME15.004012D8
00401210 . 66:817D 10 E803 CMP WORD PTR SS:[EBP+10],3E8
00401216 . 75 6B JNZ SHORT CRKME15.00401283
00401218 . BF 75314000 MOV EDI,CRKME15.00403175
0040121D . 6A 64 PUSH 64 ; /ControlID = 64 (100.)
0040121F . FF75 08 PUSH DWORD PTR SS:[EBP+8] ; |hWnd
00401222 . E8 F9010000 CALL <JMP.&USER32.GetDlgItem> ; \GetDlgItem
00401227 . 6A 00 PUSH 0 ; /lParam = 0
00401229 . 6A 01 PUSH 1 ; |wParam = 1
0040122B . 68 CF000000 PUSH 0CF ; |Message = EM_SETREADONLY
00401230 . 50 PUSH EAX ; |hWnd
00401231 . E8 0E020000 CALL <JMP.&USER32.SendMessageA> ; \SendMessageA
00401236 . 803D 83304000 00 CMP BYTE PTR DS:[403083],0
0040123D . 74 02 JE SHORT CRKME15.00401241
0040123F . EB 05 JMP SHORT CRKME15.00401246
00401241 > BF 7E314000 MOV EDI,CRKME15.0040317E
00401246 > 81EF 23010000 SUB EDI,123
0040124C . 57 PUSH EDI ; /Text
0040124D . 6A 6E PUSH 6E ; |ControlID = 6E (110.)
0040124F . FF75 08 PUSH DWORD PTR SS:[EBP+8] ; |hWnd
00401252 . E8 F3010000 CALL <JMP.&USER32.SetDlgItemTextA> ; \SetDlgItemTextA
00401257 . 68 E8030000 PUSH 3E8 ; /ControlID = 3E8 (1000.)
0040125C . FF75 08 PUSH DWORD PTR SS:[EBP+8] ; |hWnd
0040125F . E8 BC010000 CALL <JMP.&USER32.GetDlgItem> ; \GetDlgItem
00401264 . 6A 00 PUSH 0 ; /Enable = FALSE
00401266 . 50 PUSH EAX ; |hWnd
00401267 . E8 9C010000 CALL <JMP.&USER32.EnableWindow> ; \EnableWindow
0040126C . 6A 64 PUSH 64 ; /ControlID = 64 (100.)
0040126E . FF75 08 PUSH DWORD PTR SS:[EBP+8] ; |hWnd
00401271 . E8 AA010000 CALL <JMP.&USER32.GetDlgItem> ; \GetDlgItem
00401276 . 6A 00 PUSH 0 ; /Enable = FALSE
00401278 . 50 PUSH EAX ; |hWnd
00401279 . E8 8A010000 CALL <JMP.&USER32.EnableWindow> ; \EnableWindow
0040127E . E9 75010000 JMP CRKME15.004013F8
00401283 > 66:817D 10 E903 CMP WORD PTR SS:[EBP+10],3E9
00401289 . 75 23 JNZ SHORT CRKME15.004012AE
0040128B . 6A 00 PUSH 0 ; /BeepType = MB_OK
0040128D . E8 A6010000 CALL <JMP.&USER32.MessageBeep> ; \MessageBeep
00401292 . 6A 00 PUSH 0 ; /lParam = NULL
00401294 . 68 28104000 PUSH CRKME15.00401028 ; |DlgProc = CRKME15.00401028
00401299 . FF75 08 PUSH DWORD PTR SS:[EBP+8] ; |hOwner
0040129C . 6A 02 PUSH 2 ; |pTemplate = 2
0040129E . FF35 6A304000 PUSH DWORD PTR DS:[40306A] ; |hInst = NULL
004012A4 . E8 59010000 CALL <JMP.&USER32.DialogBoxParamA> ; \DialogBoxParamA
004012A9 . E9 4A010000 JMP CRKME15.004013F8
004012AE > 66:837D 10 64 CMP WORD PTR SS:[EBP+10],64
004012B3 . 75 0D JNZ SHORT CRKME15.004012C2
004012B5 . FF75 08 PUSH DWORD PTR SS:[EBP+8]
004012B8 . E8 88FEFFFF CALL CRKME15.00401145
004012BD . E9 36010000 JMP CRKME15.004013F8
004012C2 > 66:817D 10 EA03 CMP WORD PTR SS:[EBP+10],3EA
004012C8 . 0F85 2A010000 JNZ CRKME15.004013F8
004012CE . E9 1B010000 JMP CRKME15.004013EE
004012D3 . E9 20010000 JMP CRKME15.004013F8
004012D8 > 817D 0C 10010000 CMP DWORD PTR SS:[EBP+C],110
004012DF . 0F85 03010000 JNZ CRKME15.004013E8
004012E5 . 8B45 08 MOV EAX,DWORD PTR SS:[EBP+8]
004012E8 . EB 0C JMP SHORT CRKME15.004012F6
004012EA . 63 72 61 63 6B 6D>ASCII "crackme #15",0
004012F6 > 68 EA124000 PUSH CRKME15.004012EA ; /lParam = 4012EA
004012FB . 6A 00 PUSH 0 ; |wParam = 0
004012FD . 6A 0C PUSH 0C ; |Message = WM_SETTEXT
004012FF . FF75 08 PUSH DWORD PTR SS:[EBP+8] ; |hWnd
00401302 . E8 3D010000 CALL <JMP.&USER32.SendMessageA> ; \SendMessageA
00401307 . 6A 0A PUSH 0A ; /RsrcName = 10.
00401309 . FF35 6A304000 PUSH DWORD PTR DS:[40306A] ; |hInst = NULL
0040130F . E8 1E010000 CALL <JMP.&USER32.LoadIconA> ; \LoadIconA
00401314 . A3 6E304000 MOV DWORD PTR DS:[40306E],EAX
00401319 . FF35 6E304000 PUSH DWORD PTR DS:[40306E] ; /lParam = 0
0040131F . 6A 01 PUSH 1 ; |wParam = 1
00401321 . 68 80000000 PUSH 80 ; |Message = WM_SETICON
00401326 . FF75 08 PUSH DWORD PTR SS:[EBP+8] ; |hWnd
00401329 . E8 16010000 CALL <JMP.&USER32.SendMessageA> ; \SendMessageA
0040132E . BE 73304000 MOV ESI,CRKME15.00403073
00401333 . C706 00007200 MOV DWORD PTR DS:[ESI],720000
00401339 . C746 04 0F151F19 MOV DWORD PTR DS:[ESI+4],191F150F
00401340 . C746 08 5C5C5C5C MOV DWORD PTR DS:[ESI+8],5C5C5C5C
00401347 . 56 PUSH ESI
00401348 . E8 B2FDFFFF CALL CRKME15.004010FF
0040134D . BF 34424000 MOV EDI,CRKME15.00404234
00401352 . 85C0 TEST EAX,EAX
00401354 . 75 69 JNZ SHORT CRKME15.004013BF
00401356 . C706 00007200 MOV DWORD PTR DS:[ESI],720000
0040135C . C746 04 1208151F MOV DWORD PTR DS:[ESI+4],1F150812
00401363 . C746 08 195C5C5C MOV DWORD PTR DS:[ESI+8],5C5C5C19
0040136A . 56 PUSH ESI
0040136B . E8 8FFDFFFF CALL CRKME15.004010FF
00401370 . BF 34424000 MOV EDI,CRKME15.00404234
00401375 . 85C0 TEST EAX,EAX
00401377 . 75 46 JNZ SHORT CRKME15.004013BF
00401379 . C706 00232336 MOV DWORD PTR DS:[ESI],36232300
0040137F . C746 04 0B2D286F MOV DWORD PTR DS:[ESI+4],6F282D0B
00401386 . C746 08 626F4F4F MOV DWORD PTR DS:[ESI+8],4F4F6F62
0040138D . E8 3FFEFFFF CALL CRKME15.004011D1
00401392 . BF 4D424000 MOV EDI,CRKME15.0040424D
00401397 . 85C0 TEST EAX,EAX
00401399 . 75 24 JNZ SHORT CRKME15.004013BF
0040139B . C706 1A1D1C20 MOV DWORD PTR DS:[ESI],201C1D1A
004013A1 . C746 04 293B6F18 MOV DWORD PTR DS:[ESI+4],186F3B29
004013A8 . C746 08 7C7D0B4F MOV DWORD PTR DS:[ESI+8],4F0B7D7C
004013AF . E8 1DFEFFFF CALL CRKME15.004011D1
004013B4 . BF 66424000 MOV EDI,CRKME15.00404266
004013B9 . 85C0 TEST EAX,EAX
004013BB . 75 02 JNZ SHORT CRKME15.004013BF
004013BD . EB 27 JMP SHORT CRKME15.004013E6
004013BF > B9 03000000 MOV ECX,3
004013C4 > C7048D 6F304000 0>MOV DWORD PTR DS:[ECX*4+40306F],0
004013CF .^E2 F3 LOOPD SHORT CRKME15.004013C4
004013D1 . 81EF 34120000 SUB EDI,1234
004013D7 . 6A 10 PUSH 10 ; /Style = MB_OK|MB_ICONHAND|MB_APPLMODAL
004013D9 . 6A 00 PUSH 0 ; |Title = NULL
004013DB . 57 PUSH EDI ; |Text
004013DC . FF75 08 PUSH DWORD PTR SS:[EBP+8] ; |hOwner
004013DF . E8 5A000000 CALL <JMP.&USER32.MessageBoxA> ; \MessageBoxA
004013E4 . EB 08 JMP SHORT CRKME15.004013EE
004013E6 > EB 10 JMP SHORT CRKME15.004013F8
004013E8 > 837D 0C 10 CMP DWORD PTR SS:[EBP+C],10
004013EC . 75 0A JNZ SHORT CRKME15.004013F8
004013EE > 6A 00 PUSH 0 ; /Result = 0
004013F0 . FF75 08 PUSH DWORD PTR SS:[EBP+8] ; |hWnd
004013F3 . E8 16000000 CALL <JMP.&USER32.EndDialog> ; \EndDialog
004013F8 > 5F POP EDI
004013F9 . 5E POP ESI
004013FA . 5B POP EBX
004013FB . 33C0 XOR EAX,EAX
004013FD . C9 LEAVE
004013FE . C2 1000 RETN 10
00401401 CC INT3
00401402 $-FF25 48204000 JMP DWORD PTR DS:[<&USER32.DialogBoxParamA>]
00401408 $-FF25 38204000 JMP DWORD PTR DS:[<&USER32.EnableWindow>]
0040140E $-FF25 40204000 JMP DWORD PTR DS:[<&USER32.EndDialog>]
00401414 $-FF25 3C204000 JMP DWORD PTR DS:[<&USER32.EnumWindows>]
0040141A $-FF25 20204000 JMP DWORD PTR DS:[<&USER32.GetClassNameA>]
00401420 $-FF25 34204000 JMP DWORD PTR DS:[<&USER32.GetDlgItem>]
00401426 $-FF25 24204000 JMP DWORD PTR DS:[<&USER32.GetDlgItemTextA>]
0040142C $-FF25 30204000 JMP DWORD PTR DS:[<&USER32.GetWindowTextA>]
00401432 $-FF25 1C204000 JMP DWORD PTR DS:[<&USER32.LoadIconA>]
00401438 $-FF25 44204000 JMP DWORD PTR DS:[<&USER32.MessageBeep>]
0040143E $-FF25 4C204000 JMP DWORD PTR DS:[<&USER32.MessageBoxA>]
00401444 $-FF25 28204000 JMP DWORD PTR DS:[<&USER32.SendMessageA>]
0040144A $-FF25 2C204000 JMP DWORD PTR DS:[<&USER32.SetDlgItemTextA>]
00401450 $-FF25 14204000 JMP DWORD PTR DS:[<&KERNEL32.CloseHandle>]
00401456 $-FF25 0C204000 JMP DWORD PTR DS:[<&KERNEL32.CreateFileA>]
0040145C $-FF25 08204000 JMP DWORD PTR DS:[<&KERNEL32.ExitProcess>]
00401462 $-FF25 10204000 JMP DWORD PTR DS:[<&KERNEL32.GetModuleHandleA>>
00401468 $-FF25 04204000 JMP DWORD PTR DS:[<&KERNEL32.lstrcmpA>]
0040146E $-FF25 00204000 JMP DWORD PTR DS:[<&KERNEL32.lstrlenA>]


先のブレークポイントから、逆にたどってみましょう。
すると、

004013BD . EB 27 JMP SHORT CRKME15.004013E6
004013BF > B9 03000000 MOV ECX,3

上の状況により、分岐結果が004013BFに来て、MessageBoxAが実行されているのが分かります。
そこで、004013BFに来るのを探してみます。
Ctrl + r で「References in CRKME15:.text to 004013BF」のウィンドウを表示します。

References in CRKME15:.text to 004013BF
Address Disassembly Comment
00401354 JNZ SHORT CRKME15.004013BF
00401377 JNZ SHORT CRKME15.004013BF
00401399 JNZ SHORT CRKME15.004013BF
004013BB JNZ SHORT CRKME15.004013BF
004013BF MOV ECX,3 (Initial CPU selection)


の四つであることが分かります。
どうも、このあたりにアンチデバッガのルーチンがあるみたいです。
アンチデバッグの説明は後ですることにして、まずは回避方法です。

004013BB . 75 02 JNZ SHORT CRKME15.004013BF

のあとには

004013BD . EB 27 JMP SHORT CRKME15.004013E6

しかないのでこれが、引っかからなかった時にジャンプする先になります
そこで004013BFを

004013BF > B9 03000000 MOV ECX,3

から、JMP SHORT CRKME15.004013E6 にします。

004013BF EB 25 JMP SHORT CRKME15.004013E6
004013C1 90 NOP
004013C2 90 NOP
004013C3 90 NOP

これで回避できます。変更個所は以下の通りです。

FILENAME crkme15.exe
0007BF: B9 EB
0007C0: 03 25
0007C1: 00 90
0007C2: 00 90
0007C3: 00 90

では、いったん閉じて、ファイルを変更しましょう。

これで回避できたので、パスの解析に移ります。
では、「変更したcrkme15」をOllyDBGで読み込んでください。
「F9」キーで動かしてみましょう。
crackme #15のウィンドウが、表示されました。

フェークパス「123456789012345」と入力してください。
それから、CPUウィンドウで、右クリックをして、
「検索」→「ラベル一覧」(「Search for」→「Name(Label)」)で、
ラベル一覧の一覧を表示します。

Names in CRKME15
Address Section Type (Known) Name Comment
00401000 .text Export <ModuleEntryPoint>
00402000 .rdata Import (Known) KERNEL32.lstrlenA
00402004 .rdata Import (Known) KERNEL32.lstrcmpA
00402008 .rdata Import (Known) KERNEL32.ExitProcess
0040200C .rdata Import (Known) KERNEL32.CreateFileA
00402010 .rdata Import (Known) KERNEL32.GetModuleHandleA
00402014 .rdata Import (Known) KERNEL32.CloseHandle
0040201C .rdata Import (Known) USER32.LoadIconA
00402020 .rdata Import (Known) USER32.GetClassNameA
00402024 .rdata Import (Known) USER32.GetDlgItemTextA
00402028 .rdata Import (Known) USER32.SendMessageA
0040202C .rdata Import (Known) USER32.SetDlgItemTextA
00402030 .rdata Import (Known) USER32.GetWindowTextA
00402034 .rdata Import (Known) USER32.GetDlgItem
00402038 .rdata Import (Known) USER32.EnableWindow
0040203C .rdata Import (Known) USER32.EnumWindows
00402040 .rdata Import (Known) USER32.EndDialog
00402044 .rdata Import (Known) USER32.MessageBeep
00402048 .rdata Import (Known) USER32.DialogBoxParamA
0040204C .rdata Import (Known) USER32.MessageBoxA


00402024 .rdata Import (Known) USER32.GetDlgItemTextA

を選択して、「Enter」キーを押してください。
「References in crkme15:.text to USER32.GetDlgItemTextA」
というウィンドウが表示されます。

References in CRKME15:.text to USER32.GetDlgItemTextA
Address Disassembly Comment
0040115B CALL <JMP.&USER32.GetDlgItemTextA>
00401426 JMP DWORD PTR DS:[<&USER32.GetDlgItemTex

0040115B CALL <JMP.&USER32.GetDlgItemTextA>

を選択して、「F2」キーでブレークポイントを設定してください。
それから、タスクバーのcrackme #15をクリックするとブレークします。
このとき、EAXには、文字数が入ってます。

0040114F |. 6A 7E PUSH 7E ; /Count = 7E (126.)
00401151 |. 68 84304000 PUSH CRKME15.00403084 ; |Buffer = CRKME15.00403084
00401156 |. 6A 64 PUSH 64 ; |ControlID = 64 (100.)
00401158 |. FF75 08 PUSH DWORD PTR SS:[EBP+8] ; |hWnd
0040115B |. E8 C6020000 CALL <JMP.&USER32.GetDlgItemTextA> ; \GetDlgItemTextA
00401160 |. 83E8 0F SUB EAX,0F
00401163 |. 83F8 01 CMP EAX,1
00401166 |. B8 01000000 MOV EAX,1
0040116B |. 83D0 FF ADC EAX,-1
0040116E |. 85C0 TEST EAX,EAX
00401170 |. 74 46 JE SHORT CRKME15.004011B8


以下は、文字数チェックです。

00401160 |. 83E8 0F SUB EAX,0F      EAX-0x0f
00401163 |. 83F8 01 CMP EAX,1 EAX-1をしてフラグ変更(ここでCフラグが変わる)
00401166 |. B8 01000000 MOV EAX,1 EAXに1を代入
0040116B |. 83D0 FF ADC EAX,-1 Cフラグ+EAX-1=EAX
0040116E |. 85C0 TEST EAX,EAX  0かどうかのチェック(ANDを行ってチェック)
00401170 |. 74 46 JE SHORT crkme15_.004011B8


変則的なチェックで、1以上のときCフラグがたたないことを利用したチェックです。
ADC EAX,-1 は、普通の足し算にEAX+-1 と、キャリーフラグの1か0を足した結果になります。
つまり、Cフラグ(キャリーフラグ)+EAX-1の計算を行います。



次に、00401172を選択して「F2」でブレークポイント設定後、「F9」でそこまで実行して下さい。

00401172 |. B9 05000000 MOV ECX,5
00401177 |> 0FBE044D 82304>/MOVSX EAX,BYTE PTR DS:[ECX*2+403082]
0040117F |. 0FBE1C4D 83304>|MOVSX EBX,BYTE PTR DS:[ECX*2+403083]
00401187 |. 03C3 |ADD EAX,EBX
00401189 |. 33D2 |XOR EDX,EDX
0040118B |. F7E1 |MUL ECX
0040118D |. 83E0 4F |AND EAX,4F
00401190 |. 3A81 8D304000 |CMP AL,BYTE PTR DS:[ECX+40308D]
00401196 |. 75 20 |JNZ SHORT CRKME15.004011B8
00401198 |.^E2 DD \LOOPD SHORT CRKME15.00401177

ここが、パスのチェックルーチンです。
403084から403092に入力した文字が入ってます。
式にすると,、
((((ECX*2)番目の文字コ-ド+(ECX*2-1)番目のの文字コード)*ECX)&0x4f)==

簡単にすると、

123456789012345
|||||||||||||||
T T T T T |||||
|x |x |x |x |x |||||
|1 |2 |3 |4 |5 |||||
| | | | └─┼┼┼┼┘
| | | └───┼┼┼┘
| | └─────┼┼┘
| └───────┼┘
└─────────┘

という状態になります。

言葉で説明すると、

9文字目と10文字目の文字コードの値を足して5を掛け
論理積0x4fをしたものが15文字目の文字コードと同じだと次へ、
まちがいだとチェックルーチン終了して待機状態になります。

7文字目と8文字目の文字コードの値を足して4を掛け
論理積0x4fをしたものが14文字目の文字コードと同じだと次へ、
まちがいだとチェックルーチン終了して待機状態になります。

5文字目と6文字目の文字コードの値を足して3を掛け
論理積0x4fをしたものが13文字目の文字コードと同じだと次へ、
まちがいだとチェックルーチン終了して待機状態になります。

3文字目と4文字目の文字コードの値を足して2を掛け
論理積0x4fをしたものが12文字目の文字コードと同じだと次へ、
まちがいだとチェックルーチン終了して待機状態になります。

1文字目と2文字目の文字コードの値を足して1を掛け
論理積0x4fをしたものが11文字目の文字コードと同じだと次へ、
まちがいだとチェックルーチン終了して待機状態になります。

仮に入力した「123456789012345」の場合
一回目
まず、9番目と10番目の文字コードを取得後以下の式に当てはめる
((0x39+0x30)*5 & 0x4f)=D
よって
15番目文字コード:0x35
と違うので、ループが終了して
登録ボタンが押せる状態になりません

キーとなる数値がないので、総当りで調べることになります。



正解は、多数存在します。そのひとつとして
「I+B3g1D1B2DJHDD」
が正解パスになります。

以上でアンチデバッグを除いた説明は終わりです。
アンチデバッグ部分の説明は次のページで・・・。

アンチデバックの説明へ