
환경 세팅을 하며 실습한 내용에 대해서 간략히 작성한다.
반드시 관리자 권한 터미널에서 실행한다.
테스트 서명 활성화
# 관리자 권한으로 실행
bcdedit /set testsigning on
windows driver의 경우 인증을 받지 못한 경우, 드라이버 등록이 되지 않는다. 따라서 테스트를 위해서는 testsigning을 활성화 시켜줘야한다. 우회하기 위한 필수 설정이다.
디버깅 모드 활성화
bcdedit /debug on
이 설정을 켜두면 시스템 보안이 매우 취약해진다. 누군가 포트만 알면 내 커널 메모리를 다 들여다볼 수 있기 때문이다. 그래서 실제 사용하는 PC에서는 절대 켜지 말고, 반드시 테스트용 VM 에서만 켜야한다.
네트워크 디버깅 설정(KDNET)
# 키값 생성하기
// target pc에서 host pc ip를 넣어줘야함
bcdedit /dbgsettings net hostip:192.168.1.104 port:50000
host pc에서 windbg로 커널에 붙기위한 키값을 생성하는 명령어이다.
설정 확인 및 재부팅
bcdedit /dbgsettings # 설정된 Key값과 Ip 확인
windbg의 경우에 예전에는 pipe통신으로 가상 Serial Port를 만들어서 연결했지만 요즘은 network로 연결하는게 속도가 더 빠르다고 한다.
Set Up KDNET Network Kernel Debugging Manually - Windows drivers
Windbg symbol 설정하기
settings -> Debugging Settings -> Default symbol path
srv*c:\symbols\*http://msdl.microsoft.com/download/symbols
// path는 개별 설정
Windbg Attach to Kernel
생성한 키를 key에넣어준다.

wdf 프로젝트 생성한다.

inf 파일 삭제

테스트 코드 작성
#include <ntddk.h>
NTSTATUS DriverEntry(PDRIVER_OBJECT pDrvObj, PUNICODE_STRING pRegistryPath) {
pDrvObj = pDrvObj;
pRegistryPath = pRegistryPath;
return STATUS_UNSUCCESSFUL;
}
빌드
vm으로 .sys 파일을 옮기고 함께 생성된 pdb 파일을 symbol path에 넣어준다.
테스트 vm 에서 sc 명령어로 드라이버를 등록해준다.
sc.exe create sample binpath= z:\sample.sys type= kernel start= demand
host pc에서 windbg로 breakpoint를 설정한다.
bp sample!DriverEntry

아직 드라이버를 메모리에 로드하기 전이라서 찾을 수 없다고 나온다.
test vm에서 드라이브를 실행한다.
sc.exe start sample
windbg break 확인

디버깅을 성공적으로 걸었다.
윈도우 커널 디버깅은 환경 세팅이 절반이라는 소리가 있다. host pc와 target pc를 나누어서 한다는 점이 이전에 원격으로 디버깅을 한 경험이 있어서 익숙했다.