前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >七、回调

七、回调

作者头像
zhang_derek
发布2022-09-29 11:53:19
1.5K0
发布2022-09-29 11:53:19
举报
文章被收录于专栏:有趣的django有趣的django

7.1.进程回调

DriverMain.c

代码语言:javascript
复制
#include <ntifs.h>

PUCHAR PsGetProcessImageFileName(PEPROCESS Process);

//创建进程回调函数
VOID CreateProcessListen(
	_In_ HANDLE ParentId,
	_In_ HANDLE ProcessId,
	_In_ BOOLEAN Create
)
{
	PEPROCESS Process = NULL;
	NTSTATUS status = PsLookupProcessByProcessId(ProcessId, &Process);
	if (!NT_SUCCESS(status))
	{
		return;
	}

	//创建进程
	if (Create)
	{
		DbgPrintEx(77,0,"[db]:%s 创建了\r\n", PsGetProcessImageFileName(Process));
	}
	else
	{
		DbgPrintEx(77, 0, "[db]:%s 退出了\r\n", PsGetProcessImageFileName(Process));
	}
    
	ObDereferenceObject(Process);
}


VOID DriverUnload(PDRIVER_OBJECT pDriverObject)
{
	PsSetCreateProcessNotifyRoutine(CreateProcessListen, TRUE);
	DbgPrint("卸载驱动\r\n");
}

NTSTATUS DriverEntry(PDRIVER_OBJECT pDriver, PUNICODE_STRING pReg)
{
    //创建进程回调
	PsSetCreateProcessNotifyRoutine(CreateProcessListen,FALSE);

	pDriver->DriverUnload = DriverUnload;

	return STATUS_SUCCESS;
}

修改PspNotifyEnableMask为00000009,创建和退出进程时就不会触发回调

代码语言:javascript
复制
kd> dd PspNotifyEnableMask
83f4c838  0000000b 00000000 8ad0e54f 00000000
83f4c848  00000000 00000000 00000000 00000000
83f4c858  00000000 00000000 00000000 00000000
83f4c868  00000000 00000000 00000000 00000000
83f4c878  00000000 00000000 00000000 00000000
83f4c888  00000000 00000000 00000000 00000000
83f4c898  00000000 00000000 00000000 00000000
83f4c8a8  00000000 00000000 00000000 00000000
kd> ed 83f4c838 00000009
kd> g

7.2.线程回调

DriverMain.c

代码语言:javascript
复制
#include <ntifs.h>

PUCHAR PsGetProcessImageFileName(PEPROCESS Process);

VOID CreateProcessListen(
	_In_ HANDLE ParentId,
	_In_ HANDLE ProcessId,
	_In_ BOOLEAN Create
)
{
	PEPROCESS Process = NULL;
	NTSTATUS status = PsLookupProcessByProcessId(ProcessId, &Process);
	if (!NT_SUCCESS(status))
	{
		return;
	}

	//创建进程
	if (Create)
	{
		DbgPrintEx(77,0,"[db]:%s 创建了\r\n", PsGetProcessImageFileName(Process));
	}
	else
	{
		DbgPrintEx(77, 0, "[db]:%s 退出了\r\n", PsGetProcessImageFileName(Process));
	}
	
    ObDereferenceObject(Process);
}


VOID createThreadListen(
	_In_ HANDLE ProcessId,
	_In_ HANDLE ThreadId,
	_In_ BOOLEAN Create
)
{
	if (Create)
	{
		DbgPrintEx(77, 0, "[db]线程创建了\r\n");
	}
	else
	{
		DbgPrintEx(77, 0, "[db]线程结束了\r\n");
	}
}


VOID DriverUnload(PDRIVER_OBJECT pDriverObject)
{
	//PsSetCreateProcessNotifyRoutine(CreateProcessListen, TRUE);

	PsRemoveCreateThreadNotifyRoutine(createThreadListen);

	DbgPrint("卸载驱动\r\n");
}

