创建进程回调函数_阻止打开任何进程
2017-09-02 17:28
260 查看
#include <ntddk.h> VOID UnloadDriver(PDRIVER_OBJECT pDriver); VOID CreateProcessRoutineSpy( IN HANDLE ParentId, IN HANDLE ProcessId, IN BOOLEAN Create ); NTSTATUS DriverEntry(PDRIVER_OBJECT pDriver, PUNICODE_STRING Registry) { NTSTATUS status = STATUS_SUCCESS; UNREFERENCED_PARAMETER(pDriver); UNREFERENCED_PARAMETER(Registry); KdPrint(("[SysTest] DriverEntry Loading.\n")); KdPrint(("CreateProcessRoutineSpy地址%x", CreateProcessRoutineSpy)); status = PsSetCreateProcessNotifyRoutine(CreateProcessRoutineSpy, FALSE); if (!NT_SUCCESS(status)) { KdPrint(("[SysTest] PsSetCreateProcessNotifyRoutine failed status:(%x).\n", status)); return status; } pDriver->DriverUnload = UnloadDriver; return status; } VOID CreateProcessRoutineSpy( IN HANDLE ParentId, IN HANDLE ProcessId, IN BOOLEAN Create ) { NTSTATUS status; HANDLE procHandle = NULL; CLIENT_ID ClientId; OBJECT_ATTRIBUTES Obja; Obja.Length = sizeof(Obja); Obja.RootDirectory = 0; Obja.ObjectName = 0; Obja.Attributes = 0; Obja.SecurityDescriptor = 0; Obja.SecurityQualityOfService = 0; ClientId.UniqueProcess = (HANDLE)ProcessId; ClientId.UniqueThread = 0; //不管创建什么程序都关闭程序 if (Create) //bCreate 为True表示创建程序 { //调用函数ZwOpenProcess函数,通过进程pid号获得进程句柄 status = ZwOpenProcess(&procHandle, PROCESS_ALL_ACCESS, &Obja, &ClientId); if (status == STATUS_INVALID_PARAMETER_MIX) DbgPrint("STATUS_INVALID_PARAMETER_MIX\n"); else if (status == STATUS_INVALID_CID) DbgPrint("STATUS_INVALID_CID\n"); else if (status == STATUS_INVALID_PARAMETER) DbgPrint("STATUS_INVALID_PARAMETER\n"); else if (status == STATUS_ACCESS_DENIED) DbgPrint("STATUS_ACCESS_DENIED\n"); else DbgPrint("STATUS_SUCCESS\n"); if (procHandle != NULL) status = ZwTerminateProcess(procHandle, 1); else { DbgPrint("failed to ZwOpenProcess...\n"); return; } //这里是我来判断没有成功结束进程用的 switch (status) { case STATUS_SUCCESS: DbgPrint("process %u has beed killed ...\n", ProcessId); break; case STATUS_OBJECT_TYPE_MISMATCH: DbgPrint("failed to kill %u process,The specified handle is not a process handle. \n", ProcessId); break; case STATUS_INVALID_HANDLE: DbgPrint("failed to kill %u process,The specified handle is not valid.\n", ProcessId); break; case STATUS_ACCESS_DENIED: DbgPrint("failed to kill %u process,The driver cannot access the specified process object.\n", ProcessId); break; case STATUS_PROCESS_IS_TERMINATING: DbgPrint("failed to kill %u process,The specified process is already terminating.\n", ProcessId); break; default: break; } } if (Create) { KdPrint(("进程创建[SysTest] Process Created. ParentId:(%d) ProcessId:(%d).\n", ParentId, ProcessId)); } else { KdPrint(("进程销毁[SysTest] Process Terminated ProcessId:(%d).ParentId:(%d) .\n", ProcessId, ParentId)); } return; } VOID UnloadDriver(PDRIVER_OBJECT pDriver) { UNREFERENCED_PARAMETER(pDriver); NTSTATUS status; status = PsSetCreateProcessNotifyRoutine(CreateProcessRoutineSpy, TRUE); if (NT_SUCCESS(status)) { KdPrint(("卸载完成[SysTest] UnloadDriver.\n")); } return; }
相关文章推荐
- 遍历创建进程、创建线程、加载模块的回调函数
- 遍历创建进程、创建线程、加载模块的回调函数
- 遍历创建进程、创建线程、加载模块的回调函数
- Windows 驱动阻止进程创建
- C#自我总结: 阻止打开任务管理器(两种方法,也适用于杀掉进程)
- 在连接到 SQL Server 2005 (provider: 命名管道提供程序, error: 40 - 无法打开到 SQL Server 的连接)a或error: 0 - 管道的另一端上无任何进程
- 您试图打开以前版本的Microsoft Office创建的文件,注册表策略设置已阻止此文件在该版本中打开
- GNOME下终端打开后提示“创建此终端的子进程时出错“的解决办法
- 您试图打开以前版本的Microsoft Office创建的文件。注册表策略设置已阻止此文件在该版本中打开的解决办法
- 使用createprocess()创建进程打开其他文件方法
- 创建一个进程打开另外一个进程
- 整理: 如何创建一个在任何进程任何帐户任何会话都能存取的内核对象
- 如何打开一个程序或创建一个进程 (适用与执行CMD命令)
- 返回值是新的进程句柄的只有:打开进程()、创建进程()两个命令,创建进程()命令详解
- 深入剖析PE文件 (告诉你exe文件打开后是依据什么来创建进程并在系统中运行)
- 通过回调函数阻止进程创建(验证结束,方案完全可行)
- js创建新进程,打开新链接窗口
- CFS调度器中新进程创建之后的事情---任何事情都是一种权衡(续)
- 小实验:用创建进程()打开计算器,然后关闭进程句柄。再用打开进程(进程ID),使用两次,得到两个进程句柄。实验目的:这两个进程句柄都能控制这个进程吗?通过该试验加深对句柄的理解!!
- VC 创建新进程,结束进程 (打开exe等可执行文件)