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

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

  • 遇到的问题

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

  • 解决方案

通过ZwQueryInformationProcess获得ProcessInformation再获得PID

  • 环境

开发配置:vs2015  x86  debug

测试环境:xp sp3

驱动代码

 #include <ntddk.h>

 #define NT_DEVICE_NAME L"\\Device\\ProtectProcess"
#define DOS_DEVICE_NAME L"\\DosDevices\\ProtectProcess" #define IOCTL_PROTECT_CONTROL CTL_CODE(FILE_DEVICE_UNKNOWN, 0x800, METHOD_BUFFERED, FILE_ANY_ACCESS) #pragma pack(1) //SSDT表的结构
typedef struct ServiceDescriptorEntry
{
unsigned int *ServiceTableBase;
unsigned int *ServiceCounterTableBase; //Used only in checked build
unsigned int NumberOfServices;
unsigned char *ParamTableBase;
} ServiceDescriptorTableEntry_t, *PServiceDescriptorTableEntry_t;
#pragma pack() __declspec(dllimport) ServiceDescriptorTableEntry_t KeServiceDescriptorTable; //变量名是不能变的,因为是从外部导入 //这个用于查询某个函数的地址的宏定义
#define SYSTEMSERVICE(_function) KeServiceDescriptorTable.ServiceTableBase[*(PULONG)((PUCHAR)_function+1)] NTSYSAPI NTSTATUS NTAPI ZwQueryInformationProcess(
IN HANDLE ProcessHandle,
IN PROCESSINFOCLASS ProcessInformationClass,
OUT PVOID ProcessInformation,
IN ULONG ProcessInformationLength,
OUT PULONG ReturnLength); NTSYSAPI NTSTATUS NTAPI ZwTerminateProcess(
IN HANDLE ProcessHandle OPTIONAL,
IN NTSTATUS ExitStatus); typedef NTSTATUS (*ZWTERMINATEPROCESS)(
IN HANDLE ProcessHandle OPTIONAL,
IN NTSTATUS ExitStatus); ZWTERMINATEPROCESS OldZwTerminateProcess;
long pid = -; NTSTATUS DispatchDeviceControl(IN PDEVICE_OBJECT deviceObject, IN PIRP Irp)
{
NTSTATUS nStatus = STATUS_SUCCESS;
ULONG IoControlCode = ;
PIO_STACK_LOCATION IrpStack = NULL; long* inBuf = NULL;
char* outBuf = NULL;
ULONG inSize = ;
ULONG outSize = ;
PCHAR buffer = NULL;
PMDL mdl = NULL; Irp->IoStatus.Status = STATUS_SUCCESS;
Irp->IoStatus.Information = ; IrpStack = IoGetCurrentIrpStackLocation(Irp); //利用函数获得当前请求任务的参数
switch (IrpStack->MajorFunction)
{
case IRP_MJ_CREATE:
DbgPrint("IRP_MJ_CREATE被调用\n");
break;
case IRP_MJ_CLOSE:
DbgPrint("IRP_MJ_CLOSE被调用\n");
break;
case IRP_MJ_DEVICE_CONTROL:
DbgPrint("IRP_MJ_DEVICE_CONTROL被调用\n");
IoControlCode = IrpStack->Parameters.DeviceIoControl.IoControlCode;
switch (IoControlCode)
{
case IOCTL_PROTECT_CONTROL:
inSize = IrpStack->Parameters.DeviceIoControl.InputBufferLength;
outSize = IrpStack->Parameters.DeviceIoControl.OutputBufferLength; inBuf = (long*)Irp->AssociatedIrp.SystemBuffer;
pid = *inBuf;
DbgPrint("==================================");
DbgPrint("IOCTL_PROTECT_CONTROL被调用,通讯成功\n");
DbgPrint("输入缓冲区大小:%d\n", inSize);
DbgPrint("输出缓冲区大小:%d\n", outSize);
DbgPrint("输入缓冲区内容:%ld\n", inBuf);
DbgPrint("当前保护进程ID:%ld\n", pid);
DbgPrint("==================================");
break;
default:
break;
}
break;
default:
DbgPrint("未知请求包被调用\n");
break;
} nStatus = Irp->IoStatus.Status; IoCompleteRequest(Irp, IO_NO_INCREMENT); return nStatus;
} NTSTATUS NewZwTerminateProcess(
IN HANDLE ProcessHandle OPTIONAL,
IN NTSTATUS ExitStatus)
{
NTSTATUS nStatus = STATUS_SUCCESS; ULONG Ret;
PROCESS_BASIC_INFORMATION pbi; //pBuffer = ExAllocatePool(PagedPool, sizeof(PROCESS_BASIC_INFORMATION));
ZwQueryInformationProcess(ProcessHandle, ProcessBasicInformation, (PVOID)&pbi, sizeof(PROCESS_BASIC_INFORMATION), &Ret); if (pbi.UniqueProcessId == pid)
{
DbgPrint("保护进程不被关闭:%d\n", pid);
return STATUS_ACCESS_DENIED;
} nStatus = OldZwTerminateProcess(ProcessHandle, ExitStatus);
return STATUS_SUCCESS;
} VOID DriverUnload(PDRIVER_OBJECT pDriverObject)
{
UNICODE_STRING DeviceLinkString;
PDEVICE_OBJECT DeviceObjectTemp1 = NULL;
PDEVICE_OBJECT DeviceObjectTemp2 = NULL; DbgPrint("Driver Unload\n"); RtlInitUnicodeString(&DeviceLinkString, DOS_DEVICE_NAME);
IoDeleteSymbolicLink(&DeviceLinkString);
if (pDriverObject)
{
DeviceObjectTemp1 = pDriverObject->DeviceObject;
while (DeviceObjectTemp1)
{
DeviceObjectTemp2 = DeviceObjectTemp1;
DeviceObjectTemp1 = DeviceObjectTemp1->NextDevice;
IoDeleteDevice(DeviceObjectTemp2);
}
} DbgPrint("设备已经卸载\n");
DbgPrint("修复SSDT表\n");
(ZWTERMINATEPROCESS)(SYSTEMSERVICE(ZwTerminateProcess)) = OldZwTerminateProcess;
DbgPrint("驱动卸载完毕\n");
} NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObject, PUNICODE_STRING pRegPath)
{
NTSTATUS ntStatus = STATUS_SUCCESS;
UNICODE_STRING ntDeviceName;
UNICODE_STRING DeviceLinkString;
PDEVICE_OBJECT deviceObject = NULL; RtlInitUnicodeString(&ntDeviceName, NT_DEVICE_NAME); ntStatus = IoCreateDevice(
pDriverObject,
,
&ntDeviceName,
FILE_DEVICE_UNKNOWN,
,
FALSE,
&deviceObject); if (!NT_SUCCESS(ntStatus))
{
DbgPrint("无法创建驱动设备");
return ntStatus;
} RtlInitUnicodeString(&DeviceLinkString, DOS_DEVICE_NAME);
ntStatus = IoCreateSymbolicLink(&DeviceLinkString, &ntDeviceName); if (!NT_SUCCESS(ntStatus))
{
return ntStatus;
} pDriverObject->MajorFunction[IRP_MJ_CREATE] = DispatchDeviceControl;
pDriverObject->MajorFunction[IRP_MJ_CLOSE] = DispatchDeviceControl;
pDriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = DispatchDeviceControl;
pDriverObject->DriverUnload = DriverUnload; DbgPrint("驱动程序已经启动\n");
DbgPrint("修改SSDT表。。。\n"); //修改ZwTerminateProcess函数地址
//将原来ssdt中所要hook的函数地址换成我们自己的函数地址
OldZwTerminateProcess = (ZWTERMINATEPROCESS)(SYSTEMSERVICE(ZwTerminateProcess));
SYSTEMSERVICE(ZwTerminateProcess) = (unsigned int)NewZwTerminateProcess; DbgPrint("驱动程序加载完毕\n"); return STATUS_SUCCESS;
}

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

