这段时间在学习驱动,然后看到hook ssdt的代码,找了一个写的清晰的学习了一下:http://www.netfairy.net/?post=218

这里是hook NtOpenProcess,但是想自己练手所以hook NtTerminateProcess,经过多次蓝屏后,然后这里记录一下

  • 遇到的问题

由于所学的例子是通过应用程序获取pid来控制保护的进程,但是ZwTerminateProcess不能通过参数获得PID,那如何获取PID呢?

  • 解决方案

通过ZwQueryInformationProcess获得ProcessInformation再获得PID

  • 环境

开发配置:vs2015  x86  debug

测试环境:xp sp3

驱动代码

  1 #include <ntddk.h>
  2
  3 #define NT_DEVICE_NAME L"\\Device\\ProtectProcess"
  4 #define DOS_DEVICE_NAME L"\\DosDevices\\ProtectProcess"
  5
  6 #define IOCTL_PROTECT_CONTROL CTL_CODE(FILE_DEVICE_UNKNOWN, 0x800, METHOD_BUFFERED, FILE_ANY_ACCESS)
  7
  8
  9 #pragma pack(1)        //SSDT表的结构
 10 typedef struct ServiceDescriptorEntry
 11 {
 12   unsigned int *ServiceTableBase;
 13   unsigned int *ServiceCounterTableBase; //Used only in checked build
 14   unsigned int NumberOfServices;
 15   unsigned char *ParamTableBase;
 16 } ServiceDescriptorTableEntry_t, *PServiceDescriptorTableEntry_t;
 17 #pragma pack()
 18
 19 __declspec(dllimport) ServiceDescriptorTableEntry_t KeServiceDescriptorTable;        //变量名是不能变的,因为是从外部导入
 20
 21                                            //这个用于查询某个函数的地址的宏定义
 22 #define SYSTEMSERVICE(_function) KeServiceDescriptorTable.ServiceTableBase[*(PULONG)((PUCHAR)_function+1)]
 23
 24 NTSYSAPI NTSTATUS NTAPI ZwQueryInformationProcess(
 25   IN HANDLE ProcessHandle,
 26   IN PROCESSINFOCLASS ProcessInformationClass,
 27   OUT PVOID ProcessInformation,
 28   IN ULONG ProcessInformationLength,
 29   OUT PULONG ReturnLength);
 30
 31 NTSYSAPI NTSTATUS NTAPI ZwTerminateProcess(
 32   IN HANDLE ProcessHandle OPTIONAL,
 33   IN NTSTATUS ExitStatus);
 34
 35
 36 typedef NTSTATUS (*ZWTERMINATEPROCESS)(
 37   IN HANDLE ProcessHandle OPTIONAL,
 38   IN NTSTATUS ExitStatus);
 39
 40 ZWTERMINATEPROCESS OldZwTerminateProcess;
 41 long pid = -1;
 42
 43 NTSTATUS DispatchDeviceControl(IN PDEVICE_OBJECT deviceObject, IN PIRP Irp)
 44 {
 45   NTSTATUS nStatus = STATUS_SUCCESS;
 46   ULONG IoControlCode = 0;
 47   PIO_STACK_LOCATION IrpStack = NULL;
 48
 49   long* inBuf = NULL;
 50   char* outBuf = NULL;
 51   ULONG inSize = 0;
 52   ULONG outSize = 0;
 53   PCHAR buffer = NULL;
 54   PMDL mdl = NULL;
 55
 56   Irp->IoStatus.Status = STATUS_SUCCESS;
 57   Irp->IoStatus.Information = 0;
 58
 59   IrpStack = IoGetCurrentIrpStackLocation(Irp);    //利用函数获得当前请求任务的参数
 60   switch (IrpStack->MajorFunction)
 61   {
 62   case IRP_MJ_CREATE:
 63     DbgPrint("IRP_MJ_CREATE被调用\n");
 64     break;
 65   case IRP_MJ_CLOSE:
 66     DbgPrint("IRP_MJ_CLOSE被调用\n");
 67     break;
 68   case IRP_MJ_DEVICE_CONTROL:
 69     DbgPrint("IRP_MJ_DEVICE_CONTROL被调用\n");
 70     IoControlCode = IrpStack->Parameters.DeviceIoControl.IoControlCode;
 71     switch (IoControlCode)
 72     {
 73     case IOCTL_PROTECT_CONTROL:
 74       inSize = IrpStack->Parameters.DeviceIoControl.InputBufferLength;
 75       outSize = IrpStack->Parameters.DeviceIoControl.OutputBufferLength;
 76
 77       inBuf = (long*)Irp->AssociatedIrp.SystemBuffer;
 78       pid = *inBuf;
 79       DbgPrint("==================================");
 80       DbgPrint("IOCTL_PROTECT_CONTROL被调用,通讯成功\n");
 81       DbgPrint("输入缓冲区大小:%d\n", inSize);
 82       DbgPrint("输出缓冲区大小:%d\n", outSize);
 83       DbgPrint("输入缓冲区内容:%ld\n", inBuf);
 84       DbgPrint("当前保护进程ID:%ld\n", pid);
 85       DbgPrint("==================================");
 86       break;
 87     default:
 88       break;
 89     }
 90     break;
 91   default:
 92     DbgPrint("未知请求包被调用\n");
 93     break;
 94   }
 95
 96   nStatus = Irp->IoStatus.Status;
 97
 98   IoCompleteRequest(Irp, IO_NO_INCREMENT);
 99
100   return nStatus;
101 }
102
103 NTSTATUS NewZwTerminateProcess(
104   IN HANDLE ProcessHandle OPTIONAL,
105   IN NTSTATUS ExitStatus)
106 {
107   NTSTATUS nStatus = STATUS_SUCCESS;
108
109   ULONG Ret;
110   PROCESS_BASIC_INFORMATION pbi;
111
112   //pBuffer = ExAllocatePool(PagedPool, sizeof(PROCESS_BASIC_INFORMATION));
113   ZwQueryInformationProcess(ProcessHandle, ProcessBasicInformation, (PVOID)&pbi, sizeof(PROCESS_BASIC_INFORMATION), &Ret);
114
115
116   if (pbi.UniqueProcessId == pid)
117   {
118     DbgPrint("保护进程不被关闭:%d\n", pid);
119     return STATUS_ACCESS_DENIED;
120   }
121
122   nStatus = OldZwTerminateProcess(ProcessHandle, ExitStatus);
123   return STATUS_SUCCESS;
124 }
125
126 VOID DriverUnload(PDRIVER_OBJECT pDriverObject)
127 {
128   UNICODE_STRING DeviceLinkString;
129   PDEVICE_OBJECT DeviceObjectTemp1 = NULL;
130   PDEVICE_OBJECT DeviceObjectTemp2 = NULL;
131
132   DbgPrint("Driver Unload\n");
133
134   RtlInitUnicodeString(&DeviceLinkString, DOS_DEVICE_NAME);
135   IoDeleteSymbolicLink(&DeviceLinkString);
136   if (pDriverObject)
137   {
138     DeviceObjectTemp1 = pDriverObject->DeviceObject;
139     while (DeviceObjectTemp1)
140     {
141       DeviceObjectTemp2 = DeviceObjectTemp1;
142       DeviceObjectTemp1 = DeviceObjectTemp1->NextDevice;
143       IoDeleteDevice(DeviceObjectTemp2);
144     }
145   }
146
147   DbgPrint("设备已经卸载\n");
148   DbgPrint("修复SSDT表\n");
149   (ZWTERMINATEPROCESS)(SYSTEMSERVICE(ZwTerminateProcess)) = OldZwTerminateProcess;
150   DbgPrint("驱动卸载完毕\n");
151 }
152
153 NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObject, PUNICODE_STRING pRegPath)
154 {
155   NTSTATUS ntStatus = STATUS_SUCCESS;
156   UNICODE_STRING ntDeviceName;
157   UNICODE_STRING DeviceLinkString;
158   PDEVICE_OBJECT deviceObject = NULL;
159
160   RtlInitUnicodeString(&ntDeviceName, NT_DEVICE_NAME);
161
162   ntStatus = IoCreateDevice(
163     pDriverObject,
164     0,
165     &ntDeviceName,
166     FILE_DEVICE_UNKNOWN,
167     0,
168     FALSE,
169     &deviceObject);
170
171   if (!NT_SUCCESS(ntStatus))
172   {
173     DbgPrint("无法创建驱动设备");
174     return ntStatus;
175   }
176
177   RtlInitUnicodeString(&DeviceLinkString, DOS_DEVICE_NAME);
178   ntStatus = IoCreateSymbolicLink(&DeviceLinkString, &ntDeviceName);
179
180   if (!NT_SUCCESS(ntStatus))
181   {
182     return ntStatus;
183   }
184
185   pDriverObject->MajorFunction[IRP_MJ_CREATE] = DispatchDeviceControl;
186   pDriverObject->MajorFunction[IRP_MJ_CLOSE] = DispatchDeviceControl;
187   pDriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = DispatchDeviceControl;
188   pDriverObject->DriverUnload = DriverUnload;
189
190   DbgPrint("驱动程序已经启动\n");
191   DbgPrint("修改SSDT表。。。\n");
192
193   //修改ZwTerminateProcess函数地址
194   //将原来ssdt中所要hook的函数地址换成我们自己的函数地址
195   OldZwTerminateProcess = (ZWTERMINATEPROCESS)(SYSTEMSERVICE(ZwTerminateProcess));
196   SYSTEMSERVICE(ZwTerminateProcess) = (unsigned int)NewZwTerminateProcess;
197
198   DbgPrint("驱动程序加载完毕\n");
199
200   return STATUS_SUCCESS;
201 }

