1 #ifdef __cplusplus 2 extern "C" 3 { 4 #endif 5 #include <ntddk.h> 6 #ifdef __cplusplus 7 } 8 #endif 9 10 11 typedef struct _ServiceDescriptorTable { 12 unsigned int *ServiceTableBase; //System Service Dispatch Table 的基地址 13 unsigned int *ServiceCounterTable; 14 //包含着 SSDT 中每一個服務被調用次數的計數器。這個計數器通常由sysenter 更新。 15 unsigned int NumberOfServices;//由 ServiceTableBase 描述的服務的數目。 16 unsigned int *ParamTableBase; //包含每一個系統服務參數字節數表的基地址-系統服務參數表 17 }*PServiceDescriptorTable; 18 19 extern "C" extern PServiceDescriptorTable KeServiceDescriptorTable; 20 21 typedef NTSTATUS (*NTCREATEPROCESSEX)(PHANDLE ProcessHandle, 22 ACCESS_MASK DesiredAccess, 23 POBJECT_ATTRIBUTES oa, 24 HANDLE ParentProcess, 25 ULONG Flags, 26 HANDLE SectionHandle, 27 HANDLE DebugPort, 28 HANDLE ExceptionPort, 29 ULONG JobFlag); 30 31 ULONG O_NtCreateProcesseEx = 0; // 保存原始地址 32 33 // 去掉頁面保護 34 VOID UN_PROTECT() 35 { 36 __asm 37 { 38 cli //關閉中斷,加強這段代碼的穩定性 39 push eax 40 mov eax, CR0 41 and eax, 0x0FFFEFFFF //使低17位爲0 從右往左第17位 42 mov CR0, eax 43 pop eax 44 } 45 } 46 47 // 恢復頁面保護 48 VOID RE_PROTECT() 49 { 50 __asm 51 { 52 push eax 53 mov eax, CR0 54 or eax,10000h //使低17位爲1 55 mov CR0, eax 56 pop eax 57 sti //打開中斷 58 } 59 } 60 61 62 63 //本身定義的函數,讓程序執行的函數 64 NTSTATUS 65 MyNtCreateProcessEx( 66 PHANDLE ProcessHandle, 67 ACCESS_MASK DesiredAccess, 68 POBJECT_ATTRIBUTES oa, 69 HANDLE ParentProcess, 70 ULONG Flags, 71 HANDLE SectionHandle, 72 HANDLE DebugPort, 73 HANDLE ExceptionPort, 74 ULONG JobFlag) 75 { 76 KdPrint(("Hook NtCreateProcess Success\n")); 77 // 調用NtCreateProcessEx函數,爲何可以調用?由於地址由於替換成NtCreateProcessEx函數的地址 78 // 3 正常返回 79 return ((NTCREATEPROCESSEX)O_NtCreateProcesseEx)(ProcessHandle, 80 DesiredAccess, 81 oa, 82 ParentProcess, 83 Flags, 84 SectionHandle, 85 DebugPort, 86 ExceptionPort, 87 JobFlag); 88 89 90 } 91 92 VOID HookSsdt() 93 { 94 //1 保存 95 O_NtCreateProcesseEx = KeServiceDescriptorTable->ServiceTableBase[48]; 96 UN_PROTECT(); 97 // 2 替換 98 KeServiceDescriptorTable->ServiceTableBase[48] = (unsigned int )MyNtCreateProcessEx; 99 RE_PROTECT(); 100 } 101 102 VOID UnHookSsdt() 103 { 104 // 4 替換回去 105 KeServiceDescriptorTable->ServiceTableBase[48] = O_NtCreateProcesseEx; 106 } 107 VOID DriverUnload(PDRIVER_OBJECT pDriverObject) 108 { 109 UnHookSsdt(); 110 KdPrint(("Driver Unload Success\n")); 111 } 112 extern "C" NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObject, PUNICODE_STRING pRegistryPath) 113 { 114 KdPrint(("Welcome to JoyChou's Driver\n")); 115 116 pDriverObject->DriverUnload = DriverUnload; 117 HookSsdt(); 118 return STATUS_SUCCESS; 119 }