2

SSDT エントリをフックする Windows7 デバイス ドライバーを作成しました。SSDT (Secondary System Descriptor Tables) は書き込み保護されていると思いました。とにかくSSDTを上書きしようとしましたが、エラーなく成功しました。私はネイティブマシン(VMではなく)でこれを行っていました.CR0レジスタを印刷して、SSDTを上書きする前にWPがクリアされたかどうかを確認しました。CR0 の WP ビットが設定されました...どうすれば回避せずに SSDT を上書きできますか? これがどのように可能かわかりません。誰かがこれを説明できますか?

NTSTATUS DriverEntry(PDRIVER_OBJECT driverObject, PUNICODE_STRING RegistryPath) {

unsigned int m_cr0=0;
__asm
  {
          push eax
          mov eax, CR0
          mov m_cr0, eax;
          pop eax
  }

DbgPrint("CR0 : %08X\n", m_cr0);
driverObject->DriverUnload = Unload_driver;
DbgPrint("Hooking API! SSDT:%08X\n", (unsigned int)((void*)&KeServiceDescriptorTable));

Hooking();

return(STATUS_SUCCESS);

}

#define SYSTEMSERVICE(_name) KeServiceDescriptorTable.ServiceTable[*(DWORD *) ((unsigned char *)_name + 1)]


void Hooking(void){

DbgPrint("Hooking API! ZwCreateFile : %08X, index : %d\n", ZwCreateFile, *(DWORD *) ((unsigned char *)ZwCreateFile + 1) );
DbgPrint("Hooking API! FakeZwCreateFile : %08X\n", FakeZwCreateFile);

DbgPrint("Hooking API! ZwQueryDirectoryFile : %08X, index : %d\n", ZwQueryDirectoryFile, *(DWORD *) ((unsigned char *)ZwQueryDirectoryFile + 1) );
DbgPrint("Hooking API! FakeZwQueryDirectoryFile : %08X\n", FakeZwQueryDirectoryFile);

DbgPrint("Hooking API! ZwQueryVolumeInformationFile : %08X, index : %d\n", ZwQueryVolumeInformationFile, *(DWORD *) ((unsigned char *)ZwQueryVolumeInformationFile + 1) );
DbgPrint("Hooking API! FakeZwQueryVolumeInformationFile : %08X\n", FakeZwQueryVolumeInformationFile);

//cli, sti - disable/enable interruptions
_asm{cli}
// hook CreateFile
OrigZwCreateFile = (ZWCREATEFILE) (SYSTEMSERVICE(ZwCreateFile));
(ZWCREATEFILE) (SYSTEMSERVICE(ZwCreateFile)) = FakeZwCreateFile;

// hook QueryDirectoryFile
OrigZwQueryDirectoryFile = (ZWQUERYDIRECTORYFILE) (SYSTEMSERVICE(ZwQueryDirectoryFile));
(ZWQUERYDIRECTORYFILE) (SYSTEMSERVICE(ZwQueryDirectoryFile)) = FakeZwQueryDirectoryFile;

// hook QueryVolumeInformationFile
OrigZwQueryVolumeInformationFile = (ZWQUERYVOLUMEINFORMATIONFILE) (SYSTEMSERVICE(ZwQueryVolumeInformationFile));
(ZWQUERYVOLUMEINFORMATIONFILE) (SYSTEMSERVICE(ZwQueryVolumeInformationFile)) = FakeZwQueryVolumeInformationFile;
_asm{sti}

}

これは私のドライバー エントリ コードと SSDT フック コードです。CR0 レジスタ値をダンプし、ZwCreateFile、ZwQueryDirectoryFile、ZwQueryVolumeInformationFile の SSDT エントリを変更しました。

デバッグ ビュー

これはデバッグ ビュー (DbgPrint メッセージを表示) のスクリーン キャプチャです。ただし、SSDT フックは正常に動作します。CreateFile、QueryDirectoryFile... のシステム API は、自分の好みに合わせて変更されています。

OSはWindows7プロフェッショナルK、32bitでした。実際のマシンで実行されています(VMではありません)

4

0 に答える 0