リロケートされたプログラムのバグの箇所を簡単に突き止める

ドライバなどのバグでブルースクリーンになった時のエラーを簡単に突き止める方法をガイドします。

ブルースクリーンのエラーのパラメータの意味についてはこのサイトが参考になります

Bug Check Code Reference

例えば、 Bug Check 0xD1: DRIVER_IRQL_NOT_LESS_OR_EQUAL が発生したとき 以下のようなメッセージが出ていた場合

*** STOP: 0x000000D1 (0x0000013C, 0x00000002, 0x00000001, 0xB8EAB8F8)
*** atapi.sys - Address B8EAB8F8 base at B8E9E0000, DateStamp 4802539d
第一パラメターはメモリを参照したアドレス
第二パラメータは
IRQL のレベル

IRQLのレベルとはこんな感じ。
レポート11:スケジューリングと割り込み要求レベル(IRQL)

分かりやすく説明すると
0 の場合は普通のプログラム
1 は APC(Asynchronous Procedure Call) にキューイングされた処理。
2 はドライバなどカーネルモードで実行される DISPATCH LEVEL

第三パラメータは何をしたか
0 は読み込み、
1は書き込み、
8は実行です

第4パラメータはプログラムが実行しようとしたアドレスになります。

次にエラーを起こしたモジュールを確認してみます。

DateStamp となっていますが、4802539d が 本当に正しいか バイナリエディタで見てみます

pex
PE の文字列から8バイト後ろを見てみます。 これがファイルのリンク更新日時で、 DateStamp になります。

次にエラーの場所を特定してみましょう。

base at B8E9E0000 となっていますが、そのまま逆アセンブルしてみると

ベースアドレスが 000100000 からなので計算がめんどくさいですから、 PEMaker を使います。
pex2

Image Base を 書き換えて別の場所に保存したら、逆アセンブルしてみましょう。
(上書きしないこと)

pex3
B8EAB8F8 で アドレス 13chに書き込みしようとしているということなので、ediの値が 0なので エラーになっていることが分かりました。

PE Maker(仮) 公開場【BM】
PE Explorer Disassembler リソースエディタ 逆アセンブラ exeファイル リソース 抽出 リバース アセンブラ

おすすめ

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です