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ではありません)