
■ 例外ハンドラの特徴 ■
前回は"of3.exe"の動作について一通り説明を終了したところ
でした。
"of3.exe"は「そんな所に実行可能なプログラムありません。」
という例外が連続して繰返し発生することによりスタック領域
を消費し続け、最後は「スタック領域が無くなりました。」と
いう例外が発生する事により処理が強制終了されるのでした。
ここまで理解出来ていれば、コンピュータウィルスについて動
作原理を知る事はもう少しです。
今回から、いよいよコンピュータウィルスの動作原理について
具体的に説明します。
以前作成した"of3.exe"を実行すると、Windows9x系のOSでは
「このプログラムは不正な処理を行ったので強制終了されます。」
というメッセージを表示してプログラムが強制終了されます。
(Windows NT/2000/XPの方は残念ながらこのメッセージを見る
事は出来ません。)
そしてこの時、「閉じる」を押すのではなく、「詳細情報」の
ボタンを押すと、例外ハンドラが「制御を移行」しようとした
瞬間のレジスタ情報を見る事が出来ます。
★この瞬間のレジスタ情報 ┌──────────────┐
を見る事が出来る。 │元々は「メッセージを表示する│
┃ │プログラムの場所」情報だが、│
┃ │バッファオーバーフローにより│
┃ │書き換わっている。 │
┃ └─────────────┬┘
┃ ・ │
┃ ・ │
┃ ・ ┌──────┐ │
┃ ・ │FF FF FF FF │←┘
┃ ・ └──┬───┘
┃ ××××××× │
┃ ×そんな所に× │
┃ ×実行可能な× │
┃ ×プログラム× │
┃ ×ありません× │
┃ ××××××× │
┃ │★例外発生 │
┃ ┌─────┴────┐ │
┃ │ │ │
┃ │例外ハンドラ動作開始│ │
┃ │ │ │
┃ └─────┬────┘ │
┃ │何を起動するか参照 │
┃ │←────────────────┘
┗━━→制御を移行↓
×××××××
×そんな所に×
×実行可能な×
×プログラム×
×ありません×
×××××××
│★例外発生
以下にWindows98上で"of3.exe"を実行した際に表示される強制
終了の詳細情報を示します。
─●↓ここから─────────────────────
OF3 のページ違反です。
モジュール : KERNEL32.DLL、アドレス : 017f:bff8807c
Registers:
EAX=c00309e4 CS=017f EIP=bff8807c EFLGS=00010202
EBX=0063fe28 SS=0187 ESP=00540000 EBP=00540080
ECX=816a6cdc DS=0187 ESI=816b3ad8 FS=5cd7
EDX=bff768d5 ES=0187 EDI=00540098 GS=0000
─●↑ここまで─────────────────────
例外ハンドラが「制御を移行」しようとした瞬間のレジスタ情
報が見れると何か良い事でもあるの?
という方もいらっしゃるかもしれません。
しかし、この時表示される強制終了メッセージの詳細情報を見
る事により、Windowsの例外ハンドラの「ある特徴」を知る事
が出来ます。
上の詳細情報の中で、レジスタ「EBX」の値が「0063fe28」と
なっています。
この値を覚えておいてください。
"of3.exe"は、バッファbをバッファaにコピーするプログラ
ムですが、コピー処理を行う前とコピー処理を行った後のスタ
ック領域を表示するようにプログラムを作ってあります。
以下にWindows98上での"of3.exe"の実行結果を示します。
少し長いですが右側には分かり易くなるようにコメントを付け
ておきます。
─●↓"of3.exe"実行結果ここから────────────
0063FDAC:10 11 12 13┐
0063FDB0:14 15 16 17│
0063FDB4:18 19 1A 1B│
0063FDB8:1C 1D 1E 1F│
0063FDBC:FF FF FF FF│
0063FDC0:FF FF FF FF│
0063FDC4:FF FF FF FF│
0063FDC8:FF FF FF FF│
0063FDCC:FF FF FF FF│←バッファb
0063FDD0:FF FF FF FF│
0063FDD4:FF FF FF FF│
0063FDD8:FF FF FF FF│
0063FDDC:FF FF FF FF│
0063FDE0:FF FF FF FF│
0063FDE4:FF FF FF FF│
0063FDE8:FF FF FF FF┘
0063FDEC:38 FE 63 00
0063FDF0:00 01 02 03┐←バッファa
0063FDF4:04 05 06 07┘
0063FDF8:38 FE 63 00←EBP
0063FDFC:1E 21 40 00←呼出し元
0063FE00:01 00 00 00
0063FE04:D8 13 65 00
0063FE08:14 14 65 00
0063FE0C:00 00 00 00
0063FE10:00 00 00 00
0063FE14:B4 E5 69 81
0063FE18:00 00 53 00
0063FE1C:94 20 40 00
0063FE20:10 FE 63 00
0063FE24:20 90 F7 BF
0063FE28:68 FF 63 00
0063FE2C:D0 21 40 00←メッセージを表示するプログラムの場所
copy end ←コピー処理実行完了
0063FDAC:10 11 12 13┐
0063FDB0:14 15 16 17│
0063FDB4:18 19 1A 1B│
0063FDB8:1C 1D 1E 1F│
0063FDBC:FF FF FF FF│
0063FDC0:FF FF FF FF│
0063FDC4:FF FF FF FF│
0063FDC8:FF FF FF FF│
0063FDCC:FF FF FF FF│←バッファb
0063FDD0:FF FF FF FF│
0063FDD4:FF FF FF FF│
0063FDD8:FF FF FF FF│
0063FDDC:FF FF FF FF│
0063FDE0:FF FF FF FF│
0063FDE4:FF FF FF FF│
0063FDE8:FF FF FF FF┘
0063FDEC:38 FE 63 00
0063FDF0:10 11 12 13┐←バッファa
0063FDF4:14 15 16 17┘
0063FDF8:18 19 1A 1B←EBP ┐
0063FDFC:1C 1D 1E 1F←呼出し元 │
0063FE00:FF FF FF FF │
0063FE04:FF FF FF FF │
0063FE08:FF FF FF FF │
0063FE0C:FF FF FF FF │
0063FE10:FF FF FF FF │バッファオーバーフロー
0063FE14:FF FF FF FF │により破壊された部分。
0063FE18:FF FF FF FF │
0063FE1C:FF FF FF FF │
0063FE20:FF FF FF FF │
0063FE24:FF FF FF FF │
0063FE28:FF FF FF FF │
0063FE2C:FF FF FF FF←メッセージを表示する┘
プログラムの場所
─●↑"of3.exe"実行結果ここまで────────────
上の実行結果で、「メッセージを表示するプログラムの場所」
情報の1行上に、先ほど覚えて頂いた「0063fe28」の値が存在
しています。
★これ ・
↓ ・
____ ・
0063FE28:FF FF FF FF
0063FE2C:FF FF FF FF←メッセージを表示する
プログラムの場所
この「0063FE28」という値が、例外ハンドラが「制御を移行」
しようとした瞬間のレジスタ「EBX」の値と一致します。
実はWindowsの例外ハンドラが「制御を移行」しようとした瞬
間は、「必ず」レジスタ「EBX」は「メッセージを表示するプ
ログラムの場所」情報の「4バイト手前」を指しています。
これがWindowsの例外ハンドラの特徴です。
もう1度、先ほどと同じイメージを見て頂きますが、今度は例
外ハンドラが「制御を移行」しようとした瞬間の記述を変更し
てあります。
┌──────────────┐
│元々は「メッセージを表示する│
│プログラムの場所」情報だが、│
│バッファオーバーフローにより│
│書き換わっている。 │
例外ハンドラが制御を移行しようとした └─────────────┬┘
瞬間は必ずここを指している。 ┌──────┐ │
┏━━━━━━━━━━━━━━━━━━━━━━→│FF FF FF FF │ │
┃ ・ ├──────┤ │
┃ ・ │FF FF FF FF │←┘
┃ ・ └──┬───┘
┃ ××××××× │
┃ ×そんな所に× │
┃ ×実行可能な× │
┃ ×プログラム× │
┃ ×ありません× │
┃ ××××××× │
┃ │★例外発生 │
┃ ┌─────┴────┐ │
┃ │ │ │
┃ │例外ハンドラ動作開始│ │
┃ │ │ │
┃ └─────┬────┘ │
┃ │何を起動するか参照 │
┌──┸──┐ │←────────────────┘
│ │制御を移行↓
└─────┘ ×××××××
レジスタEBX ×そんな所に×
×実行可能な×
×プログラム×
×ありません×
×××××××
│★例外発生
レジスタEBXが必ず「メッセージを表示するプログラムの場所」
情報の「4バイト手前」を指すという記述を追加しました。
今回はWindowsの例外ハンドラの特徴について説明しました。
次回はこの特徴を利用したプログラムを実際に作ってみる予定
です。