hook NtTerminateProcess进行应用的保护的更多相关文章

  1. 64位下Hook NtOpenProcess的实现进程保护 + 源码 (升级篇 )

    64位下Hook NtOpenProcess的实现进程保护 + 源码 (升级篇 ) [PS: 如果在64位系统下,出现调用测试demo,返回false的情况下,请修改Hook Dll的代码] glhH ...

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

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

  3. SSDT Hook实现内核级的进程保护

    目录 SSDT Hook效果图 SSDT简介 SSDT结构 SSDT HOOK原理 Hook前准备 如何获得SSDT中函数的地址呢 SSDT Hook流程 SSDT Hook实现进程保护 Ring3与 ...

  4. SSDT Hook结构

    目录 SSDT Hook效果图 SSDT简介 SSDT结构 SSDT HOOK原理 Hook前准备 如何获得SSDT中函数的地址呢 SSDT Hook流程 SSDT Hook实现进程保护 Ring3与 ...

  5. ce+od无法同时附加进程的问题

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

  6. Unity手游引擎安全解析及实践

    近日,由Unity主办的"Unity技术开放日"在广州成功举办,网易移动安全技术专家卓辉作为特邀嘉宾同现场400名游戏开发者分享了网易在手游安全所积累的经验.当下,很多手游背后都存 ...

  7. SSDT Hook实现简单的进程隐藏和保护【转载】

    原文链接:http://www.blogfshare.com/ssdthook-hide-protect.html 原文作者:AloneMonkey SSDT Hook实现简单的进程隐藏和保护 Alo ...

  8. 【Hook技术】实现从"任务管理器"中保护进程不被关闭 + 附带源码 + 进程保护知识扩展

    [Hook技术]实现从"任务管理器"中保护进程不被关闭 + 附带源码 + 进程保护知识扩展 公司有个监控程序涉及到进程的保护问题,需要避免用户通过任务管理器结束掉监控进程,这里使用 ...

  9. 进程隐藏与进程保护(SSDT Hook 实现)(三)

    文章目录: 1. 引子: 2. 获取当前系统下所有进程: 3. 服务管理(安装,启动,停止,卸载): 4. 应用程序和内核程序通信: 5. 小结: 1. 引子: 关于这个 SSDT Hook 实现进程 ...

