2

我已经编写了一个 windows7 设备驱动程序,它挂钩 SSDT 条目。我认为 SSDT(二级系统描述符表)是写保护的。但是我还是尝试覆盖 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 消息)CR0 是“8001003B”,它告诉我第 16 位(WP)已设置。但 SSDT 钩子工作正常。CreateFile、QueryDirectoryFile... 的系统 API 已根据我的喜好进行了更改。

操作系统为Windows7 Professional K, 32bit。它在实际机器上运行(不在VM中)

4

0 回答 0