リロケートされたプログラムのバグの箇所を簡単に突き止める
ドライバなどのバグでブルースクリーンになった時のエラーを簡単に突き止める方法をガイドします。
ブルースクリーンのエラーのパラメータの意味についてはこのサイトが参考になります
例えば、 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 が 本当に正しいか バイナリエディタで見てみます
PE の文字列から8バイト後ろを見てみます。 これがファイルのリンク更新日時で、 DateStamp になります。
次にエラーの場所を特定してみましょう。
base at B8E9E0000 となっていますが、そのまま逆アセンブルしてみると
ベースアドレスが 000100000 からなので計算がめんどくさいですから、 PEMaker を使います。
Image Base を 書き換えて別の場所に保存したら、逆アセンブルしてみましょう。
(上書きしないこと)
B8EAB8F8 で アドレス 13chに書き込みしようとしているということなので、ediの値が 0なので エラーになっていることが分かりました。
PE Maker(仮) 公開場【BM】
PE Explorer Disassembler リソースエディタ 逆アセンブラ exeファイル リソース 抽出 リバース アセンブラ
Comments