rootKitへの挑戦状?(KeServiceDescriptorTable編)
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2007/03/27(火) 15:36:00ドライバファイル(sys)
※主要箇所のみ抜粋
/*APIフック*/
KeServiceDescriptorTable.ServiceTableBase(0xXXX) = 自作API;
/*サービステーブル書換*/
NewServiceTable = ExAllocatePool(NonPagedPool, (KeServiceDescriptorTable.NumberOfServices) * 4);
memcpy(NewServiceTable, KeServiceDescriptorTable.ServiceTableBase, (KeServiceDescriptorTable.NumberOfServices) * 4);
KeServiceDescriptorTable.ServiceTableBase = NewServiceTable;
〜〜〜〜〜〜〜〜〜〜問題〜〜〜〜〜〜〜〜〜〜
上記、プログラムをコンパイル/実行すると、『APIフック部分』でフックした
自作APIがよびだされる。
しかし、上記プログラムを実行した後、あるプログラム(以降、プログラムX)を実行すると、
APIフック部分でフックした自作APIが呼び出されずに、本物のAPIがよびだされる。
『サービステーブル書換』で、テーブルの書換えを行っているにもかかわらずだ。
ここで問題。
1.プログラムXは、どやって、本物のAPIのアドレスを取得しているのか?
2.プログラムXは、どやって、本物のサービステーブルのアドレスを取得しているのか?
以上、わかるやつは、かかってこい
0002デフォルトの名無しさん
2007/03/27(火) 15:43:270003デフォルトの名無しさん
2007/03/27(火) 16:22:510004デフォルトの名無しさん
2007/03/27(火) 16:54:390005デフォルトの名無しさん
2007/03/28(水) 02:46:080006デフォルトの名無しさん
2007/03/28(水) 02:52:53書き換えるタイミングを早過ぎ or 遅過ぎとか
そもそもそのドライバが見てるデータはコピーに過ぎないとか
どーせそんなオチだろ。まぁ、がんばれよ。
0007デフォルトの名無しさん
2007/03/28(水) 04:20:39Zw****じゃない関数を呼び出したからじゃねーの?
ハンドルを閉じるAPIならZwCloseじゃなくてNtCloseとか。
テーブルを見るのはZw****の時だけだった気がする。
ん?Xがユーザーモードのプログラム?だったら知らん。
0008デフォルトの名無しさん
2007/03/28(水) 17:09:40問題が言葉足らず?なんじゃない?
>>1が言いたいのは、こういうこと?
登場するプログラムは全部で3つ。
1つは、
>>1が作った、API/テーブル書換プログラム
(以降、『フックプログラム』)
1つは、
『フックプログラム』がフックしたAPIを呼び出す確認用プログラム
(以降、『確認プログラム』)
最後の1つは、
『フックプログラム』がフックしたはずのAPIをもとにもどしてしまう、フック解除プログラム
(以降、『プログラムX』)
...つづく
0009デフォルトの名無しさん
2007/03/28(水) 17:12:461.『フックプログラム』実行
2.『確認プログラム』実行
3.「1.」にてフックした自作APIが呼び出されていることを確認。
だったものが、
1.『フックプログラム』実行
2.『確認プログラム』実行
3.「1.」にてフックした自作APIが呼び出されていることを確認。
4.『プログラムX』実行
5.『確認プログラム』実行
6.「1.」にてフックした自作APIが呼び出されていない。
と、いうことだとおもう。
0010デフォルトの名無しさん
2007/03/28(水) 17:21:10>>1のソースを見る限り、>>1がいいたいことは、
>> /*APIフック*/
>> KeServiceDescriptorTable.ServiceTableBase(0xXXX) = 自作API;
↑で、サービステーブルに設定されていた正しいAPIへのアドレスが
自作APIへのアドレスに上書きされる。
⇒『正しいAPIへのアドレスを取得することが不可能になっているはず!!』
>> /*サービステーブル書換*/
>> NewServiceTable = ExAllocatePool(NonPagedPool, (KeServiceDescriptorTable.NumberOfServices) * 4);
>> memcpy(NewServiceTable, KeServiceDescriptorTable.ServiceTableBase, (KeServiceDescriptorTable.NumberOfServices) * 4);
>> KeServiceDescriptorTable.ServiceTableBase = NewServiceTable;
↑で、サービステーブル自体の正しいアドレスが新しく作成されたテーブルの
アドレスで上書きされる。
⇒『正しいサービステーブルのアドレスを取得することが不可能になっているはず!!』
⇒『取得できないってことは、仮に正しいAPIのアドレスを取得できたとしても、
その値を設定する先(サービステーブル)がわからないはず!!』
って、ことかな?
長文、すんません><
hookする前に取得済み。
OSによって固定のaddressだから、特に考える必要は無い。
■ このスレッドは過去ログ倉庫に格納されています