当前位置: 首页 > 编程日记 > 正文

hook NtTerminateProcess进行应用的保护

这段时间在学习驱动,然后看到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

相关文章:

linux系统 长久记录所有用户所有操作记录

在linux系统中想要记录所有登录过当前系统的用户操作&#xff0c;排查有人对当前系统做的何种操作导致系统问题&#xff0c;可以按照如下方法进行。 前言 在描述操作步骤之前&#xff0c;先说一下系统环境变量的相关配置文件 ~/.bashrc和~/.bash_file&#xff0c;这两个文件…

jquery图片播放切换插件

点击这里查看效果可自定义数字样式和左右点击按钮这个更好&#xff1a;移入按钮切换版本更多图片轮播以下是HTML文件代码&#xff1a; 1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transiti…

安卓饼状图设置软件_话单及银行卡交易智能分析软件

一、产品概况&#xff1a; 思迈奥SMILE数据智能分析软件是由我司自主设计与研发的一款结合在公安和检察院的侦查业务经验而定制研发的数据智能分析系统&#xff0c;包含于话单、电子银行账单、及其它数据(个人出行数据、社会资源数据、微信数据及其它聊天数据)等的数据导入、检…

跨区域MPLS TE

拓扑&#xff1a; R1配置&#xff1a; mpls label range 100 199 mpls traffic-eng tunnels interface Loopback0 ip address 192.168.1.1 255.255.255.255 ! interface Tunnel1 ip unnumbered Loopback0 tunnel mode mpls traffic-eng tunnel destination 192.168.1.4 tunnel …

C++智能指针: shared_ptr 实现详解

文章目录shared_ptr描述声明作用原理实现函数使用关于shared_ptr循环引用问题shared_ptr描述 声明 shared_ptr属于C11特性中新加的一种智能指针&#xff0c;它的实现方式是模版类&#xff0c;头文件<memory> template <class T> class shared_ptr 所以使用shared…

linux文本处理常用命令

linux文本处理常用命令 linux文本处理命令&#xff1a;grep、sed、printf、awk 1.grep grep的作用是按行查找字符&#xff0c;输出包含字符的行。 #从文件查询 grep hello filename.txt #从管道的输入查询 cat filename.txt|grep hello grep使用示例&#xff1a; grep的查找主要…

arduino 控制无刷电机_智能控制轮椅来了,残疾人的福音!

传统的轮椅已被证明是非常宝贵的工具&#xff0c;为残疾人提供了很多便利&#xff0c;但其只能限制坐在一个位置。外国的一个研究团队通过开发一个功能强大的多功能轮椅&#xff0c;使用户能够通过手机应用程序轻松地在各种各样的位置之间进行切换。(图片来自 IC photo)这是一种…

python科学计算整理

网站&#xff1a; http://bokeh.pydata.org/gallery.html 转载于:https://www.cnblogs.com/gogly/p/3453341.html

TP-link 841N 刷DD-WRT固件

2012年4月20号 今天&#xff0c;笔者逛“太平洋”的时候&#xff0c;发现了一个关于TP-Link 840N刷DD-WRT的帖子&#xff0c;进去逛了一会&#xff0c;突然记得自己家中的那个路由好像也是这个型号的&#xff0c;二话不说&#xff0c;果断收录这条资料&#xff0c;并把所需要的…

网格的铺设问题——骨牌

Problem Description 有一个大小是 2 x n 的网格&#xff0c;现在需要用2种规格的骨牌铺满&#xff0c;骨牌规格分别是 2 x 1 和 2 x 2&#xff0c;请计算一共有多少种铺设的方法。 Input 输入的第一行包含一个正整数T&#xff08;T<20&#xff09;&#xff0c;表示一共有 T…

C++智能指针:weak_ptr实现详解

文章目录weak_ptr描述声明作用原理实现函数成员使用总结weak_ptr描述 声明 头文件&#xff1a;<memory> 模版类&#xff1a;template <class T> class weak_ptr 声明方式&#xff1a;std::weak_ptr<type_id> statement 作用 根据boost库的官方描述&#…

在PHP中使用全局变量的几种方法

简介即使开发一个新的大型PHP程序&#xff0c;你也不可避免的要使用到全局数据&#xff0c;因为有些数据是需要用到你的代码的不同部分的。一些常见的全局数据有&#xff1a;程序设定类、数据库连接类、用户资料等等。有很多方法能够使这些数据成为全局数据&#xff0c;其中最常…

python处在哪个阶段_python 基础复习

1、简述cpu、内存、硬盘的作用cpu(1)cpu&#xff1a;处理逻辑运算、算术运算(2)cpu&#xff1a;接受指令传给电脑硬件&#xff0c;让其运行内存&#xff1a;(1)内存&#xff1a;从硬盘中读取数据&#xff0c;供其cpu调取指令运行&#xff0c;短暂的存贮数据&#xff1b;运行速度…

android用户界面之WebView教程实例汇总

一、WebView教程1.Android---UI篇---WebView&#xff08;网络视图&#xff09;http://www.apkbus.com/android-14259-1-1.html2.webview学习记录http://www.apkbus.com/android-44567-1-1.html3.Android中使用WebView, WebChromeClient和WebViewClient加载网页http://www.apkbu…

java下输出中文的一点研究

网上或者大部分书上都说Java中输出中文使用FileReader类就可以了&#xff0c;但是当你读取一个中文文档时&#xff0c;你会发现&#xff0c;除了乱码&#xff0c;还是乱码。究其原因&#xff0c;这其实是文件流读取时使用的编码方式和文件本身编码方式不同,造成读取出来文件乱码…