随机推荐

  1. SpringBoot系列: Spring项目异常处理最佳实践

    ===================================自定义异常类===================================稍具规模的项目, 一般都要自定义一组异常类, 这 ...

  2. LaTeX 一个段落加边框

    \usepackage{framed} \begin{framed} 对这里加边框啊 \end{framed}

  3. [物理学与PDEs]第4章第3节 一维反应流体力学方程组 3.2 一维反应流体力学方程组的 Lagrange 形式

    1.  一维粘性热传导反应流体力学方程组的 Lagrange 形式 $$\beex \bea \cfrac{\p \tau}{\p t'}-\cfrac{\p u}{\p m}&=0,\\ \ ...

  4. luogu 4042 有后效性的dp

    存在有后效性的dp,但转移方程 f[i] = min( f[i], s[i] + sigma f[j] ( j 是后效点) ) 每次建当前点和 转移点的边 e1, 某点和其会影响的点 e2 spfa ...

  5. VJTools

    https://mp.weixin.qq.com/s/cwU2rLOuwock048rKBz3ew

  6. Eclipse 搭建 Strust2开发环境

    一.创建一个动态Web项目 ♦  注意 :一定要勾选Generate Web.xml deployment descriptor 选项,这个将在Eclipse为你创建一个动态web项目. 二.导入相关 ...

  7. docker镜像的使用及相关

    参考网站docker中文网:http://www.docker.org.cn/book/docker/docker-push-image-13.html 1.搜索容器: docker search t ...

  8. 【原创】大数据基础之Mesos+Marathon+Docker部署nginx

    一 安装 安装docker:https://www.cnblogs.com/barneywill/p/10343091.html安装mesos:https://www.cnblogs.com/barn ...

  9. JAVA 得到数组的长度

    package Code411; //得到数组的长度// 使用 array.length public class CodeArrayLength { public static void main( ...

  10. 论http弥补技术ajax、comet、SPADY、websocket

    为什么要弥补http?http有什么缺陷? 查询资料中