SSDT HOOK驱动开发(2):进程保护

SSDT HOOK进程保护挂钩ZwTerminateProcess函数,不过这个函数仅有两个参数,其中一个是进程句柄,它指定了需要被结束的进程。

  1. #include<ntddk.h>  
  2.   
  3. typedef struct ServiceDescriptorEntry  {  
  4.     unsigned int *ServiceTableBase;          //指向系统服务程序的地址(SSDT)  
  5.     unsigned int *ServiceCounterTableBase;   //指向另一个索引表,该表包含了每个服务表项被调用的次数;不过这个值只在Checkd Build的内核中有效,在Free Build的内核中,这个值总为NULL  
  6.     unsigned int NumberOfServices;           //表示当前系统所支持的服务个数  
  7.     unsigned char *ParamTableBase;           //指向SSPT中的参数地址,它们都包含了NumberOfService这么多个数组单元  
  8. } ServiceDescriptorTableEntry , *PServiceDescriptorTableEntry;  
  9.   
  10. extern PServiceDescriptorTableEntry KeServiceDescriptorTable;//KeServiceDescriptorTable为导出函数  
  11.   
  12. typedef NTSTATUS (*NTTERNIMATEPROCESS)(  
  13.     IN HANDLE ProcessHandle,  
  14.     IN NTSTATUS ExitStatus  
  15. ); //定义一个函数指针  
  16.   
  17. NTTERNIMATEPROCESS pRealNtTerminateAddr;  
  18.   
  19. ULONG RealServiceAddress;                //接受被hook的函数地址  
  20. CHAR *TerminateName = "Client.exe";      //这里就是我们的进程名  
  21. UCHAR *PsGetProcessImageFileName( IN PEPROCESS Process );  
  22.   
  23. BOOLEAN IsProtect(CHAR *temp)            //判断正在结束的进程是否是我们要保护的进程  
  24. {  
  25.     ULONG len = strcmp(TerminateName, temp);  
  26.     if(!len)  
  27.         return TRUE;  
  28.     return FALSE;  
  29. }  
  30.   
  31. NTSTATUS MyNtTerminateProcess(IN HANDLE ProcessHandle, IN NTSTATUS ExitStatus)//我们自己的NtTerminateProcess  
  32. {  
  33.     PEPROCESS process;  //接受通过ProcessHandle返回的进程  
  34.     NTSTATUS status;   
  35.     CHAR *pName;        //接受进程的进程名  
  36.       
  37.     status = ObReferenceObjectByHandle(ProcessHandle,  
  38.         FILE_READ_DATA,0,KernelMode,&process,NULL);    //获取进程  
  39.       
  40.     if(!NT_SUCCESS(status))   
  41.         return (NTSTATUS)(NTTERNIMATEPROCESS)pRealNtTerminateAddr(ProcessHandle, ExitStatus);  
  42.       
  43.     pName = (CHAR*)PsGetProcessImageFileName(process); //获取进程名  
  44.     if(IsProtect(pName)) //判断是否是我们要保护的进程,是则返回权限不足,否则调用原函数结束进程  
  45.     {  
  46.         if(process != PsGetCurrentProcess())  
  47.         {  
  48.             return STATUS_ACCESS_DENIED;  
  49.         }  
  50.     }  
  51.       
  52.     return (NTSTATUS)(NTTERNIMATEPROCESS)pRealNtTerminateAddr(ProcessHandle, ExitStatus);   
  53. }  
  54.   
  55. VOID Hook()  
  56. {  
  57.     ULONG Address;  
  58.     Address = (ULONG)KeServiceDescriptorTable->ServiceTableBase + 0x101 * 4; // 2003 0x10A  
  59.     RealServiceAddress = *(ULONG*)Address;  
  60.     pRealNtTerminateAddr = (NTTERNIMATEPROCESS)RealServiceAddress;  
  61.     __asm{//去掉内存保护  
  62.         cli  
  63.             mov eax,cr0  
  64.             and eax,not 10000h  
  65.             mov cr0,eax  
  66.     }  
  67.     *((ULONG*)Address) = (ULONG)MyNtTerminateProcess; //替换为我们自己的NtTerminateProcess函数  
  68.     __asm{//恢复内存保护   
  69.         mov eax,cr0  
  70.             or eax,10000h  
  71.             mov cr0,eax  
  72.             sti  
  73.     }  
  74. }  
  75.   
  76. VOID Unhook()  
  77. {  
  78.     ULONG Address;  
  79.     Address = (ULONG)KeServiceDescriptorTable->ServiceTableBase + 0x101 * 4; // 2003 0x10A  
  80.     __asm{  
  81.         cli  
  82.             mov eax,cr0  
  83.             and eax,not 10000h  
  84.             mov cr0,eax  
  85.     }  
  86.     *((ULONG*)Address) = (ULONG)RealServiceAddress;   
  87.     __asm{   
  88.         mov eax,cr0  
  89.             or eax,10000h  
  90.             mov cr0,eax  
  91.             sti  
  92.     }  
  93. }  
  94.   
  95. VOID OnUnload(IN PDRIVER_OBJECT DriverObject)  
  96. {  
  97.     DbgPrint("Unhooker unload!");  
  98.     Unhook();  
  99. }  
  100.   
  101. NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject,PUNICODE_STRING RegistryPath)  
  102. {  
  103.     DriverObject->DriverUnload = OnUnload;  
  104.     DbgPrint("Unhooker load");  
  105.     Hook();  
  106.     return STATUS_SUCCESS;  
  107. }  
 

 


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值