控制程序与上面所给链接的代码相同

转载于:https://www.cnblogs.com/QKSword/p/9960140.html

hook NtTerminateProcess进行应用的保护相关推荐

  1. (51)SSDT HOOK 实现进程保护

    一.回顾 在前面的课程里,我们逆向分析了 KiSystemService / KiFastCallEntry 的部分代码,我们发现这两个函数找系统服务表 SystemServiceTable 的方法是 ...

  2. 进程隐藏与进程保护(SSDT Hook 实现)(二)

    文章目录: 1. 引子 – Demo 实现效果: 2. 进程隐藏与进程保护概念: 3. SSDT Hook 框架搭建: 4. Ring0 实现进程隐藏: 5. Ring0 实现进程保护: 6. 隐藏进 ...

  3. 进程隐藏与进程保护(SSDT Hook 实现)(二) 转载自 Zachary.XiaoZhen - 梦想的天空

    文章目录:                   1. 引子 – Demo 实现效果: 2. 进程隐藏与进程保护概念: 3. SSDT Hook 框架搭建: 4. Ring0 实现进程隐藏: 5. Ri ...

  4. 内核编程之SSDTHook(3)Hook NtCreateSection监控所有可执行模块加载

    本博文由CSDN博主zuishikonghuan所作,版权归zuishikonghuan所有,转载请注明出处:http://blog.csdn.net/zuishikonghuan/article/d ...

  5. (70)内核重载 xp sp3 x86 单核

    一.项目说明 这次项目是这样设计的,首先 inline hook NtTerminateProcess 函数,使其他进程不能关闭受保护的进程,这里选择记事本. 然后编写一个普通的程序,调用 Termi ...

  6. CE+OD无法附加游戏进程的破解方法 来吧 别在为这烦恼了

    CE+OD无法附加游戏进程的破解方法 来吧 别在为这烦恼了 其实看过 windows 核心编程那本书的人都知道 计算机编程领域 那些所谓的游戏保护 真的只是为难菜鸟而已,对于大鸟基本不起作用. 游戏无 ...

  7. iOS-APP-运行时防Crash工具XXShield练就

    原文地址 前言 正在运行的 APP 突然 Crash,是一件令人不爽的事,会流失用户,影响公司发展,所以 APP 运行时拥有防 Crash 功能能有效降低 Crash 率,提升 APP 稳定性.但是有 ...

  8. iOS APP 运行时防Crash工具XXShield练就

    原文地址 前言 正在运行的 APP 突然 Crash,是一件令人不爽的事,会流失用户,影响公司发展,所以 APP 运行时拥有防 Crash 功能能有效降低 Crash 率,提升 APP 稳定性.但是有 ...

  9. MySQL 5.7中sync_binlog参数和半同步中after_commit和after_sync的区别

     导 读 作者:高鹏(重庆八怪) 原文地址:https://www.jianshu.com/p/59c6ecb46fe5 本文为我的一些零散记录供以后参考,但里面的部分问题经常会有朋友问到,翻以往的记 ...

