プログラムの動作を変更してみよう!
お待たせしました。
弊社は6月が期末なので、忙しさがピークになっている蔵本です。。。。
しかもめっちゃ暑くなっていますので、バテないように頑張りたいと思います。
今週の一枚は、大阪「蛸の徹」さんのたこ焼きとそば飯です。子供の頃からよくお世話になっているお店で、自分でたこ焼きを焼く店です。是非皆さんも焼きまくってください。盛り上げること間違いなしです!
さてさて、今回は、前回作成したアプリケーションをちょこっと変更して動作を変えましょう。
前回作成したアプリケーションは、西暦2000年以降であれば、画像1のようなダイアログが表示され、西暦2000年以前であれば、画像2のようなダイアログが表示されます。
現在は西暦2010年なので、もちろん、画像1のメッセージが表示されるはずです。
今回は、この部分の動作を変更し、画像2を表示させてみます。
まずは、プログラムをデバッグしましょう。
私はデバッグする場合、OllyDbgを使用していますので、今回はOllyDbgを使っていきます。
FileOpen ダイアログが表示されますので、デバッグするexeファイルを選択します。
さて、このアセンブルコードを上から見て行きましょう。
00E01000 >/$ 83EC 10 SUB ESP,10
00E01003 |. 33C0 XOR EAX,EAX
00E01005 |. 890424 MOV DWORD PTR SS:[ESP],EAX
00E01008 |. 894424 04 MOV DWORD PTR SS:[ESP+4],EAX
00E0100C |. 894424 08 MOV DWORD PTR SS:[ESP+8],EAX
00E01010 |. 894424 0C MOV DWORD PTR SS:[ESP+C],EAX
00E01014 |. 8D0424 LEA EAX,DWORD PTR SS:[ESP]
00E01017 |. 50 PUSH EAX ; /pSystemTime
00E01018 |. FF15 0020E000 CALL DWORD PTR DS:[<&KERNEL32.GetSystemT>; \GetSystemTime
00E0101E |. B9 D0070000 MOV ECX,7D0
00E01023 |. 6A 00 PUSH 0 ; /Style = MB_OK|MB_APPLMODAL
00E01025 66:394C24 04 CMP WORD PTR SS:[ESP+4],CX ; |
00E0102A |. 76 18 JBE SHORT Sample1.00E01044 ; |
00E0102C |. 68 F420E000 PUSH OFFSET Sample1.??_C@_0P@MAAFBHNM@?$">Sample1.??_C@_0P@MAAFBHNM@?$>; |Title = "起動できへんよ"
00E01031 |. 68 0421E000 PUSH OFFSET Sample1.??_C@_0DD@LBBEGEG@?$">Sample1.??_C@_0DD@LBBEGEG@?$>; |Text = "このアプリケーションは、2000年以降起動できません。"
00E01036 |. 6A 00 PUSH 0 ; |hOwner = NULL
00E01038 |. FF15 A820E000 CALL DWORD PTR DS:[<&USER32.MessageBoxA>>; \MessageBoxA
00E0103E |. 33C0 XOR EAX,EAX
00E01040 |. 83C4 10 ADD ESP,10
00E01043 |. C3 RETN
00E01044 |> 68 3821E000 PUSH OFFSET Sample1.??_C@_0P@CMKHHPEP@?$">Sample1.??_C@_0P@CMKHHPEP@?$>; |Title = "起動できました"
00E01049 |. 68 4821E000 PUSH OFFSET Sample1.??_C@_0DP@GLPHILAL@2">Sample1.??_C@_0DP@GLPHILAL@2>; |Text = "2000年よりも前だったら、このメッセージボックスが表示されます。"
00E0104E |. 6A 00 PUSH 0 ; |hOwner = NULL
00E01050 |. FF15 A820E000 CALL DWORD PTR DS:[<&USER32.MessageBoxA>>; \MessageBoxA
00E01056 |. 33C0 XOR EAX,EAX
00E01058 |. 83C4 10 ADD ESP,10
00E0105B \. C3 RETN
「00E01025 66:394C24 04 CMP WORD PTR SS:[ESP+4],CX」となっている部分がありますが、ここを右クリックしましょう。
そして、ポップアップメニューから、「Binary」→「Fill with NOPs」を選択します。
すると、下図のように「CMP」の部分が「NOP」と書き換えられた状態になっていると思います。

更に右クリックし、ポップアップメニューから「Copy to executable」→「All Modifications」を選択します。

下図のダイアログが表示されますので、「Copy all」を選択します。

すると、「CMP」部分を「NOP」で上書きした、新しいコードが表示されます。

新しく表示されたウィンドウで右クリックし、ポップアップメニューから「Save file」を選択します。

こいつを実行してやると、何と何と2000年以前じゃないと表示できないはずの下記ダイアログが表示されるはずです!

わくわくしてきましたでしょうか?
次回は、なぜ2000年以前じゃないと表示できないはずのダイアログが表示されたのかを解明していきます!