Hook Npfs驱动对象Dispatch过滤创建和打开管道

通过Hook Npfs对象的Dispatch的IRP回调函数,达到过滤命名管道的需求,这种方式测试了WinXPsp3-win10_1909 都非常稳定!
效果图:
在这里插入图片描述

代码:

#include <ntifs.h>
#include <ntstrsafe.h>
#include <ntddkbd.h>


// Propertys
// ==============================================================================
extern POBJECT_TYPE* IoDriverObjectType;

NTKERNELAPI UCHAR* NTAPI PsGetProcessImageFileName(PEPROCESS process);

NTSTATUS ObReferenceObjectByName(
	PUNICODE_STRING ObjectName,
	ULONG Attributes,
	PACCESS_STATE AccessState,
	ACCESS_MASK DesiredAccess,
	POBJECT_TYPE ObjectType,
	KPROCESSOR_MODE AccessMode,
	PVOID ParseContext,
	PVOID* Object
);

#define DELAY_ONE_MICROSECOND (-10)
#define DELAY_ONE_MILLISECOND (DELAY_ONE_MICROSECOND*1000)
#define DELAY_ONE_SECOND (DELAY_ONE_MILLISECOND*1000);


// The Target Driver Object Name 
#define TARGET_DRIVER_NAME L"\\FileSystem\\Npfs"
PDRIVER_OBJECT g_pNpfs = NULL;

BOOLEAN IsHooked = FALSE;

PDRIVER_DISPATCH g_OriginalCreate = NULL;
PDRIVER_DISPATCH g_OriginalCreateNamedPipe = NULL;

NTSTATUS MyCreate(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
{
	PIO_STACK_LOCATION pStack = IoGetCurrentIrpStackLocation(Irp);
	DbgPrint("Openning NamedPipe:%wZ\n", &pStack->FileObject->FileName);
	return g_OriginalCreate(DeviceObject,Irp);
}

NTSTATUS MyCreateNamedPipe(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
{
	PIO_STACK_LOCATION pStack = IoGetCurrentIrpStackLocation(Irp);
	DbgPrint("Creating NamedPipe:%wZ\n", &pStack->FileObject->FileName);

	return g_OriginalCreateNamedPipe(DeviceObject, Irp);
}

// 卸载函数
VOID DriverUnload(PDRIVER_OBJECT pDriverObject)
{
	if (g_pNpfs)
	{
		InterlockedExchangePointer(&g_pNpfs->MajorFunction[IRP_MJ_CREATE], g_OriginalCreate);
		InterlockedExchangePointer(&g_pNpfs->MajorFunction[IRP_MJ_CREATE_NAMED_PIPE], g_OriginalCreateNamedPipe);
		ObDereferenceObject(g_pNpfs);
		DbgPrint("Restore hook!\n");
	}
	KdPrint(("Driver unloaded!!!\n"));
}

//
NTSTATUS DriverEntry(_In_ PDRIVER_OBJECT pDriverObject, _In_ PUNICODE_STRING RegistryPath)
{

	NTSTATUS status;
	KdPrint(("Enter DriverEntry!!\n"));

	pDriverObject->DriverUnload = DriverUnload;

	UNICODE_STRING uniNtNameString = {0};
	RtlInitUnicodeString(&uniNtNameString, TARGET_DRIVER_NAME);
	status = ObReferenceObjectByName(&uniNtNameString, OBJ_CASE_INSENSITIVE, NULL, 0, *IoDriverObjectType, KernelMode, NULL, &g_pNpfs);
	if (!NT_SUCCESS(status))
	{
		KdPrint(("Couldn't get the NPFS driver object \n"));
		return STATUS_UNSUCCESSFUL;
	}
	else
	{
		// Start Hooking
		g_OriginalCreate = InterlockedExchangePointer(&g_pNpfs->MajorFunction[IRP_MJ_CREATE],MyCreate);
		g_OriginalCreateNamedPipe = InterlockedExchangePointer(&g_pNpfs->MajorFunction[IRP_MJ_CREATE_NAMED_PIPE],MyCreateNamedPipe);
		DbgPrint("Hook: HOOK driver object! Success\n");
	}

	return status;
}





  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值