메모장 입니다2

Windows] 드라이버 개발 - 4) 권한, 콜백함수 본문

Study/Programming

Windows] 드라이버 개발 - 4) 권한, 콜백함수

Wooum@n 2017. 2. 23. 23:41

1.권한


 -Windows 보호모드 아키텍쳐에 의해, 접근 권한은 Ring0~ Ring3로 분류된다.

>Ring0 

->커널 레벨

->커널 드라이버, 운영체제 커널

->하드웨어 직접접근이 허용.

>Ring1~2

-> 사용안함

>Ring3 

->유저 레벨

->하드웨어 직접접근 불가.

 -메모리 권한

>응용프로그램

->커널 영역을 볼 수 없음.

->다른 응용프로그램의 메모리를 볼 수 없음(가상메모리, 동일 주소를 사용하기 때문)

>커널

->다른 커널 영역을 확인가능.




2.콜백함수(Kernel)


 -운영체제가 특정 조건 때 자동으로 호출해주는 함수.

 -함수 설명

>프로세스

>프로세스가 실행, 종료될 때 호출되는 콜백함수 등록/해제.

NTSTATUS PsSetCreateProcessNotifyRoutine(   

IN PCREATE_PROCESS_NOTIFY_ROUTINE NotifyRoutine,

IN BOOLEAN Remove

);

*NotifyRoutine: 콜백함수 주소

*Remove:  FALSE - 등록

TRUE - 해제


>프로세스 콜백함수

VOID (*PCREATE_PROCESS_NOTIFY_RO"UTINE)(

IN HANDLE ParentId,

IN HANDLE ProcessId,

IN BOOLEAN Create

);

*Create: TRUE - 실행   //이 인자값을 확인하여 실행/종료 중인지 확인

FALSE - 종료


>드라이버, DLL(이하 드라이버로 통칭)

>드라이버가 실행될 때 호출되는 콜백함수 등록

NTSTATUS PsSetLoadImageNotifyRoutine(

IN PLOAD_IMAGE)NOTIFY_ROUTINE NotifyRoutine

);

*NotifyRoutine: 콜백함수 주소


>콜백함수 해제

NTSTATUS PsRemoveLoadImageNotifyRoutine(

IN PLOAD_IMAGE_NOTIFY_ROUTINE NotifyRoutine

);


>드라이버 콜백함수

VOID (*PLOAD_IMAGE_NOTIFY_ROUTINE)(

IN PUNICODE_STRING FullImageName,

IN HANDLE ProcessId,

IN PIMAGE_INFO ImageInfo

);

*FullImageName: 드라이버 파일 경로

*ProcessId: 드라이버를 로딩한 프로세스 ID

*ImageInfo: 로딩되는 드라이버 관련 정보

>중요 멤버

ULONG SystemModeImage: 0 - DLL

                                     1 - 드라이버




3.콜백함수 실습


 -프로세스(응용프로그램, 드라이버, DLL)가 실행, 종료될 때 

 해당 프로세스 정보를 디버거 메시지로 출력하는 드라이버 만들기

 

 -코드

/* MyFirstRootkit.sys Source*/

#include <ntddk.h>



VOID ProcessCallback(IN HANDLE parentid, IN HANDLE pid, IN BOOLEAN create)

{

UNREFERENCED_PARAMETER(parentid);

switch (create)

{

case TRUE:

DbgPrintEx(DPFLTR_IHVDRIVER_ID, 0, "[0x%X] process is creating\n", pid);

break;

case FALSE:

DbgPrint("[0x%X] process is deleting\n", pid);

break;

}

}


VOID SysCallBack(IN PUNICODE_STRING imagePath, IN HANDLE pid, IN PIMAGE_INFO imageInfo)

{

WCHAR *pwsName = NULL;


if (imagePath == NULL)

return;


pwsName = (WCHAR*)ExAllocatePool(NonPagedPool, imagePath->Length + sizeof(WCHAR));


memcpy(pwsName, imagePath->Buffer, imagePath->Length);

pwsName[imagePath->Length / sizeof(WCHAR)] = 0;


DbgPrintEx(DPFLTR_IHVDRIVER_ID, 0, "[0x%X] (%ws) is loading\n", pid, pwsName);


if (imageInfo->SystemModeImage == 0) 

DbgPrint("type:[Driver]\n");


else

DbgPrint("type:[DLL]\n");



if (pwsName)

ExFreePool(pwsName);

}


void MyDriverUnload(

IN PDRIVER_OBJECT DriverObject

)

{

UNREFERENCED_PARAMETER(DriverObject);


DbgPrintEx(DPFLTR_IHVDRIVER_ID, 0, "Driver Unloading...\n");


//unregister ProcessCallback

PsSetCreateProcessNotifyRoutine(ProcessCallback, TRUE);

//unregister DriverCallback

PsRemoveLoadImageNotifyRoutine(SysCallBack);

}


NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath)

{

UNREFERENCED_PARAMETER(DriverObject);

UNREFERENCED_PARAMETER(RegistryPath);


DbgPrint("Loadview Driver Start...\n");

//Register

PsSetCreateProcessNotifyRoutine(ProcessCallback, FALSE);

PsSetLoadImageNotifyRoutine(SysCallBack);


DriverObject->DriverUnload = MyDriverUnload;

DbgPrint("Loadview Driver Close...\n");


return STATUS_SUCCESS;

}