C:\Windows\System32>powercfg -lastwake
절전 모드 해제 기록 카운트 - 1
절전 모드 해제 기록[0]
절전 모드 해제 소스 카운트 - 1
절전 모드 해제 소스[0]
유형: 절전 모드 해제 타이머
소유자: [PROCESS] \Device\HarddiskVolume2\Windows\UUS\Packages\Preview\amd64\MoNotificationUx.exe
2. 전원 관리 옵션 설정 편집 > 고급 전원 관리 옵션 설정 변경 > 절전 > 절전 모드 해제 타이머 허용 > 설정 : 사용 안 함 으로 변경
프로그램을 실행시키면, 메모리에 프로세스를 위한 공간을 할당하고 EPROCESS 등의 구조체를 생성한다.
공간 할당이 끝나면, 커널이 등록된 Notify Routine 함수를 호출하여 프로세스의 실행 여부를 결정한다.
드라이버에게 프로세스의 생성과 소멸 시기를 알려주기
프로세스가 실행될 때마다 호출할 함수를 커널에 등록해야 한다.
WDK에서 제공되는, Notify Routine 함수를 등록하는 함수들
PsSetCreateProcessNotifyRoutine
NTSTATUS
PsSetCreateProcessNotifyRoutine(
IN PCREATE_PROCESS_NOTIFY_ROUTINE NotifyRoutine,
IN BOOLEAN Remove
);
VOID
(*PCREATE_PROCESS_NOTIFY_ROUTINE) (
IN HANDLE ParentId,
IN HANDLE ProcessId,
IN BOOLEAN Create
);
이 방식으로 설치하는 NotifyRoutine은 프로세스가 생성되거나 제거되는 상황을 알 수는 있지만, 생성 과정을 제어할 수 없다.
유저 모드 애플리케이션 뿐만 아니라 장치 드라이버나 커널 모드에서 운영체제 자체를 디버깅할 수도 있다.
GUI가 있으며 VS 디버거보다 강력하다.
덤프 파일을 통해 디버깅할 수 있다.
고려 사항
타겟 컴퓨터(가상 머신)의 부트 설정을 변경해야 한다.
디버깅이 가능하도록 부트설정을 변경한다.
가상 머신의 실행 창에서 msconfig 입력 후, 부팅 탭에서 고급 옵션에 들어간다.
전역 디버그 설정에서 디버그 포트를 COM1, 전송 속도를 115200으로 맞추고 확인을 누른다.
종료하지 않고 TESTSIGNING 모드 설정을 진행한다.
TESTSIGNING 모드 설정
윈도우에서 드라이버가 작동하려면 MS로부터 인증을 받아야 하는데, 테스트 환경으로 부팅하면 이러한 인증 절차가 생략된다.
CMD를 관리자 권한으로 실행 후, 아래 명령어를 입력한다.
bcdedit /set testsigning on
완료되면 가상 머신을 종료한다.
호스트 컴퓨터에서도 설정해야 하는게 두 가지 있다.
디버깅할 타겟 컴퓨터와 연결할 방법을 결정한다. (가상 시리얼 포트)
VirtualBox 가상 머신의 설정에서 직렬 포트 탭에 들어간다.
직렬 포트 사용에 체크하고, 포트 번호를 위에서 설정한 포트 번호와 맞춰준다.
포트 모드를 Host Pipe로 설정하고, Connect to existing pipe/socket을 체크 해제한다.
아래의 Path/Address에 다음과 같이 입력한다.
\\.\pipe\com1
WinDbg(x64)에서 포트를 설정해야 한다.
File - Kernel Debug (Ctrl + K) 클릭 후 COM 탭으로 이동한다.
Pipe와 Reconnect에 체크하고 포트를 아래와 같이 작성한다.
타겟 컴퓨터의 운영체제 심볼을 자동으로 받도록 설정한다.
C:\sym\websym 폴더를 생성한다.
WinDbg의 File - Symbol File Path를 클릭하고 아래 내용을 작성한다.
C:\sym;
우측의 Help를 클릭하여 Search 탭에 web symbol을 검색한다.
Microsoft public symbol server를 클릭하면 다음과 같이 나온다.
The Microsoft symbol server makes Windows debugger symbols publicly available.
You can refer directly to the public symbol server in your symbol path in the following manner:
set _NT_SYMBOL_PATH=srv*DownstreamStore*https://msdl.microsoft.com/download/symbols
srv 이하 내용을 복사하여 아까의 세미콜론 뒤에 붙여넣고, DownstreamStore을 지우고 C:\sym\websym을 작성한다.
위의 과정을 모두 마치고나서 가상 머신을 작동시키면, WinDbg에서 커맨드 창이 열리고 다음과 같이 뜨는 것을 볼 수 있다.
Microsoft (R) Windows Debugger Version 10.0.19041.685 AMD64
Copyright (c) Microsoft Corporation. All rights reserved.
Opened \\.\pipe\com1
Waiting to reconnect...
Connected to Windows 10 19041 x64 target at (Sun Apr 18 21:01:11.597 2021 (UTC + 9:00)), ptr64 TRUE
Kernel Debugger connection established.
************* Path validation summary **************
Response Time (ms) Location
OK C:\sym
Deferred srv*C:\sym\websym*https://msdl.microsoft.com/download/symbols
Symbol search path is: C:\sym;srv*C:\sym\websym*https://msdl.microsoft.com/download/symbols
Executable search path is:
Windows 10 Kernel Version 19041 MP (1 procs) Free x64
Built by: 19041.1.amd64fre.vb_release.191206-1406
Machine Name:
Kernel base = 0xfffff801`37800000 PsLoadedModuleList = 0xfffff801`3842a3b0
System Uptime: 0 days 0:00:00.000
KDTARGET: Refreshing KD connection
Capacity:25500, FullChargedCapacity:50000, Voltage:10000, Rate:0
메뉴 탭의 Break를 클릭하면, 가상 머신을 멈출 수 있고 커맨드 창에 다음 내용이 출력된다.
Break instruction exception - code 80000003 (first chance)
*******************************************************************************
* *
* You are seeing this message because you pressed either *
* CTRL+C (if you run console kernel debugger) or, *
* CTRL+BREAK (if you run GUI kernel debugger), *
* on your debugger machine's keyboard. *
* *
* THIS IS NOT A BUG OR A SYSTEM CRASH *
* *
* If you did not intend to break into the debugger, press the "g" key, then *
* press the "Enter" key now. This message might immediately reappear. If it *
* does, press "g" and "Enter" again. *
* *
*******************************************************************************
nt!DbgBreakPointWithStatus:
fffff801`37bfd0b0 cc int 3
KitSetup.exe 파일을 실행하고, Help (Documentation Collection)만 체크하고 설치를 진행한다.
WDK Documentation을 검색해서 실행시킬 수 있다.
왼쪽 아래의 Index 탭에서 검색하여 원하는 내용을 찾을 수 있다.
VirtualBox에 윈도우10 설치
나는 윈도우 10 iso 이미지를 공식 홈페이지에서 다운로드 받은 후, VirtualBox에서 설치했다.
강의에서는 최신 버전의 윈도우가 무겁기 때문에 구버전의 윈도우 10을 구해서 가볍고 빠르게 사용하기를 추천한다.
프로젝트 생성
VS에서 Kernel Mode Driver, USB(KMDF)를 선택하여 프로젝트를 생성한다.
x64로 변경 후 빌드해보면, 다음과 같은 에러가 발생한다.
error MSB8040: Spectre-mitigated libraries are required for this project. Install them from the Visual Studio installer (Individual components tab) for any toolsets and architectures being used. Learn more: https://aka.ms/Ofhn4c
이는 보안 요소에 관한 에러이고, 당장은 신경쓰지 않아도 되므로 설정에서 비활성화한다.
프로젝트의 속성에서 C/C++ - Code Generation의 맨 아래 Spectre Mitigation 항목을 Disabled로 변경한다.
VirtualBox에서 윈도우 10 설치 시 kernel security check failure 에러
VirtualBox 최신 버전을 받았음에도 윈도우 10을 설치하면 커널 오류가 발생했다.
Hyper-V와 VirtualBox가 충돌하는 것 같다.
제어판 - 프로그램 추가/제거에서 왼쪽의 Windows 기능 추가/제거의 Virtual Machine Platform을 끄고 리부팅하면 해결된다.
대신 WSL2를 사용할 수 없다. 다음과 같은 오류가 발생한다.
Please enable the Virtual Machine Platform Windows feature and ensure virtualization is enabled in the BIOS.
For information please visit https://aka.ms/wsl2-install
[코드 4294967295로 프로세스 종료됨]