トップページ⇒tech
11コメント6KB

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:27
>>1先生の次回作にご期待ください
0003デフォルトの名無しさん2007/03/27(火) 16:22:51
答えしりてぇ〜age
0004デフォルトの名無しさん2007/03/27(火) 16:54:39
これしか書いてないんじゃなんともいえない
0005デフォルトの名無しさん2007/03/28(水) 02:46:08
オレも答えが相当きになる
0006デフォルトの名無しさん2007/03/28(水) 02:52:53
>>1
書き換えるタイミングを早過ぎ or 遅過ぎとか
そもそもそのドライバが見てるデータはコピーに過ぎないとか
どーせそんなオチだろ。まぁ、がんばれよ。
0007デフォルトの名無しさん2007/03/28(水) 04:20:39
Xもカーネルモードのプログラムだったら
Zw****じゃない関数を呼び出したからじゃねーの?
ハンドルを閉じるAPIならZwCloseじゃなくてNtCloseとか。
テーブルを見るのはZw****の時だけだった気がする。

ん?Xがユーザーモードのプログラム?だったら知らん。
0008デフォルトの名無しさん2007/03/28(水) 17:09:40
>>1
問題が言葉足らず?なんじゃない?

>>1が言いたいのは、こういうこと?
登場するプログラムは全部で3つ。
1つは、
  >>1が作った、API/テーブル書換プログラム
  (以降、『フックプログラム』)
1つは、
  『フックプログラム』がフックしたAPIを呼び出す確認用プログラム
  (以降、『確認プログラム』)
最後の1つは、
  『フックプログラム』がフックしたはずのAPIをもとにもどしてしまう、フック解除プログラム
  (以降、『プログラムX』)

...つづく
0009デフォルトの名無しさん2007/03/28(水) 17:12:46
それで、>>1が言ってるのは、

1.『フックプログラム』実行
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のアドレスを取得できたとしても、
       その値を設定する先(サービステーブル)がわからないはず!!』

って、ことかな?

長文、すんません><
0011 ◆0uxK91AxII 2007/03/29(木) 10:01:26
>>1
hookする前に取得済み。
OSによって固定のaddressだから、特に考える必要は無い。
■ このスレッドは過去ログ倉庫に格納されています