最新文章

  1. Python爬取京东商品
  2. sql建立到mysql的会话_SQLalchemy会话和多个数据库尝试创建twi索引
  3. 学习python入门的个人建议及资料
  4. TensorFlow2.0正式版安装
  5. 线程池-ThreadPoolExecutor
  6. mysql中cost对比测试
  7. BZOJ3038 上帝造题的七分钟2
  8. 七缸发动机预热,docker swarm + .net core 高速飙车成功
  9. 圣剑传说 玛娜传奇(Legend of Mana)(LOM) 怪物掉落道具
  10. Idea设置全白色 背景
  11. NMAKE参考之二——运行NMAKE
  12. 该把优惠券发送给哪些用户?一文读懂Uplift模型
  13. Excel 插件使用教程
  14. 南京大学用python玩转数据答案_2020中国大学mooc用Python玩转数据章节答案
  15. mysql5.6 rpm安装配置
  16. CISSP-D8-软件开发安全
  17. C4996:#(The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name:)
  18. 周志华西瓜书学习笔记(一)
  19. Unity如何批量修改材质的属性
  20. MPEG LA推出一站式Qi无线充电许可

热门文章

  1. Android-----View绘制流程以及invalidate()等相关方法分析 .
  2. 回击质疑 HP StoreOnce用高性能说话
  3. 条款22: 尽量用“传引用”而不用“传值”
  4. devops和docker_通过免费的2小时Docker课程学习DevOps基础知识
  5. 30岁找不到工作很绝望_计算机为绝望的新编码员工作方式的快速指南
  6. 放大 旋转 css3,CSS3详解:transform 的旋转、旋转放大、放大、移动
  7. 属性配置文件详解(2)(十七)
  8. checkbox点击切换选中状态
  9. springboot初学
  10. 基于Virtual DOM与Diff DOM的测试代码生成