ブルー スクリーンを別の色にする

翻訳元: A Bluescreen By Any Other Color (英語)

ブルー スクリーンの色をもっと簡単にカスタマイズする方法については、次回のブログ記事「1 回のクリック操作で色を変更できる "ブルー スクリーン"」を参照してください。

青くないブルー スクリーンを見ると、私でも動揺します。TechEd の聴衆の反応から、自分の好きな色でブルー スクリーンを生成して、コンピューターに詳しい友人に見せれば、楽しめること請け合いです。私は 2 年前、Dan PearsonDave Solomon と合同で行ったクラッシュ ダンプのトラブルシューティングについての講演で、この青くないブルー スクリーンを初めて目にしました。今や、私の原因不明の...の問題プレゼンテーションは、聴衆が選んだ色のブルー スクリーンで締めくくるようになっています (この動画の最後で、聴衆の反応を見ることができます)。これから紹介する、ブルー スクリーンの色を変更する手順では、手作業が必要になります。現在のブート セッションにしか適用されないため、単に実演してみせるのには適していますが、ブルー スクリーン全般をカスタマイズするための手順ではないことに注意してください。このブログ記事の最後で、クリスマス仕様の特別なブルー スクリーンをお見せしますので、お見逃しなく。

システムを準備する

まずは、これからカーネル コードを変更するので、メモリ内のカーネル コードが編集できないようになっている場合は、編集できるようにします。ページのコンテンツに最も適した保護をページに適用するため、RAM が 2 GB よりも少ない Windows システムでは、カーネル コードの格納に 4 KB のページを使用します。たとえば、カーネル データ ページでは、読み取り/書き込みのアクセスを許可する必要がありますが、カーネル コードでは、読み取り/実行のアクセスのみを許可する必要があります。Windows は、仮想アドレス変換の速度を高めるための最適化の手段として、大きなシステムには大きなページ (x86 および x64 では 4 MB) を使用します。つまり、ページにコードとデータの両方が格納されている場合、ページでは、読み取り、書き込み、および実行のアクセスを許可する必要があるので、ページを編集できるようにするためには、Windows で大きなページを使用するように変更する必要があります。システムで Windows XP または Windows Server 2003 を実行していて、RAM が 256 MB よりも小さい場合、またはシステムで Windows Vista 以上を実行していて、RAM が 2 GB 以下の場合、HKLM\System\CurrentControlSet\Control\Session Manager\Memory Management 配下に、LargePageMinimum という名前の REG_DWORD 値を作成して、1 を設定します (下図参照)。

図: REG_DWORD 値を作成

Windows がクラッシュ後に自動的に再起動する前に慌てて操作する必要がないように、自動再起動の設定を変更します。Windows XP と Windows Server 2003 では、[マイ コンピュータ] を右クリックして [プロパティ] をクリックし、[詳細設定] タブをクリックして、[起動と回復] セクションで [設定] をクリックします。Windows Vista 以上では、[スタート] メニューで [コンピューター] を右クリックして、[プロパティ] をクリックします。次に、[システムの詳細設定] をクリックし、[詳細設定] タブをクリックして、[起動と回復] セクションで [設定] ボタンをクリックします。それから、[自動的に再起動する] チェック ボックスをオフにします (下図参照)。

図: [起動と回復] セクション

64 ビットの Windows Vista 以上の OS を実行している場合は、カーネル デバッガーを "ローカル" モードで実行できるように、システムをデバッグ モードで起動する必要があります。システムをデバッグ モードで起動するには、システムの起動中に F8 キーを押して [デバッグ モード] を選択するか、次に示す [システム構成] ユーティリティ (Msconfig) の [デバッグ] チェック ボックスをオンにします。

図: [システム構成] ユーティリティ

次に、システムを再起動して、管理者権限でデバッガーを起動します (UAC が有効になっている場合は、管理者として実行します)。[File] (ファイル) メニューの [Symbol File Path] (シンボル ファイルのパス) をクリックして [Symbol Search Path] (シンボルの検索パス) ダイアログ ボックスを開いて、デバッガーで Microsoft シンボル サーバーをポイントし、「srv*c:\symbols*http://msdl.microsoft.com/download/symbols」と入力します (c:\symbols は、デバッガーでキャッシュされたシンボルを格納するローカル ディレクトリに置き換えます)。次に、[File] (ファイル) メニューの [Kernel Debug] (カーネルのデバッグ) をクリックして [Kernel Debugging] (カーネルのデバッグ) ダイアログ ボックスを開き、[Local] (ローカル) タブをクリックして [OK] をクリックします (下図参照)。

図: [Kernel Debugging] (カーネルのデバッグ) ダイアログ ボックス

これ以降の手順は、実行している Windows が 32 ビットと 64 ビットのどちらであるかと、Windows のバージョンが Windows Vista 以上であるかどうかによって異なります。

