1. 작업관리자 흉내내기. ( 서비스의 시작과 스톱을 신중히 하지 않는다면 블루스크린 )
// 프로세스의 생성/파괴를 감시하는 드라이버
#include <ntddk.h>
VOID foo( HANDLE ParentID, HANDLE ProcessID, BOOLEAN Create )
{
if( Create == TRUE )
{
DbgPrint( "Process Created : %d, %d", ProcessID, ParentID );
}
else
{
DbgPrint( "Process Terminated : %d, %d", ProcessID, ParentID );
}
}
VOID DriverUnload( PDRIVER_OBJECT pDrvObj )
{
DbgPrint( "Driver Unload" );
// 반드시 Callback 함수를 제거하고 unload 되어야 한다.
PsSetCreateProcessNotifyRoutine( foo, TRUE );
}
NTSTATUS DriverEntry(PDRIVER_OBJECT pDrvObj // DRIVER_OBJECT 객체의 주소
, PUNICODE_STRING pRegPath ) // 설치된 레지스트리 경로
{
DbgPrint( "DriverEntry : %p", pDrvObj );
// 드라이버가 unload 될때 호출될 함수를 등록한다.
pDrvObj->DriverUnload = DriverUnload;
// 프로세스 감시 함수를 등록한다.
PsSetCreateProcessNotifyRoutine( foo, FALSE );
return STATUS_SUCCESS;
}
#include <ntddk.h>
VOID foo( HANDLE ParentID, HANDLE ProcessID, BOOLEAN Create )
{
if( Create == TRUE )
{
DbgPrint( "Process Created : %d, %d", ProcessID, ParentID );
}
else
{
DbgPrint( "Process Terminated : %d, %d", ProcessID, ParentID );
}
}
VOID DriverUnload( PDRIVER_OBJECT pDrvObj )
{
DbgPrint( "Driver Unload" );
// 반드시 Callback 함수를 제거하고 unload 되어야 한다.
PsSetCreateProcessNotifyRoutine( foo, TRUE );
}
NTSTATUS DriverEntry(PDRIVER_OBJECT pDrvObj // DRIVER_OBJECT 객체의 주소
, PUNICODE_STRING pRegPath ) // 설치된 레지스트리 경로
{
DbgPrint( "DriverEntry : %p", pDrvObj );
// 드라이버가 unload 될때 호출될 함수를 등록한다.
pDrvObj->DriverUnload = DriverUnload;
// 프로세스 감시 함수를 등록한다.
PsSetCreateProcessNotifyRoutine( foo, FALSE );
return STATUS_SUCCESS;
}