首先要知道Ring3层调用OpenProcess的流程
//当Ring3调用OpenProcess
//1从自己的模块(.exe)的导入表中取值
//2Ntdll.dll模块的导出表中执行ZwOpenProcess(取索引 进入Ring0层)
//3进入Ring0 从Ntoskernel.exe模块的导出表中执行ZwOpenProcess(取索引 获得SSDT服务地址)
//4通过索引在SSDT表中取值(NtOpenProcess的地址)
//5真正调用NtOpenProcess函数
我们可以通过在第4部通过索引将NtOpenProcess 换成 Base[索引] = FakeNtOpenProcess;
1.我们要获取SSDT的结构信息
XP 32位的SSDT在Ntos模块导出表中有
1 //SSDT表的基地址32位(4Bytes)64位(8Bytes) 2 //XP 32位Ntos模块导出表中有 Win7 64 Ntos模块导出表中无 3 BOOLEAN GetSSDTAddressInWinXP_X86(ULONG32* SSDTAddress) 4 { 5 //从NtosKernel.exe 模块中的导出表获得该导出变量 KeServiceDescriptorTable 6 7 /* 8 kd> dd KeServiceDescriptorTable 9 80563520 804e58a0 00000000 0000011c 805120bc 10 */ 11 *SSDTAddress = NULL; 12 *SSDTAddress = (ULONG32)GetExportVariableAddressFormNtosExportTableByVariableName(L"KeServiceDescriptorTable"); 13 14 if (*SSDTAddress!=NULL) 15 { 16 return TRUE; 17 } 18 19 return FALSE; 20 }