crackme#10 解析手引き 下巻

はじめに、9文字まで正解パス出し終わったと仮定して話を進めます。


OllyDBGを、起動して「crkme10.exe」を読込んでください。
まず、前回設定設定したブレークポイントを解除します。
CPUウィンドウで、右クリックをして、「検索」→「ラベル一覧」(「Search for」→「Name(Label)」)で、ラベル一覧の一覧を、表示します。


Names in crkme10
アドレス  セクション  タイプ ( 名前 コメント 
00401000 .text Export <ModuleEntryPoint>
00402000 .rdata Import ( KERNEL32.GetVolumeInformationA
00402004 .rdata Import ( KERNEL32.GetModuleHandleA
00402008 .rdata Import ( KERNEL32.ExitProcess
00402010 .rdata Import ( USER32.LoadIconA
00402014 .rdata Import ( USER32.MessageBoxA
00402018 .rdata Import ( USER32.GetDlgItem
0040201C .rdata Import ( USER32.EndDialog
00402020 .rdata Import ( USER32.SetWindowTextA
00402024 .rdata Import ( USER32.ShowWindow
00402028 .rdata Import ( USER32.GetWindowTextA ←ココ
0040202C .rdata Import ( USER32.DialogBoxParamA
00402030 .rdata Import ( USER32.CallWindowProcA
00402034 .rdata Import ( USER32.SendMessageA
00402038 .rdata Import ( USER32.SetWindowLongA

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

References in crkme10:.text to USER32.GetWindowTextA
アドレス  逆アセンブル  コメント 
00401282 CALL <JMP.&USER32.GetWindowTextA>        ←ココ
0040150C JMP DWORD PTR DS:[<&USER32.GetWindowText USER32.GetWindowTextA

Address 00401282 call <jmp.&USER32.GetWindowTextA> に表示されてるブレークポイントを、「DEL」で解除してください。

前回の終了アドレスにブレークポイントを設定します。
アセンブラリスト表示部分で、右クリックしてメニュー表示させます。
そして、「移動」→「アドレス」を選択して、「0040137F」と入力後、OKボタンをクリックします。

0040137F > BE 30304000 MOV ESI,crkme10.00403030

が先頭に表示されます。
この行に、「F2」キーを押して、ブレークポイントを設定します。
「F9」キーで実行させます。
crackme #10のウィンドウが、表示されました。
フェークパス「*********0123456789」と入力して、「登録」ボタンクリックしてください。 (先頭 9文字は正解パスを入力してください。)
ブレークポイントを設定した

0040137F > BE 30304000 MOV ESI,crkme10.00403030

で止まります。


0040137F > BE 30304000 MOV ESI,crkme10.00403030 ←ココ
00401384 . 83C6 0A ADD ESI,0A
00401387 . 6A 04 PUSH 4
00401389 . 56 PUSH ESI
0040138A . E8 27010000 CALL crkme10.004014B6
0040138F . 83F8 FF CMP EAX,-1
00401392 .^0F84 F8FEFFFF JE crkme10.00401290
00401398 . 33D2 XOR EDX,EDX
0040139A . 33C9 XOR ECX,ECX
0040139C > 51 PUSH ECX
0040139D . 33C9 XOR ECX,ECX
0040139F > D1E2 SHL EDX,1
004013A1 . 8BD8 MOV EBX,EAX
004013A3 . D3EB SHR EBX,CL
004013A5 . 83E3 01 AND EBX,1
004013A8 . 0BD3 OR EDX,EBX
004013AA . 83C1 04 ADD ECX,4
004013AD . 83F9 10 CMP ECX,10
004013B0 .^72 ED JB SHORT crkme10.0040139F
004013B2 . 59 POP ECX
004013B3 . 41 INC ECX
004013B4 . D1E8 SHR EAX,1
004013B6 . 83F9 04 CMP ECX,4
004013B9 .^72 E1 JB SHORT crkme10.0040139C
004013BB . 52 PUSH EDX
004013BC . BE E6314000 MOV ESI,crkme10.004031E6 ; ASCII "ID:46484833"
004013C1 . 83C6 03 ADD ESI,3
004013C4 . 6A 04 PUSH 4
004013C6 . 56 PUSH ESI
004013C7 . E8 B7000000 CALL crkme10.00401483
004013CC . 83F8 00 CMP EAX,0
004013CF . 75 01 JNZ SHORT crkme10.004013D2
004013D1 . 40 INC EAX
004013D2 > 5A POP EDX
004013D3 . 3BC2 CMP EAX,EDX
004013D5 . 74 07 JE SHORT crkme10.004013DE
004013D7 .^E9 B4FEFFFF JMP crkme10.00401290
004013DC 90 NOP
004013DD 90 NOP
004013DE > BE 30304000 MOV ESI,crkme10.00403030
004013E3 . 83C6 0E ADD ESI,0E
004013E6 . 0FBE06 MOVSX EAX,BYTE PTR DS:[ESI]
004013E9 . 83F8 2D CMP EAX,2D
004013EC . 74 07 JE SHORT crkme10.004013F5
004013EE .^E9 9DFEFFFF JMP crkme10.00401290
004013F3 90 NOP
004013F4 90 NOP
004013F5 > 46 INC ESI
004013F6 . 8B06 MOV EAX,DWORD PTR DS:[ESI]
004013F8 . BE 90314000 MOV ESI,crkme10.00403190 ; ASCII "ABCDEFGHJKLMNPQRSTUVWXYZ23456789"
004013FD . 33D2 XOR EDX,EDX
004013FF . 33C9 XOR ECX,ECX
00401401 > 51 PUSH ECX
00401402 . 33C9 XOR ECX,ECX
00401404 > 83F9 20 CMP ECX,20
00401407 . 73 0B JNB SHORT crkme10.00401414
00401409 . 0FBE1C31 MOVSX EBX,BYTE PTR DS:[ECX+ESI]
0040140D . 38D8 CMP AL,BL
0040140F . 74 03 JE SHORT crkme10.00401414
00401411 . 41 INC ECX
00401412 .^EB F0 JMP SHORT crkme10.00401404
00401414 > 8BD9 MOV EBX,ECX
00401416 . 59 POP ECX
00401417 . 83FB 20 CMP EBX,20
0040141A .^0F83 70FEFFFF JNB crkme10.00401290
00401420 . C1E2 05 SHL EDX,5
00401423 . 0BD3 OR EDX,EBX
00401425 . C1E8 08 SHR EAX,8
00401428 . 41 INC ECX
00401429 . 83F9 04 CMP ECX,4
0040142C .^72 D3 JB SHORT crkme10.00401401
0040142E . BE C0314000 MOV ESI,crkme10.004031C0
00401433 . 8BC2 MOV EAX,EDX
00401435 . 33C9 XOR ECX,ECX
00401437 . 33D2 XOR EDX,EDX
00401439 > C1E2 04 SHL EDX,4
0040143C . 8BD8 MOV EBX,EAX
0040143E . 83E3 0F AND EBX,0F
00401441 . 0FBE1C33 MOVSX EBX,BYTE PTR DS:[EBX+ESI]
00401445 . 0BD3 OR EDX,EBX
00401447 . C1E8 04 SHR EAX,4
0040144A . 41 INC ECX
0040144B . 83F9 05 CMP ECX,5
0040144E .^72 E9 JB SHORT crkme10.00401439
00401450 . 52 PUSH EDX
00401451 . BE E6314000 MOV ESI,crkme10.004031E6 ; ASCII "ID:46484833"
00401456 . 83C6 04 ADD ESI,4
00401459 . 6A 05 PUSH 5
0040145B . 56 PUSH ESI
0040145C . E8 55000000 CALL crkme10.004014B6
00401461 . 5A POP EDX
00401462 . 3BC2 CMP EAX,EDX
00401464 .^0F85 26FEFFFF JNZ crkme10.00401290
0040146A . 6A 00 PUSH 0 ; /Style = MB_OK|MB_APPLMODAL
0040146C . 68 F1304000 PUSH crkme10.004030F1 ; |Title = "登録情報"4030
00401471 . 68 2C314000 PUSH crkme10.0040312C ; |Text = "正解です!お疲れさまでした。"
00401476 . FF75 08 PUSH DWORD PTR SS:[EBP+8] ; |hOwner
00401479 . E8 9A000000 CALL <JMP.&USER32.MessageBoxA> ; \MessageBoxA
0040147E .^E9 1BFCFFFF JMP crkme10.0040109E
00401483 /$ 55 PUSH EBP
00401484 |. 8BEC MOV EBP,ESP
00401486 |. 33DB XOR EBX,EBX
00401488 |. 8B75 08 MOV ESI,DWORD PTR SS:[EBP+8]
0040148B |. 8B4D 0C MOV ECX,DWORD PTR SS:[EBP+C]
0040148E |> 0FBE06 /MOVSX EAX,BYTE PTR DS:[ESI]
00401491 |. 83F8 30 |CMP EAX,30
00401494 |. 72 17 |JB SHORT crkme10.004014AD
00401496 |. 83F8 39 |CMP EAX,39
00401499 |. 77 12 |JA SHORT crkme10.004014AD
0040149B |. 83E8 30 |SUB EAX,30
0040149E |. 93 |XCHG EAX,EBX
0040149F |. 6BC0 0A |IMUL EAX,EAX,0A
004014A2 |. 03D8 |ADD EBX,EAX
004014A4 |. 49 |DEC ECX
004014A5 |. 83F9 00 |CMP ECX,0
004014A8 |. 74 06 |JE SHORT crkme10.004014B0
004014AA |. 46 |INC ESI
004014AB |.^EB E1 \JMP SHORT crkme10.0040148E
004014AD |> 33DB XOR EBX,EBX
004014AF |. 4B DEC EBX
004014B0 |> 8BC3 MOV EAX,EBX
004014B2 |. C9 LEAVE
004014B3 \. C2 0800 RETN 8
004014B6 /$ 55 PUSH EBP
004014B7 |. 8BEC MOV EBP,ESP
004014B9 |. 8B75 08 MOV ESI,DWORD PTR SS:[EBP+8]
004014BC |. 8B4D 0C MOV ECX,DWORD PTR SS:[EBP+C]
004014BF |. 33DB XOR EBX,EBX
004014C1 |> C1E3 04 /SHL EBX,4
004014C4 |. 0FBE06 |MOVSX EAX,BYTE PTR DS:[ESI]
004014C7 |. 83F8 30 |CMP EAX,30
004014CA |. 72 1E |JB SHORT crkme10.004014EA
004014CC |. 83F8 39 |CMP EAX,39
004014CF |. 77 05 |JA SHORT crkme10.004014D6
004014D1 |. 83E8 30 |SUB EAX,30
004014D4 |. EB 0D |JMP SHORT crkme10.004014E3
004014D6 |> 83F8 41 |CMP EAX,41
004014D9 |. 72 0F |JB SHORT crkme10.004014EA
004014DB |. 83F8 46 |CMP EAX,46
004014DE |. 77 0A |JA SHORT crkme10.004014EA
004014E0 |. 83E8 37 |SUB EAX,37
004014E3 |> 03D8 |ADD EBX,EAX
004014E5 |. 46 |INC ESI
004014E6 |.^E2 D9 \LOOPD SHORT crkme10.004014C1
004014E8 |. EB 03 JMP SHORT crkme10.004014ED
004014EA |> 33DB XOR EBX,EBX
004014EC |. 4B DEC EBX
004014ED |> 8BC3 MOV EAX,EBX
004014EF |. C9 LEAVE
004014F0 \. C2 0800 RETN 8
004014F3 CC INT3


0040137F > BE 30304000 MOV ESI,crkme10.00403030   ← 入力したPass域のアドレスを、esiレジスタに代入します
「F7」キーを1回押してください。

00401384 . 83C6 0A ADD ESI,0A   ← esiレジスタ + 10 よって、esiレジスタは、入力Passの11文字目を指すようになります。
「F8」キーを4回押してください。

0040138F . 83F8 FF CMP EAX,-1  ここで止まってます。

ここで、eaxレジスタの値を見てください。 0x00001234 となってます。
直前の

0040138A . E8 27010000 CALL crkme10.004014B6

の処理で、入力Passの11文字目から4文字を、バイナリに変換した値です。
「F7」キーを4回押してください。

0040139C > 51 PUSH ECX 

ここで止まってます。
ここで、アセンブラ・リストを見ると、2個のループ処理があります。
1つ目のループ処理は、Address 0040139C ~ 004013B9 です。
2つ目のループ処理は、Address 0040139F ~ 004013B0 です。

1つ目のループ処理を、解説しますと、
1. ecxレジスタ値待避 : push ecx
2. ecxレジスタ・クリア : xor ecx,ecx
3.「2つ目のループ処理」 : Address 0040139F ~ 004013B0 の処理
4. 1.で待避したecxレジスタ値の復帰 : pop ecx
5. ecxレジスタ+1 : inc ecx
6. eaxレジスタ÷2(1bit右シフト) : shr eax,1
7. ecxレジスタ<4の時、1.へ : cmp ecx,4
: jb short crkme10.0040139C
となってます。
この流れをまとめると、「2つ目のループ処理」と 「eaxレジスタ÷2」 を4回行います。

次に、2つ目のループ処理を、解説しますと、
1. edxレジスタ×2(1bit左シフト) : shl edx,1
2. eaxレジスタ値をebxレジスタに代入 : mov ebx,eax (eaxレジスタ値は、入力Passの10文字目から4文字のバイナリ値)
3. ebxレジスタ値をnビット右シフト : shr ebx,cl
4. : and ebx,1
5. : or edx,ebx
6. ecxレジスタ+4 : add ecx,4
7. ecxレジスタ<16の時、1.へ : cmp ecx,10
: jb short crkme10.0040139F
となってます。

まとめると、
edxレジスタ =「edxレジスタ×2(1bit左シフト)」 or 「(入力Passの10文字目から4文字のバイナリ値を、nビット右シフト) and 1」 (n=0,4,8,12)
上記を、4回行います。

説明としては、入力した文字を16進数になおしています。
実際にその16進数を2進数に置き換えてみると理解しやすいと思います。
このループは、その2進数での1と0の並びを別の形に置き換えています。
6~9文字目はそうやって行けたのですが,ループがグリグリ回っていて逆トレースが難しくなっています。

例えば、 0123 4567 89AB CDEF といった感じで2進数が並んでいると、
     FB73 EA62 D951 C840 こんな感じに置き換えられます。

この2つの処理結果は、edxレジスタに残ります。
では、

004013BB . 52 PUSH EDX

にブレークポイントを設定して、「F9」を押してください。

ここで、入力Passから算出した値を、スタックに待避します。
「F7」キーを1回押してください。

004013BC . BE E6314000 MOV ESI,crkme10.004031E6 ; ASCII "ID:********"

esiレジスタに、"ID:********"の文字列域のアドレスを代入しています。
「F7」キーを1回押してください。

004013C1 . 83C6 03 ADD ESI,3

esiレジスタ+3 "ID:********"の数字部分を指します。
「F8」キーを4回押してください。

004013CC . 83F8 00 CMP EAX,0

ここで止まってます。
ここで、eaxレジスタの値を見てください。
直前の

004013C7 . E8 B7000000 CALL crkme10.00401483

の処理が、ID値から算出した結果です。
その結果が、0(ゼロ)の場合は、

004013D1 . 40 INC EAX 

で、+1してます。
「F7」キーを何回か押して、

004013D2 > 5A POP EDX

まで実行させます。
ここで、先程 2つのループ処理で算出した結果を、edxレジスタに復帰してます。
「F7」キーを1回押してください。

004013D3 . 3BC2 CMP EAX,EDX

ここで、ID値から算出した結果と比較してます。
よって、2つのループ処理で算出した結果が、eaxレジスタ値となる値が、11文字目から4文字の正解Passとなります。

「F7」キーを1回押した後、フラグレジスタのZを、0→1に変更してください。
「F7」キーを1回押してください。

004013DE > BE 30304000 MOV ESI,crkme10.00403030   ← 入力したPass域のアドレスを、esiレジスタに代入します

「F7」キーを1回押してください。

004013E3 . 83C6 0E ADD ESI,0E   ← esiレジスタ + 14 よって、esiレジスタは、入力Passの15文字目を指すようになります。

「F7」キーを1回押してください。

004013E6 . 0FBE06 MOVSX EAX,BYTE PTR DS:[ESI]

ここで、入力Pass15文字目1文字を、eaxレジスタに代入

「F7」キーを1回押してください。

004013E9 . 83F8 2D CMP EAX,2D

eaxレジスタ=0x2d(ASCII "-") の比較です。
よって、正解パス15文字目は、"-"っとなります。
「F7」キーを1回押した後、フラグレジスタのZを、0→1に変更してください。

004013F5 > 46 INC ESI

ここで止まってます。
esiレジスタ + 1 よって、esiレジスタは、入力Passの16文字目を指すようになります。
「F7」キーを1回押してください。

004013F6 . 8B06 MOV EAX,DWORD PTR DS:[ESI]

ここで、入力Passの16文字目から4文字をeaxレジスタに代入します。 (ここで、上位下位バイトの反転が起きてるので注意!)
「F7」キーを1回押してください。

004013F8 . BE 90314000 MOV ESI,crkme10.00403190 ; ASCII "ABCDEFGHJKLMNPQRSTUVWXYZ23456789"

ここで、参照用テーブルのアドレスを、esiレジスタに代入しています。
「F7」キーを3回押してください。

00401401 > 51 PUSH ECX

ここで止まってます。
ここでも、アセンブラ・リストを見ると、2個のループ処理があります。
1つ目のループ処理は、Address 00401401 ~ 0040142C です。
2つ目のループ処理は、Address 00401404 ~ 00401412 です。

1つ目のループ処理を、解説しますと、
1. ecxレジスタ値待避 : push ecx
2. ecxレジスタ・クリア : xor ecx,ecx
3. 「2つ目のループ処理」 : Address 00401404 ~ 00401412 の処理
4. ebxレジスタ=3.でのループ回数 : mov ebx,ecx
5. 1.で待避したecxレジスタ値の復帰 : pop ecx
ebxレジスタ>0x20のときエラー : cmp ebx,20
: jnb crkme10.00401290
6. edxレジスタ5ビット左シフト : shl edx,5
7. : or edx,ebx
8. eaxレジスタ8ビット右シフト : shr eax,8 (入力Passの16文字目から4文字)
9. ecxレジスタ+1 : inc ecx
10. ecxレジスタ<4の時、1.へ : cmp ecx,4
: jb short crkme10.00401401
となってます。

まとめると、
・edxレジスタ = (edxレジスタ5ビット左シフト) or 「2つ目のループ処理」結果
・eaxレジスタ8ビット右シフトの2処理を、4回(4文字)行ってます。
入力した4つ数の位別にしたのがIDの4文字(10進化)となっています。

次に、2つ目のループ処理を、解説しますと、
1. ecxレジスタ>0x20の時処理を抜ける : cmp ecx,20 (テーブル参照用インデックス値)
: jnb short crkme10.00401414
2. ecxレジスタ番目のデータを1バイトをedxレジスタに代入 : movsx ebx,[byte ds:ecx+esi]
3. 入力パス文字の比較(同じ場合処理を抜ける) : cmp al,bl
: je short crkme10.00401414
4. ecxレジスタ+1 : inc ecx
5. 1.へジャンプ : jmp short crkme10.00401404
となってます。

まとめると、
入力Passの1文字が、crkme10.00403190 ; ASCII "ABCDEFGHJKLMNPQRSTUVWXYZ23456789"テーブルの何番目の文字かチェックしてます。
また、この文字テーブル以外のPass文字はエラーとなります。
1つ目のループ処理チェックの値生成について edx に値が積み上がっていきますので、
edx の変化に注目してトレースしてみて下さい。


次に、

0040142E . BE C0314000 MOV ESI,crkme10.004031C0

ここに「F2」でブレークポイントを設定して、「F9」キーを押してください。

0040142E . BE C0314000 MOV ESI,crkme10.004031C0

ここで、esiレジスタにアドレスを代入してます。
crkme10.004031C0 このエリアもバイナリ値のテーブルとなってます。
内容は、0x09,0x01,0x04,0x0b,0x03,0x08,0x0f,0x06,0x0d,0x05,0x0c,0,0x0a,0x0e,0x02,0x07 (16Byte?)
また、次行で先程のedxレジスタ値を、eaxレジスタに代入してます。
「F7」キーを4回押してください。

00401439 > C1E2 04 SHL EDX,4

ここで止まってます。
また、ループ処理があります。
Address 00401439 ~ 0040144E です。

ループ処理を、解説しますと、
1. edxレジスタ4ビット左シフト : shl edx,4
2. eaxレジスタの下位4ビットを、添え字としてテーブル参照 : mov ebx,eax
: and ebx,0F
: movsx ebx,[byte ds:ebx+esi]
3. : or edx,ebx
4. eaxレジスタ4ビット右シフト : shr eax,4
5. ecxレジスタ+1 : inc ecx
6. ecxレジスタ<5の時、1.へ : cmp ecx,5
: jb short crkme10.00401439
となってます。

まとめると、
・edxレジスタ = (edxレジスタを4ビット左シフト) or eaxレジスタ値の下位4ビットを添え字として、バイナリ値テーブルを参照。
・eaxレジスタ4ビット右シフト
の2処理を、5回行ってます。

00401450 . 52 PUSH EDX  ←ここにブレークポイントを設定して、「F9」キーを押してください。

ここで算出した値を、スタック域に待避してます。
「F7」キーを1回押してください。

00401451 . BE E6314000 MOV ESI,crkme10.004031E6 ; ASCII "ID:********"

esiレジスタに、"ID:********" の文字列域のアドレスを代入しています。
「F7」キーを1回押してください。

00401456 . 83C6 04 ADD ESI,4

esiレジスタ+4 "ID:********"の数字部分を指します。
「F8」キーを4回押してください。

00401461 . 5A POP EDX

ここで止まってます。
eaxレジスタ値を見てください。
ID:12345678 の場合、 23456 っと、数字部分の2文字目から5文字がバイナリ値に変化されてます。
ここで、テーブル参照して算出した値を、edxレジスタに復帰してます。
「F7」キーを1回押してください。

00401462 . 3BC2 CMP EAX,EDX

ここで、テーブル参照して算出した値の比較です。
よって、2つのテーブル参照処理で算出した結果が、eaxレジスタ値となる値が、16文字目から4文字の正解Passとなります。

これで、#10のPassチェック処理の解析終わりましたが、Pass10文字目の比較が有りませんでした。
よって、10文字目では、字数合わせで何か入力すればいいようです。

以上、 crackme#10の、そしてvol.1の解説手引きは終了です。お疲れ様でした。



補足説明:IDについて

0040115F . E8 DE030000 CALL <JMP.&KERNEL32.GetVolumeInformation>; \GetVolumeInformationA       

ここから、exeのあるドライブのボリュームIDを取得して、多少の演算の後にがID算出されます。
つまり、ドライブが変われば ID も変わるはずです。
試してみては如何ですか?

00401147 . A3 10304000 MOV DWORD PTR DS:[403010],EAX
0040114C . 6A 00 PUSH 0 ; /pFileSystemNameSize = NULL
0040114E . 6A 00 PUSH 0 ; |pFileSystemNameBuffer = NULL
00401150 . 6A 00 PUSH 0 ; |pFileSystemFlags = NULL
00401152 . 6A 00 PUSH 0 ; |pMaxFilenameLength = NULL
00401154 . 68 E1314000 PUSH crkme10.004031E1 ; |pVolumeSerialNumber = crkme10.004031E1
00401159 . 6A 00 PUSH 0 ; |MaxVolumeNameSize = 0
0040115B . 6A 00 PUSH 0 ; |VolumeNameBuffer = NULL
0040115D . 6A 00 PUSH 0 ; |RootPathName = NULL
0040115F . E8 DE030000 CALL <JMP.&KERNEL32.GetVolumeInformation>; \GetVolumeInformationA       ←ココから
00401164 . BE E1314000 MOV ESI,crkme10.004031E1
00401169 . 8B06 MOV EAX,DWORD PTR DS:[ESI]
0040116B . C1C0 0D ROL EAX,0D
0040116E . 35 98BADCFE XOR EAX,FEDCBA98
00401173 . C1C8 07 ROR EAX,7
00401176 . 35 10325476 XOR EAX,76543210
0040117B . B9 00E1F505 MOV ECX,5F5E100
00401180 . 8BD8 MOV EBX,EAX
00401182 . 33D2 XOR EDX,EDX
00401184 . F7F1 DIV ECX
00401186 . 8BDA MOV EBX,EDX
00401188 . BE E6314000 MOV ESI,crkme10.004031E6 ; ASCII "ID:00000000"
0040118D . 83C6 03 ADD ESI,3
00401190 . B9 80969800 MOV ECX,989680
00401195 > 83FB 00 CMP EBX,0
00401198 . 74 20 JE SHORT crkme10.004011BA
0040119A . 8BC3 MOV EAX,EBX
0040119C . 33D2 XOR EDX,EDX
0040119E . F7F1 DIV ECX
004011A0 . 8846 09 MOV BYTE PTR DS:[ESI+9],AL
004011A3 . 83C0 30 ADD EAX,30
004011A6 . 8806 MOV BYTE PTR DS:[ESI],AL
004011A8 . 46 INC ESI
004011A9 . 52 PUSH EDX
004011AA . 8BC1 MOV EAX,ECX
004011AC . B9 0A000000 MOV ECX,0A
004011B1 . 33D2 XOR EDX,EDX
004011B3 . F7F1 DIV ECX
004011B5 . 8BC8 MOV ECX,EAX
004011B7 . 5B POP EBX
004011B8 .^EB DB JMP SHORT crkme10.00401195
004011BA > 68 E6314000 PUSH crkme10.004031E6 ; /Text = "ID:00000000"
004011BF . FF35 08304000 PUSH DWORD PTR DS:[403008] ; |hWnd = NULL
004011C5 . E8 60030000 CALL <JMP.&USER32.SetWindowTextA> ; \SetWindowTextA
004011CA .^E9 CFFEFFFF JMP crkme10.0040109E
004011CF > 8B45 14 MOV EAX,DWORD PTR SS:[EBP+14]
004011D2 . 8BD8 MOV EBX,EAX
004011D4 . C1E8 10 SHR EAX,10
004011D7 . 81E3 FFFF0000 AND EBX,0FFFF
004011DD . 83F8 00 CMP EAX,0
004011E0 . 72 25 JB SHORT crkme10.00401207
004011E2 . 83F8 14 CMP EAX,14
004011E5 . 73 20 JNB SHORT crkme10.00401207
004011E7 . 83FB 00 CMP EBX,0
004011EA . 72 1B JB SHORT crkme10.00401207
004011EC . 83FB 14 CMP EBX,14
004011EF . 73 16 JNB SHORT crkme10.00401207
004011F1 . 6A 00 PUSH 0 ; /Style = MB_OK|MB_APPLMODAL
004011F3 . 68 B0304000 PUSH crkme10.004030B0 ; |Title = "About"
004011F8 . 68 B6304000 PUSH crkme10.004030B6 ; |Text = "crackme #10 [マシン固有ID]Copyright (C) 2002 eagle0wl."
004011FD . FF75 08 PUSH DWORD PTR SS:[EBP+8] ; |hOwner
00401200 . E8 13030000 CALL <JMP.&USER32.MessageBoxA> ; \MessageBoxA
00401205 . EB 5A JMP SHORT crkme10.00401261