1 min read

커널에서 프로세서,모듈 생성알림

노트패드 실행시 다음과 같이 실행된다.

#include "ntddk.h"


void ProcessNotifyCallBackROutine(
	IN HANDLE parentid, IN HANDLE ProcessId, IN BOOLEAN Create
) {

	UNREFERENCED_PARAMETER(parentid);

	switch (Create)
	{
	case TRUE:
		DbgPrint("%d processis Create\n", ProcessId);
		break;
	case FALSE:
		DbgPrint("%d processis delteing\n", ProcessId);
		break;
	default:
		break;
	}
}

void LoadImageCallBackCallBackRoutine(
	IN PUNICODE_STRING FullmageName, IN HANDLE Processid, IN PIMAGE_INFO imageinfo
) {
	WCHAR* pwsName = NULL;

	if (FullmageName == NULL) {
		return;
	}

	pwsName = (WCHAR*)ExAllocatePool(NonPagedPool, FullmageName->Length + sizeof(WCHAR));
	memcpy(pwsName, FullmageName->Buffer, FullmageName->Length);
	pwsName[FullmageName->Length / sizeof(WCHAR)] = 0;

	DbgPrint("%d Process id %ws is loading \n", Processid, pwsName);


	ExFreePool(pwsName);

}


void MyDriverUnload(
	IN PDRIVER_OBJECT DriverObject) {


	PsSetCreateProcessNotifyRoutine(ProcessNotifyCallBackROutine, TRUE);
	PsRemoveLoadImageNotifyRoutine(LoadImageCallBackCallBackRoutine);
}
NTSTATUS DriverEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING registrypath) {
	
	
	KdPrint(("Driver Load \n"));

	DriverObject->DriverUnload = MyDriverUnload;

	PsSetCreateProcessNotifyRoutine(ProcessNotifyCallBackROutine, FALSE);
	PsSetLoadImageNotifyRoutine(LoadImageCallBackCallBackRoutine);
	return STATUS_SUCCESS;

}