본문 바로가기
프로그래밍

[kernel] PsSetLoadImageNotifyRoutine 와 PsSetCreateProcessNotifyRoutine

by dladbru 2018. 2. 1.


PsSetLoadImageNotifyRoutine 와 PsSetCreateProcessNotifyRoutine 는 비슷하지만 차이가 존재한다.

 

PsSetCreateProcessNotifyRoutine는 프로세스가 생성되거나 소멸될때 호출되는 반면에, 


PsSetLoadImageNotifyRoutine는 프로세스에 이미지가 새로 로드되는 순간마다 호출된다. 


프로세스는 여러 DLL을 동적로딩하여 사용하므로 여러번 호출된다. 


우리는 어떠한 상황으로 나누어 두개를 이용할까??


프로세스가 생성이나 소멸되는 순간을 필요로한다면 당연히 PsSetCreateProcessNotifyRoutine 일것이다. 하지만 특정한 모듈이 올라왔을 때, 


원하는 동작을 실행하고 싶다면 PsSetLoadImageNotifyRoutine 를 사용할것이다.


#pragma warning( disable: 4703)

#include <ntifs.h>
#include <ntddk.h>
#include <ntimage.h>
#include <windef.h>
#include <wdm.h>

NTSTATUS UnLoadDriver(PDRIVER_OBJECT DriverObject);


VOID _stdcall MyLoadImageNotifyRoutine(PUNICODE_STRING	FullImageName, HANDLE	ProcessId, PIMAGE_INFO ImageInfo)
{
	DbgPrint("Image: %wZ PID: %ld Load!", FullImageName);
}

VOID MyCreateProcessNotifyRoutine(HANDLE  ParentId, HANDLE  ProcessId, BOOLEAN  Create)
{
	if (Create == TRUE)
	{
		DbgPrint("PID: %ld Create!", ProcessId);
	}
	else
	{
		DbgPrint("PID: %ld Removed!", ProcessId);
	}
}
NTSTATUS UnLoadDriver(PDRIVER_OBJECT DriverObject)
{
	NTSTATUS Status = STATUS_SUCCESS;
	DbgPrint("___[Empire Kernel Unload Success!]___");

	PsRemoveLoadImageNotifyRoutine(&MyLoadImageNotifyRoutine);
	PsSetCreateProcessNotifyRoutine(&MyCreateProcessNotifyRoutine, TRUE); #TRUE는 중단

	return Status;
}


NTSTATUS DriverEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegisterPath)
{
	NTSTATUS Status = STATUS_UNSUCCESSFUL;
	
	DbgPrint("___[Empire Kernel Load]___");
	
	Status = PsSetLoadImageNotifyRoutine(&MyLoadImageNotifyRoutine);
	PsSetCreateProcessNotifyRoutine(&MyCreateProcessNotifyRoutine,FALSE); //FALSE는 시작

	DriverObject->DriverUnload = UnLoadDriver;
	Status = STATUS_SUCCESS;

	return Status;
}


위 코드를 빌드해 드라이버(*.sys) 파일을 커널에 올리면, 실행되는 프로세스의 정보를 얻을 수 있다. 


위와 같이 정보를 받아볼 수 있는 NotifyRoutine 들은 실행되려는 프로세스를 조작,제어하며 더 광범위하게 사용할 수 있다.


다음에는 그러한것들에 대해서 저장해서 나중에 잊지않도록 하고자 한다. 



< Figure 0. DbgView >

< Figure 0. DbgView >


프로세스를 실행하게되면 위와 같은 정보를 얻어낼 수 있다. 


테스트로 실행시킨 "HxD.exe" 는 32bit 프로세스이나 ntdll,kernel32.dll 같은 파일은 64bit 도 올라가는 것을 볼 수 있다.


PC 프로세서가 x64 일 경우, x86도 지원하기 위해 위와같은 구조를 띄고 있는것 같다.



< Figure 1. DbgView >


유저모드에서 실행되는 프로세서 익스플로러로 다시한번 확인한결과 PID는 7924가 맞다!


어차피 나만 보는데 기입 끗.


반응형

'프로그래밍' 카테고리의 다른 글

[Python] DES 예제  (0) 2018.02.06
[Python] AES 예제  (0) 2018.02.06
메모리 에디터 개발  (0) 2017.02.24
Chrome Extension 만드는 법  (0) 2016.01.26
[KakaoTalk] 카카오톡 분석결과물  (2) 2016.01.07

댓글