반응형

개발 및 디버깅 환경구성

- 호스트 환경

OS: Windows10 64bit

VM: VMware

Devtool: Visual Studio 2017

WDK: https://docs.microsoft.com/ko-kr/windows-hardware/drivers/other-wdk-downloads

(*최신버전: 2018.11.25기준 1709버전 WDK)

Debugging: VirtualKD, Windbg


- 게스트 환경(VM)

OS: Windows10 32bit

Driver Loader: OSR Driver Loader

Debugging: VirtualKD


- 환경 구성

1. VM에 Windows10 32bit를 설치

2. 자신의 Visual Studio 버전에 맞는 WDK를 다운로드

3. WDK프로젝트(빈프로젝트 아님)를 생성해 올바르게 컴파일 되는지 확인

4. 게스트의 네트워크 어뎁터를 브릿지 모드로 변경

5. 게스트에서 폴더하나를 생성해 공유 설정

6. 호스트에서 네트워크 드라이브를 게스트 OS에 연결

7. 준비된 OSR Driver Loader, VirtualKD target 폴더를 게스트 OS에 넣어줌

8. 게스트 OS에서 VirtualKD target폴더 안에 exe, reg파일 실행 후, x86 폴더에 있는 dll, sys파일을 system32폴더에 넣어준 후 잠시 종료

9. 호스트에서 vmmon64.exe(호스트 환경에 맞는 exe)실행 후, Debugger path(게스트 os bit와 일치시켜야함)설정

10. VMware에 게스트VM 설정을 들어가 Serial Port를 Named Pipe로 추가해준 후, VM 시작

11. 게스트에서 생성된 Boot 옵션에서 F8을 눌러 code signing을 disable 시켜줌

12. VirtualKD에서 windbg가 띄워지면서 연결되면 디버깅 환경 구축완료

13. Windbg에서 DbgPrint를 출력하기 위해 "ed nt!Kd_Default_Mask 8"를 입력

14. 그 다음 .symfix 후 .reload 명령을 수행


간단한 Driver, Application예제


Io_constant.h


#pragma once

#include <ntddk.h>
#define IOCTL_TEST CTL_CODE(FILE_DEVICE_UNKNOWN, 0x800, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define IOCTL_OVERFLOW CTL_CODE(FILE_DEVICE_UNKNOWN, 0x801, METHOD_BUFFERED, FILE_ANY_ACCESS)


driver.h


#pragma once

#include <ntddk.h>

void DriverUnload(PDRIVER_OBJECT pDriverObject);
NTSTATUS CreateCloseHandler(PDEVICE_OBJECT pDeviceObject, PIRP Irp);
NTSTATUS DeviceControl(PDEVICE_OBJECT pDeviceObject, PIRP Irp);
void StackOverflowHandler(PDEVICE_OBJECT pDeviceObject, PIRP Irp);


driver.c

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

#include "driver.h"
#include "Io_constants.h"

UNICODE_STRING devName;
UNICODE_STRING symName;

NTSTATUS DriverEntry(IN PDRIVER_OBJECT pDriverObject, IN PUNICODE_STRING RegistryPath) {
	UNREFERENCED_PARAMETER(RegistryPath);
	
	PDEVICE_OBJECT DeviceObject = NULL;
	RtlInitUnicodeString(&devName, L"\\Device\\KernelBOF");
	RtlInitUnicodeString(&symName, L"\\DosDevices\\KernelBOFcat");

	NTSTATUS status = IoCreateDevice(pDriverObject, 0, &devName, FILE_DEVICE_UNKNOWN, 0, FALSE, &DeviceObject);
	if (!NT_SUCCESS(status))
		return status;
	
	status = IoCreateSymbolicLink(&symName, &devName);
	if (!NT_SUCCESS(status))
		return status;

	pDriverObject->DriverUnload = DriverUnload;
	pDriverObject->MajorFunction[IRP_MJ_CREATE] = CreateCloseHandler;
	pDriverObject->MajorFunction[IRP_MJ_CLOSE] = CreateCloseHandler;
	pDriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = DeviceControl;

	return STATUS_SUCCESS;
}

void DriverUnload(PDRIVER_OBJECT pDriverObject) {
	IoDeleteSymbolicLink(&symName);
	IoDeleteDevice(pDriverObject->DeviceObject);
}

NTSTATUS CreateCloseHandler(PDEVICE_OBJECT pDeviceObject, PIRP Irp) {
	UNREFERENCED_PARAMETER(pDeviceObject);

	Irp->IoStatus.Status = STATUS_SUCCESS;
	IoCompleteRequest(Irp, IO_NO_INCREMENT);
	return Irp->IoStatus.Status;
}

NTSTATUS DeviceControl(PDEVICE_OBJECT pDeviceObject, PIRP Irp) {
	UNREFERENCED_PARAMETER(pDeviceObject);

	PIO_STACK_LOCATION pStack = IoGetCurrentIrpStackLocation(Irp);
	ULONG ctlCode = pStack->Parameters.DeviceIoControl.IoControlCode;

	Irp->IoStatus.Status = STATUS_SUCCESS;

	switch(ctlCode) {
	case IOCTL_TEST:
		DbgPrint("KuroNeko Device Driver Test\n");
		break;
	case IOCTL_OVERFLOW:
		StackOverflowHandler(pDeviceObject, Irp);
		break;
	default:
		break;
	}

	IoCompleteRequest(Irp, IO_NO_INCREMENT);
	return Irp->IoStatus.Status;
}

void StackOverflowHandler(PDEVICE_OBJECT pDeviceObject, PIRP Irp) {
	UNREFERENCED_PARAMETER(pDeviceObject);

	PIO_STACK_LOCATION pStack = IoGetCurrentIrpStackLocation(Irp);

	char *sBuffer = Irp->AssociatedIrp.SystemBuffer;
	DbgPrint("message: %s\n", sBuffer);
	
	if (pStack->Parameters.DeviceIoControl.InputBufferLength > 8) {
		RtlCopyMemory(sBuffer, "KuroNeko\x00", 9);
		Irp->IoStatus.Information = 9;
	}
	DbgPrint("message: %s\n", sBuffer);
}


코드 컴파일 후, 빌드 이벤트를 사용해 게스트 OS로 파일을 복사시킨 후, OSR Driver Loader로 빠른 로드 및 디버깅을 하자.

'공부' 카테고리의 다른 글

[nodejs] mongoose를 이용한 로그인 구현  (0) 2019.05.08
xss payload  (0) 2019.04.19
유저 영역 Stack Canary 분석  (2) 2018.08.16
python AES  (0) 2018.08.10
[IDA] C++ Class 변환  (0) 2017.08.09
블로그 이미지

KuroNeko_

KuroNeko

,