32 ビットの Windows XP と Windows Server 2003

32 ビットの Windows XP と Windows Server 2003 でブルー スクリーンを表示している関数は、KeBugCheck2 なので、この関数が、画面の背景を塗りつぶす InbvSolidColorFill という関数に色の値を渡している場所を探します。「u kebugcheck2」というコマンドを入力して関数の開始位置を列挙したら、「u」というコマンドを入力して、InbvSolidColorFill 関数の参照が見つかるまで関数のコードのページを繰り返しダンプします (「u」というコマンドは一度入力すれば、Enterキーを押すだけでコマンドを繰り返し実行できます)。次のように関の呼び出しが見つかるまでは、30 ~ 40 ページをダンプする必要があります。

図: 関数 KeBugCheck2 が、画面の背景を塗りつぶす InbvSolidColorFill 色の値を渡している場所を探す。

上図のように、呼び出しの前に、4 という引数を持つ命令 (push 4) があります。左側のアドレス列で命令のコード アドレスを選択してコピーし、Ctrlキーを押しながら Cキーを押します。それから、デバッガーのコマンド ウィンドウで「eb」と入力して、Ctrlキーと Vキーを押してアドレスを貼り付け、「+1」と入力したら、Enterキーを押します。デバッガーは、メモリ編集モードになり、色の値のアドレスが表示されます。これで自分の好きな色を選べるようになりました。1 が赤で、2 が緑です。ブルー スクリーンの色を変えたい場合はテストしてみましょう。必要な操作は、数値を入力して、Enterキーを 2 回押して変更をコミットし、編集モードを終了するだけです。次に、この処理が完了した後の状態を示します。

図: 色の値のアドレスを探して変更する

64 ビットの Windows と 32 ビットの Windows Vista 以上

64 ビットの Windows と 32 ビットの Windows Vista 以上で、ブルー スクリーンを描画する中核となる関数は KiDisplayBlueScreen です。「InbvSolidColorFill」と入力したら、「u」と続けて入力し、InbvSolidColorFill 関数の呼び出しが見つかるまで、関数のページをダンプします。32 ビットの Windows では、先ほどの Windows XP と Windows Server 2003 のセクションの指示に従い、色の値を見つけて編集します。64 ビットの Windows では、InvbSolidColorFill 関数の呼び出し前の命令で色を渡すため、そのアドレス (左側の列の数値) をコピーして、「eb <アドレス>+4」というコマンドを入力して、アドレスを編集します。次のように、デバッガーがメモリ編集モードになり、値を変更できるようになります (たとえば、赤にするには 1、緑にするには 2 を入力します)。

図: InvbSolidColorFill 関数の呼び出し前の命令で色を渡す部分のアドレスをコピーして編集する

結果を確認する

これで、システムをクラッシュする準備ができました。64 ビットの Windows を実行している場合、何も追加で実行することなくシステムをクラッシュできます。これは、カーネル パッチ保護で、変更が検出され、動作を変更する目的でカーネルのコードを変更しようとする ISV を妨害するために、システムをクラッシュするからです。ですが、この現象が発生するまでには、最大数分かかる場合があります。オンデマンドでシステムをクラッシュさせるには、Notmyfault ツール (このツールは、書籍『Windows Internals』が紹介されているページからダウンロードできます) を実行して、下図の [Do Bug] (クラッシュ) ボタンをクリックします (データが失われないようにするには、すべての作業内容を保存して、他のアプリケーションを終了します)。

図: システムをクラッシュしてみる

これで、選択した色でブルー スクリーンが表示されます。今回は、次のような "死のレッド スクリーン" になりました。

図: 実行結果画面 (赤)

クリスマス仕様のブルー スクリーン

クリスマス シーズンということで、少し高度なクリスマス仕様のブルー スクリーンを生成したいと思います。このブルー スクリーンでは、背景色だけでなく、テキストの色も変更します。64 ビットの Windows Vista 以上の OS で実行するには、次に示す、InvbSolidColorFill 関数の呼び出しの直後にある InvbSetTextColor 関数の呼び出しと、テキストの色を move ecx, 0Fh という関数に渡す命令のアドレスに注目してください。

図: 色を変更してみる

0Fh パラメーターは白を表しますが、これまでに説明した編集の手法を使って変更できます。eb コマンドを使用して、命令に 1 を加算したアドレスを渡します。ここでは、次のように、色を赤 (値 1) に設定しました。

図: 編集箇所と方法

次に、私が作成したクリスマス仕様のブルー スクリーンを示します。

図: 実行結果画面 (緑)

それでは、楽しいクリスマスをお過ごしください。紹介したいトラブルシューティングの事例がありましたら、画面ショット (できれば .PNG 形式でお願いします) とログ ファイルを送ってください。

ページのトップへ

共有

ブログにコピー: ([Ctrl] + [C] でコピーしてください)