
■ of3.exeを強制終了するのは? ■
前回は"of1.exe"と"of3.exe"との微妙な処理時間の差が何故起
こるのか説明しました。
"of3.exe"の場合、最初の例外発生以後、以下の処理を繰り返
してしまうのでした。
1.例外ハンドラ動作開始
2.何を起動するか参照(ここで参照する情報はバッファオー
バーフローにより破壊されている。)
3.2項で指定された場所へ制御を移行
4.例外発生
5.1項へ戻る
後は1〜5項の処理を繰り返してしまう為、処理に時間がかか
ってしまうという事を説明しました。
以下にぐるぐると同じ処理を繰り返しているイメージを示しま
す。
┌─────┘★例外発生
│ ┏━━━━━━━━━━━━━━┓
↓ ┃元々は「メッセージを表示する┃
┌──────────┐┃プログラムの場所」情報だが、┃
│ │┃バッファオーバーフローにより┃
│例外ハンドラ動作開始│┃書き換わっている。 ┃
│ │┗━━━━━━━━━━━┳━━┛
└─────┬────┘ ↓
│何を起動するか参照 ┌──────┐
│←─────────────┤FF FF FF FF │
制御を移行↓ └──┬───┘
××××××× │
×そんな所に× │
×実行可能な× │
×プログラム× │
×ありません× │
××××××× │
│★例外発生 │
┌─────┴────┐ │
│ │ │
│例外ハンドラ動作開始│ │
│ │ │
└─────┬────┘ │
│何を起動するか参照 │
│←────────────────┤
制御を移行↓ │
××××××× │
×そんな所に× │
×実行可能な× │
×プログラム× │
×ありません× │
××××××× │
│★例外発生 │
┌─────┴────┐ │
│ │ │
│例外ハンドラ動作開始│ │
│ │ │
└─────┬────┘ │
│何を起動するか参照 │
│←────────────────┘
制御を移行↓
×××××××
×そんな所に×
×実行可能な×
×プログラム×
×ありません×
×××××××
│★例外発生
・
・
・
・
ここである疑問が浮かびます。
「強制終了されるまでの時間に差がある理由は分かったけど、
このまま永久にぐるぐると処理を続けてしまうの?」
このような疑問を持たれた方、ごもっともです。
実は永遠にこの処理を繰り返すわけではありません。
やはり最後には歯止めをかける人がいるのです。
それは誰なのでしょうか?
上のイメージを見てもらうと分かりますが、「例外ハンドラ」
が何回も繰返し動作開始しています。
「例外ハンドラ」と言うとなんだか難しく聞こえるかもしれま
せんが、「単なるプログラム」です。
例外ハンドラは、デバッグの為の情報をスタック領域に収集す
る処理を行います。
という事は、例外ハンドラが動作開始する事により、ある程度
の「スタック領域を消費する」という事です。
通常、正常なプログラムというのは、動作開始直後に「スタッ
ク領域を確保」し、動作終了したら「スタック領域を解放」す
る処理を行います。
●正常なプログラムの場合
┌────────┐
│ 動作開始 │
├────────┤
│スタック領域確保│
└───┬────┘
│
┌───┴────┐
│ │
│ 正常な処理 │
│ │
└───┬────┘
│
┌───┴────┐
│スタック領域解放│
├────────┤
│ 動作終了 │
└────────┘
しかし1番上に示したイメージの様に、例外が連続して繰返し
発生してしまうような状況に陥ってしまった場合、例外ハンド
ラが「動作開始」する事はあっても、正常に「動作終了」する
事はありません。
何故なら、「動作終了」する前に例外が発生してしまうからで
す。
「動作終了しない」という事は、つまり「スタック領域が解放
されない」という事です。
●異常なプログラムの場合
┌────────┐
│ 動作開始 │
├────────┤
│スタック領域確保│
└───┬────┘
│
┌───┴────┐
│ │
│ 異常な処理 │
│ │
└───┬────┘★例外発生
└→───────→────┐
↓
┏━━━┷━━━━┓ ┌──────────┐
┃スタック領域解放┃ │例外ハンドラ動作開始│
┠────────┨ ├──────────┤
┃ 動作終了 ┃ │ スタック領域確保 │
┗━━━━━━━━┛ └────┬─────┘
↑ ・
★ここの処理は行われない。 ・
そして、1番上のイメージに示した例外ハンドラの様に、「動
作終了しない」プログラムが延々と呼出されるという事は、延
々と「スタック領域を消費し続ける」という事になります。
スタック領域は無限に使えるのでしょうか?
スタック領域は無限に使えるわけではありません。
この講座で作成するプログラムの場合、1つのアプリケーショ
ンに対してデフォルトでは約1メガバイトのスタック領域が割
当てられます。
そして例外ハンドラが消費するスタック領域は、「例外を発生
させたアプリケーション」が使用しているのと「同じスタック
領域」が使用されます。
つまり"of3.exe"で例外が発生した場合、例外ハンドラは"of3.
exe"のスタック領域を消費するという事です。
例外ハンドラが何回も何回も呼出される事によって、スタック
領域はどんどん消費されてしまい、ずっと解放される事はあり
ません。
やがてスタック領域を使い果たし、これ以上動作する事が出来
なくなってしまいます。
この場合、どうなってしまうのでしょうか?
ここで思い出して頂きたい事があります。
インテルプロセッサが、もうどうにも処理を続ける事が出来な
くなってしまった場合、どの様な動作をするのか?
この場合も、インテルプロセッサはやはり「例外」を発生させ
ます。
しかしこの時点で発生する例外は、「スタック領域が無くなり
ました。」という「全く別の例外」です。
これはインテルプロセッサの仕様です。
以下に「スタック領域が無くなりました。」という例外が発生
しているイメージを示します。
1番最初に示したイメージの様な動作が行われた後、最後には
以下の様な動作が行われるのだな、と思いながら見てみて下さ
い。
・
・
・例外ハンドラが繰返し動作
・(この間、スタック領域を消費し続ける。)
・
×××××××
×そんな所に×
×実行可能な×
×プログラム×
×ありません×
×××××××
│★例外発生
┌─────┴────┐
│ │
│例外ハンドラ動作開始│
│ │
└─────┬────┘
×××××××××××××××××
×スタック領域が無くなりました。×
×××××××××××××××××
│★別の例外発生
そしてこの時に動作開始する「例外ハンドラ」は、今まで動作
していた例外ハンドラとは全く別のプログラムになります。
以下に全く別の例外ハンドラが動作開始しているイメージを示
します。
1番下の部分が異なるだけです。
・
・
・例外ハンドラが繰返し動作
・(この間、スタック領域を消費し続ける。)
・
×××××××
×そんな所に×
×実行可能な×
×プログラム×
×ありません×
×××××××
│★例外発生
┌─────┴────┐
│ │
│例外ハンドラ動作開始│
│ │
└─────┬────┘
×××××××××××××××××
×スタック領域が無くなりました。×
×××××××××××××××××
│★別の例外発生
┏━━━━━┷━━━━┓ ┏━━━━━━━━━┓
┃ ┃ ┃今まで動作していた┃
┃例外ハンドラ動作開始┃←┫例外ハンドラとは ┃
┃ ┃ ┃全く別物。 ┃
┗━━━━━━━━━━┛ ┗━━━━━━━━━┛
今までの例外ハンドラとは別の例外ハンドラである事を示す為
に、線を太くしてあります。
この時点で動作する例外ハンドラは何を行うかというと、Win-
dows9x系では、「このプログラムは不正な処理を行ったので強
制終了されます。」というメッセージを表示してプログラムを
強制終了します。
Windows NT/2000/XPでは、プログラムを強制終了するだけで、
メッセージが表示される事はありません。
Windows NT/2000/XPでは一見、正常終了しているように見えま
すが、内部では例外が発生し強制終了されているのです。
Windows NT/2000/XPの方は"of1.exe"と"of3.exe"の動作の違い
を比べるだけでも、「例外ハンドラの動作の違い」が確認でき
るというわけです。
長くなってしまいましたが、以上が"of3.exe"の処理の流れで
す。
さて、何故これほど"of3.exe"について長々と説明したのかと
言うと、元々はコンピュータウィルスがどのようにしてコンピ
ュータを乗っ取ってしまうのか、という事を説明したかったか
らです。
実はここまでが理解出来ていれば、コンピュータウィルスにつ
いて詳細な動作原理を知る事はもう少しなのです。
次回からは、いよいよコンピュータウィルスの動作原理につい
て具体的に説明したいと思います。