메모장 입니다2
Windows] 드라이버 개발 - 4) 권한, 콜백함수 본문
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;
}
'Study > Programming' 카테고리의 다른 글
Windows] 드라이버 개발 - 6) IRP (0) | 2017.02.24 |
---|---|
Windows] 드라이버 개발 - 5) WDM 드라이버, 디바이스 스택 (0) | 2017.02.23 |
Windows] 드라이버 개발 - 3) windbg 기능, 커널 덤프 (0) | 2017.02.23 |
Windows] 드라이버 개발 - 2) 부가 설명, 코드, 환경설정, 명령어 (0) | 2017.02.23 |
Windows] 드라이버 개발 - 1) 정의, 개발 킷 종류 (0) | 2017.02.23 |