NTOSKRNL.EXEのエクスポートテーブルを書き換えて関数を増やしてみる実験
Windows2000のカーネル関数 IoSetCompletionRoutineExがないせいで、iPod Touchや iPhoneは動作しないわけですが、新しいドライバが出るたびに毎回Patch当てするのは面倒なので、Kernelに直接関数を追加できないか実験してみました。
まず、マルチコアカーネルのエクスポートテーブルのアドレス
13AB40を 13AB30にずらして、前のリソーステーブルのサイズをd40からd30に変更。
リソーステーブルのオフセット
+0c 関数名テーブルへのオフセットアドレス
+10 序数の開始値
+14 序数の終了値
+18 関数の数
+1c 関数の実行アドレステーブル
+20 関数名テーブルのテーブルへのオフセットアドレス
+24 関数のHint値のテーブルへのオフセットアドレス
これを整合性が取れるように書き換えて、最後に IoSetCompletionRoutineEx の文字列を追加して、リソーステーブルのサイズの整合性も取れるように書き換え。
0x4000 付近に冗長なテキスト領域があるので、ここに関数の内容を追加。
リロケートテーブルが 0x193f80から始まるが、手前に空きがあるので、0x193f70にずらして、追加したプログラムのリロケートテーブルを追加。
ちなみにリロケートテーブルは
リロケートテーブルサイズ+テーブル(WORD)xテーブルの数
と言う構成になっています。
最後に、CheckSUMを修正して、完成。
NTOSKRNL.EXEと置換して起動してみる。
Windows2000はエラーもなく起動できて、追加できた様子。
しかし、
ドライバがなぜか動かない orz
(多分続く)
Comments