Hook SSDT中NtCreateProcessEx

  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 }

 

 

整個流程:
首先在DriverEntry調用HookCreateProcess()函數,該函數的做用是將SSDT表中NtCreateProcessEx()函數的地址替換爲
MyNtCreatePocessEx()函數的地址。
而MyNtCreatePocessEx()函數是用來取代NtCreateProcessEx()函數的函數。
 
說明:
執行UN_PROTECT()後,CPU能夠向標誌爲 只讀的內存頁進行寫入操做。
寫入完成後,執行RE_PROTECT()函數回覆到原來的狀態。
 
效果:
當加載驅動後,隨意運行一個程序,用dbgview就能接受到「 Hook NtCreateProcess Success」成功提示字符串
 
 
 
環境:
XP SP3
 
注意:
ulNtCreateProcesseExAddr = ulSsdt + 48 * 4;//這的48根據本身的電腦SSDT表中NtCreateProcessEx序號
相關文章
相關標籤/搜索