分かりやす〜い
コンピュータ技術情報

TOPに戻る
▼Processor
バッファオーバーフロー
┣ 異常な動作
┣ 本当に怖い事
┣ プログラムを作る
┣ バッファオーバーフロ
┃ ーを発生させる

┣ スタック領域の構成
┣ 何故強制終了されるの
┃ か?

┣ 強制終了されないよう
┃ に作り変える

┣ 任意のコードを実行す
┃ る

┣ of1.cとof2.cとの違い
┣ 例外
┣ 例外ハンドラの行う事
┣ of3.cを作る
┣ of1.cとof3.cとの違い
┣ of3.exeの例外ハンド
┃ ラ

┣ of3.exeを強制終了す
┃ るのは?

┣ 例外ハンドラの特徴
┣ Blue Screen
┣ BufferOverFlow応用
┃ プログラム

┗ 機械語の説明

Copyright(C) 2001-2002.ugpop. All rights reserved.




■デジタル用語辞典:
■ 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"について長々と説明したのかと
言うと、元々はコンピュータウィルスがどのようにしてコンピ
ュータを乗っ取ってしまうのか、という事を説明したかったか
らです。

実はここまでが理解出来ていれば、コンピュータウィルスにつ
いて詳細な動作原理を知る事はもう少しなのです。

次回からは、いよいよコンピュータウィルスの動作原理につい
て具体的に説明したいと思います。



▲このページの上へ

▲このページの上へ

▲このページの上へ

←前に戻る    ▲このページの上へ    続きを読む→

▲このページの上へ