Windows10 x64 Ring0实现进程创建监控

#include<ntifs.h>
#include <ntddk.h>
#include <stdio.h>
#include <stdlib.h>
#include<windef.h>
#include <winapifamily.h> 
#include <ntimage.h>
#include<wdm.h>
//系统内置函数,声明后可直接使用
NTKERNELAPI PCHAR PsGetProcessImageFileName(PEPROCESS Process);
//绕过完整型签名检查,否则无法设置回调
BOOLEAN BypassCheckSign(PDRIVER_OBJECT pDriverObject)
{
#ifdef _WIN64
	typedef struct _KLDR_DATA_TABLE_ENTRY
	{
		LIST_ENTRY listEntry;
		ULONG64 __Undefined1;
		ULONG64 __Undefined2;
		ULONG64 __Undefined3;
		ULONG64 NonPagedDebugInfo;
		ULONG64 DllBase;
		ULONG64 EntryPoint;
		ULONG SizeOfImage;
		UNICODE_STRING path;
		UNICODE_STRING name;
		ULONG   Flags;
		USHORT  LoadCount;
		USHORT  __Undefined5;
		ULONG64 __Undefined6;
		ULONG   CheckSum;
		ULONG   __padding1;
		ULONG   TimeDateStamp;
		ULONG   __padding2;
	} KLDR_DATA_TABLE_ENTRY, *PKLDR_DATA_TABLE_ENTRY;
#else
	typedef struct _KLDR_DATA_TABLE_ENTRY
	{
		LIST_ENTRY listEntry;
		ULONG unknown1;
		ULONG unknown2;
		ULONG unknown3;
		ULONG unknown4;
		ULONG unknown5;
		ULONG unknown6;
		ULONG unknown7;
		UNICODE_STRING path;
		UNICODE_STRING name;
		ULONG   Flags;
	} KLDR_DATA_TABLE_ENTRY, *PKLDR_DATA_TABLE_ENTRY;
#endif

	PKLDR_DATA_TABLE_ENTRY pLdrData = (PKLDR_DATA_TABLE_ENTRY)pDriverObject->DriverSection;
	pLdrData->Flags = pLdrData->Flags | 0x20;

	return TRUE;
}
VOID CreateProcessNotify(PEPROCESS Process,HANDLE ProcessId,PPS_CREATE_NOTIFY_INFO CreateInfo)
{
	PCHAR pszImageFileName = NULL;
	if (CreateInfo != NULL)//不为空代表进程创建
	{
	pszImageFileName = PsGetProcessImageFileName(Process);
	//DbgPrint("进程创建: %s %pid:",pszImageFileName,(ULONG64)ProcessId);
	//PsSetCreateProcessNotifyRoutineEx可以阻止进程的创建:
	if (strcmp(pszImageFileName, "calc.exe") == 0)
		{
			CreateInfo->CreationStatus = STATUS_ACCESS_DISABLED_NO_SAFER_UI_BY_POLICY;//阻止创建并不弹窗
		}
	}
}
	
NTSTATUS DriverEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegPath) {
	BypassCheckSign(DriverObject);
	NTSTATUS status = PsSetCreateProcessNotifyRoutineEx(CreateProcessNotify, FALSE);
	//CreateProcessNotify为自定义的处理函数,后面的布尔值代表是否移除回调
	if (!NT_SUCCESS(status))
	{
		DbgPrint("回调函数设置失败, status=%X", status);
	}

	else
	{
		DbgPrint("进程监控已开启\r\n");
	}
	DriverObject->DriverUnload = DriverUnload;
	return STATUS_SUCCESS;
}

NTSTATUS DriverUnload(PDRIVER_OBJECT Driver) {
    //移除回调
	PsSetCreateProcessNotifyRoutineEx(CreateProcessNotify, TRUE);
	DbgPrint("Driver Unloading...\n");
	return STATUS_SUCCESS;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Ring3下的DLL注入工具是一种在Windows操作系统中运行的工具,用于将动态链接库(DLL)注入到目标进程的地址空间中,以改变目标进程的行为或增加功能。 Ring3是Windows系统中最高特权级别之一,它对应用户态,也称为用户模式。在Ring3下运行的进程只能访问受限资源,无法直接访问操作系统的核心代码和硬件设备。因此,为了修改或扩展目标进程的功能,我们需要使用DLL注入工具。 x86是指在Intel x86架构的计算机上运行的32位程序。通常,DLL注入工具需要与目标进程的位数相同才能正常工作,所以x86表示该工具适用于32位进程。对于64位进程,我们需要使用x64版本的DLL注入工具。 DLL注入工具的原理是将DLL文件加载到目标进程的地址空间中,并将DLL中的函数地址替换为目标进程中的函数地址,从而实现对目标进程的操作。注入工具可以通过以下几个步骤实现: 1. 打开目标进程:获取目标进程进程ID,并以指定的方式打开目标进程,使得我们可以在该进程中进行操作。 2. 为目标进程申请内存空间:在目标进程中申请一块内存空间,用于存放需要注入的DLL文件。 3. 将DLL文件写入目标进程:将DLL文件的内容写入之前申请的内存空间中。 4. 获取目标进程中特定函数地址:在目标进程的地址空间中,获取需要修改的函数的地址。 5. 修改目标进程中的函数地址:将DLL中对应函数的地址替换为目标进程中的函数地址。 6. 释放内存并关闭目标进程句柄:释放之前申请的内存空间,并关闭目标进程的句柄。 通过DLL注入工具,我们可以实现一些有趣的功能,如修改游戏进程中的数值、记录目标进程的函数调用等。然而,需要注意的是,DLL注入涉及到操作系统的安全机制,不当的使用可能导致系统不稳定或者引发安全漏洞,因此在使用DLL注入工具时需要谨慎。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

海鸥的诀别诗

谢谢,龙咬会继续努力的!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值