NTSTATUS DriverEntry(PDRIVER_OBJECT pDriver, PUNICODE_STRING pReg)
{
	//PsSetCreateProcessNotifyRoutine(CreateProcessListen,FALSE);

	PsSetCreateThreadNotifyRoutine(createThreadListen);


	pDriver->DriverUnload = DriverUnload;

	return STATUS_SUCCESS;
}

修改PspNotifyEnableMask为00000007,创建和退出线程时就不会触发回调

7.3.模块回调

DriverMain.c

代码语言:javascript
复制
#include <ntifs.h>

PUCHAR PsGetProcessImageFileName(PEPROCESS Process);

VOID CreateProcessListen(
	_In_ HANDLE ParentId,
	_In_ HANDLE ProcessId,
	_In_ BOOLEAN Create
)
{
	PEPROCESS Process = NULL;
	NTSTATUS status = PsLookupProcessByProcessId(ProcessId, &Process);
	if (!NT_SUCCESS(status))
	{
		return;
	}

	//创建进程
	if (Create)
	{
		DbgPrintEx(77,0,"[db]:%s 创建了\r\n", PsGetProcessImageFileName(Process));
	}
	else
	{
		DbgPrintEx(77, 0, "[db]:%s 退出了\r\n", PsGetProcessImageFileName(Process));
	}
    
	ObDereferenceObject(Process);
}


VOID createThreadListen(
	_In_ HANDLE ProcessId,
	_In_ HANDLE ThreadId,
	_In_ BOOLEAN Create
)
{
	if (Create)
	{
		DbgPrintEx(77, 0, "[db]线程创建了\r\n");
	}
	else
	{
		DbgPrintEx(77, 0, "[db]线程结束了\r\n");
	}
}

VOID LoadImageListen(
	_In_opt_ PUNICODE_STRING FullImageName,
	_In_ HANDLE ProcessId,                // pid into which image is being mapped
	_In_ PIMAGE_INFO ImageInfo
)
{
	if (ImageInfo->SystemModeImage)
	{
		DbgPrintEx(77, 0, "[db]驱动模块: %wZ\r\n", FullImageName);
	}
	else
	{
		DbgPrintEx(77, 0, "[db]普通DLL: %wZ\r\n", FullImageName);
	}
}


VOID DriverUnload(PDRIVER_OBJECT pDriverObject)
{
	//PsSetCreateProcessNotifyRoutine(CreateProcessListen, TRUE);

	//PsRemoveCreateThreadNotifyRoutine(createThreadListen);

	PsRemoveLoadImageNotifyRoutine(LoadImageListen);

	DbgPrint("卸载驱动\r\n");
}

NTSTATUS DriverEntry(PDRIVER_OBJECT pDriver, PUNICODE_STRING pReg)
{
	//PsSetCreateProcessNotifyRoutine(CreateProcessListen,FALSE);

	//PsSetCreateThreadNotifyRoutine(createThreadListen);

	PsSetLoadImageNotifyRoutine(LoadImageListen);


	pDriver->DriverUnload = DriverUnload;

	return STATUS_SUCCESS;
}

_IMAGE_INFO结构体

代码语言:javascript
复制
typedef struct _IMAGE_INFO {
    union {
        ULONG Properties;
        struct {
            ULONG ImageAddressingMode  : 8;  // Code addressing mode
            ULONG SystemModeImage      : 1;  // System mode image
            ULONG ImageMappedToAllPids : 1;  // Image mapped into all processes
            ULONG ExtendedInfoPresent  : 1;  // IMAGE_INFO_EX available
            ULONG MachineTypeMismatch  : 1;  // Architecture type mismatch
            ULONG ImageSignatureLevel  : 4;  // Signature level
            ULONG ImageSignatureType   : 3;  // Signature type
            ULONG ImagePartialMap      : 1;  // Nonzero if entire image is not mapped
            ULONG Reserved             : 12;
        };
    };
    PVOID       ImageBase;
    ULONG       ImageSelector;
    SIZE_T      ImageSize;
    ULONG       ImageSectionNumber;
} IMAGE_INFO, *PIMAGE_INFO;

修改PspNotifyEnableMask为0000000e,就不会触发模块回调

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2022-09-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 7.1.进程回调
  • 7.2.线程回调
  • 7.3.模块回调
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档