C++智能指针:unique_ptr详解

文章目录unique_ptr描述声明作用函数指针描述总结unique_ptr描述 声明 头文件&#xff1a;<memory> 模版类&#xff1a; 默认类型template <class T, class D default_delete<T>> class unique_ptr数组类型template <class T, class D> class uniq…

川崎机器人示教盒维修_专业维修丹阳市KUKA库卡KRC2库卡C4主板维修{苏州罗韦维修}...

发那科机器人故障分析 发那科伺服放大器上LED指示灯故障维修大全_发那科机器人维修&#xff0c;FANUC机器人保养&#xff0c;伺服电机示教器减速器维修&#xff0c;驱动器维修&#xff0c;苏州发那科机器人维修&#xff0c;本文主要介绍了发那科伺服放大器上因故障而出现的各种…

js 文本反向排列显示

一次面试遇到这样的题目 反向输出“how are you” 解决方法 <script language"JavaScript">var message1"how are you";var message2"";for (countmessage1.length; count > 0; count--)message2message1.substring(count,count-1);doc…

2012年12月4期手机网页开发

最近主要做手机上页面的开发&#xff0c;主要框架是&#xff0c;手机安装客户端&#xff0c;加载主站手机应用页面&#xff0c;手机客户端配合主站功能实现本地扫描或重力感应的效果。 针对安卓系统&#xff0c;在开发和调试时发现如下问题&#xff1a;1路径错误&#…

zabbix4.0构建实录

【Nginx】 #wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo [rootcentos ~]# yum -y install zlib pcre pcre-devel openssl openssl-devel[rootcentos ~]# useradd -s /sbin/nologin nginx [rootzabbix-server ~]# yum install -y nginx 【M…

ceph-kvstore-tool 工具使用详解

文章目录简介使用总结简介 ceph-kvstore-tool工具是用来获取存放在leveldb或者rocksdb数据库中的键值元数据。并且该工具能够对kvstore中的数据进行配置&#xff0c;就像是对离线后的osd操作osd map一样 使用该工具&#xff0c;需要安装ceph-test-12.2.1.06-0.el7.centos.x86_…

springboot 订单重复提交_Spring Boot (一) 校验表单重复提交

一、前言在某些情况下&#xff0c;由于网速慢&#xff0c;用户操作有误(连续点击两下提交按钮)&#xff0c;页面卡顿等原因&#xff0c;可能会出现表单数据重复提交造成数据库保存多条重复数据。存在如上问题可以交给前端解决&#xff0c;判断多长时间内不能再次点击保存按钮&a…

智能会议白板系统每日开发记录

智能会议白板系统&#xff0c;在开发过程中&#xff0c;整个项目期限内&#xff0c;每月&#xff0c;每周&#xff0c;每天要做的事情&#xff0c;作为组长的记录&#xff0c;多有不足之处&#xff0c;望指点。 转载于:https://www.cnblogs.com/mayijun/p/3458039.html

java.lang.OutOfMemoryError: PermGen space及其解决方法

PermGen space的全称是Permanent Generation space,是指内存的永久保存区域OutOfMemoryError: PermGen space从表面上看就是内存益出&#xff0c;解决方法也一定是加大内存。说说为什么会内存益出&#xff1a;这一部分用于存放Class和Meta的信息,Class在被 Load的时候被放入Per…

ceph-dencoder工具使用详解

文章目录简介使用decode命令用法encode简介 ceph-dencoder工具是一个序列化编码、解码并且打印ceph数据结构的工具。它主要用来调试和测试ceph不同版本之间的兼容性问题 该工具是由 ceph-common-12.2.1.06-0.el7.centos.x86_64 rpm包生成 本文章是根据ceph-12.2.1版本来描述改…

EBS fnd_global.apps_initialize

原型&#xff1a;fnd_global.apps_initialize(user_ID, Responsibility_id,Responsibility_application_id);作用&#xff1a;在数据库的会话中设置全局变量&#xff0c;和用户概要信息。参数获得&#xff1a;参数一&#xff0c;用户ID select user_idfrom fnd_userwhere user_…

js判断鼠标靠近屏幕最侧面的监听_threejs按鼠标位置缩放场景

threejs的orbitcontrol&#xff0c;默认的缩放模式为整体以target为中心进行缩放。有时候&#xff0c;我们想让场景按照鼠标位置进行缩放&#xff0c;体验起来就和地图的缩放一样&#xff0c;最直观的感觉就是整个场景会越来越靠近鼠标点的位置&#xff0c;而不是整体的缩放大小…

hibernate中多对多分解成一对多,

1&#xff0c;参考&#xff1a;http://blog.csdn.net/yaerfeng/article/details/6969632

C++ 函数参数 值传递与引用传递

以前我们在C语言中函数参数传递过程中&#xff0c;如果我们想要让当A函数作用域中的变量经过B函数处理之后的数值仍然在A函数中生效&#xff0c;这个时候函数参数的传递时需要引用方式去传递&#xff0c;方式如下&#xff1a; #include <stdio.h> //函数参数为指针&…

SharePoint 2013 图文开发系列之代码定义列表

在SharePoint的开发中&#xff0c;用Visual Studio自定义列表是经常会用到的&#xff0c;因为很多时候&#xff0c;我们并不会手动创建列表&#xff0c;而手动创建列表在测试服务器和正式机之间同步字段&#xff0c;也很麻烦&#xff0c;所以我们经常用代码来定义列表或者文档库…