プログラムの動作を変更してみよう!|セキュリティ|ブログ|Computerworld

header_cwr_head_mid_fl_logo

CW_ウルトラバナー_Topics04

CW_ウルトラバナー_Topics05

CW_ウルトラバナー_Topics06

CW_ウルトラバナー_Topics07

CW_ウルトラバナー_Topics08

セキュリティ

プログラムの動作を変更してみよう!

Posted by 蔵本雄一 ( 2010年06月20日 )

読者の皆様

お待たせしました。

弊社は6月が期末なので、忙しさがピークになっている蔵本です。。。。

しかもめっちゃ暑くなっていますので、バテないように頑張りたいと思います。

今週の一枚は、大阪「蛸の徹」さんのたこ焼きとそば飯です。子供の頃からよくお世話になっているお店で、自分でたこ焼きを焼く店です。是非皆さんも焼きまくってください。盛り上げること間違いなしです!

さてさて、今回は、前回作成したアプリケーションをちょこっと変更して動作を変えましょう。

前回作成したアプリケーションは、西暦2000年以降であれば、画像1のようなダイアログが表示され、西暦2000年以前であれば、画像2のようなダイアログが表示されます。

画像1(西暦2000年以降)

画像2(西暦2000年以前)

現在は西暦2010年なので、もちろん、画像1のメッセージが表示されるはずです。

今回は、この部分の動作を変更し、画像2を表示させてみます。

まずは、プログラムをデバッグしましょう。

私はデバッグする場合、OllyDbgを使用していますので、今回はOllyDbgを使っていきます。

OllyDbgで「File」→「Open」を選択します。

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年以前じゃないと表示できないはずのダイアログが表示されたのかを解明していきます!

ページの先頭へ戻る