Skip to content

Commit 558cd5e

Browse files
committed
Add Windows Driver (KMDF)
1 parent 84eb661 commit 558cd5e

File tree

7 files changed

+417
-0
lines changed

7 files changed

+417
-0
lines changed

windows/README.md

+14
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
# Kernel Module Examples
2+
3+
Windows Kernel Module Driver
4+
5+
## Introduction
6+
7+
Windows menyediakan abstraksi terhadap setiap komponen dalam operating system melalui API, termasuk pembangunan Kernel Module. Pengembangan Kernel Module dapat dilakukan melalui dua pendekatan, yaitu:
8+
9+
- [Windows Driver Model (WDM)](wdm)
10+
- [Windows Driver Framework (WDF)](kmdf).
11+
12+
`Windows Driver Model (WDM)` sangat terikat erat dengan operating system. Driver (kernel module) akan berinteraksi secara langsung dengan kernel menggunakan system service routine dan memanipulasi struktur kernel.
13+
14+
`Windows Driver Framework (WDF)` adalah framework yang mengastraksi sebuah driver. WDF berfokus kepada pengembangan driver. Operasi low-level dan interaksi dengan sistem akan ditangani oleh framework sehingga driver dapat berfokus kepada flow utama. WDF dibagi atas dua yaitu `Kernel-Mode Driver Framework (KMDF)` dan `User-Mode Driver Framework (UMDF)`. Namun dalam repository ini hanya akan dibahas `Kernel Mode Driver Framework (KMDF)`.

windows/_commands.md

+47
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
# Kernel Module Examples
2+
3+
Windows Kernel Module Driver
4+
5+
Perintah-perintah penting yang sering digunakan berkaitan dengan Windows Driver dan pengembangannya.
6+
7+
## Kernel Version
8+
9+
Mendapatkan versi kernel yang sedang berjalan.
10+
11+
```
12+
$ systeminfo | findstr Build
13+
```
14+
15+
## Module Operation
16+
17+
Module di-load sebagai service dengan tipe kernel.
18+
19+
#### Module Information
20+
21+
Mendapatkan daftar module yang sedang dimuat ke kernel.
22+
23+
```
24+
$ driverquery /v
25+
```
26+
27+
#### Load/Unload Module
28+
29+
Module dimuat sebagai service dengan tipe kernel. Sehingga, untuk memuat module maka sebuah service harus dibuat terlebih dahulu.
30+
31+
Load module
32+
33+
```
34+
$ sc create SvcDriver type=kernel binpath=path/code.sys
35+
$ sc start SvcDriver
36+
```
37+
38+
Unload module
39+
40+
```
41+
$ sc stop SvcDriver
42+
$ sc delete SvcDriver
43+
```
44+
45+
Sebagai alternatif, driver dapat dimuat dengan aplikasi pihak ketiga seperti:
46+
47+
- [OSR Driver Loader](https://www.osronline.com/article.cfm%5Earticle=157.htm)

windows/_introduction.md

+36
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
# Kernel Module Examples
2+
3+
Windows Kernel Module Driver
4+
5+
## Driver Type
6+
7+
#### KMDF Drivers
8+
9+
- Device Function Driver
10+
- Device Filter Driver
11+
- Software Driver
12+
- Filesystem Filter Driver
13+
- Filesystem Driver
14+
15+
#### WDM Drivers
16+
17+
- `Bus Driver`: menangani I/O bus device dan menawarkan fungsionalitas yang independen terhadap perangkat.
18+
- `Function Driver`: menangani perangkat secara individual.
19+
- `Filter Driver`: menyarin I/O request untuk device, class of device, dan bus.
20+
21+
## Driver Packages
22+
23+
Pada umumnya, setiap kompilasi driver yang berhasil akan menghasilkan beberapa file:
24+
25+
- `driver.sys`: binary dari driver.
26+
- `driver.inf`: informasi terkait driver
27+
- `driver.cer`: sertifikat untuk signed driver.
28+
29+
## Windows Driver Architecture
30+
31+
#### Device Objects and Stacks
32+
33+
## I/O Model
34+
35+
Data direpresentasikan sebagai Request Packets atau I/O Request Packets. Mekanisme komunikasi ini diadopsi oleh Windows untuk berkomunikasi antar komponen berbeda dalam Windows Driver Architecture.
36+

windows/_setup.md

+138
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,138 @@
1+
# Kernel Module Examples
2+
3+
Windows Kernel Module Driver.
4+
5+
## Build Environment
6+
7+
Pengembangan driver memerlukan `Windows SDK` dan `Windows Driver Kit (WDK)` dengan versi yang sesuai. Pendekatan yang sangat direkomendasikan dalam mengembangkan driver adalah melalui `Visual Studio`.
8+
9+
Keseluruhan kode dalam repository ini dibangun dan diuji menggunakan setup sebagai berikut:
10+
11+
- Windows 10 version 10.0.19041
12+
- Visual Studio Community 2019
13+
- Windows 10 SDK 10.0.19041.0
14+
- Windows Driver Kit 10.0.19041.0
15+
16+
Download dan install `Visual Studio Community 2019` melalui [laman berikut](https://visualstudio.microsoft.com/thank-you-downloading-visual-studio/?sku=Community&rel=16).
17+
18+
Ketika instalasi komponen, cari dan install `Windows 10 SDK`.
19+
20+
Download dan install `Windows Driver Kit (WDK)` melalui [laman berikut](https://docs.microsoft.com/en-us/windows-hardware/drivers/download-the-wdk)
21+
22+
## Project
23+
24+
Setiap driver yang dikembangkan harus dikelola ke dalam sebuah project. Repositori ini hanya akan menyimpan source code spesifik terhadap topik-topik tertentu sehingga pembuatan projek harus dilakukan mandiri.
25+
26+
Pastikan telah mempersiapkan development environment!
27+
28+
Untuk membuat project baru (KMDF), lakukan:
29+
30+
- klik **File** - **New project**
31+
- klik **Kernel Mode Driver, Empty (KMDF)**
32+
- sesuaikan nama project dan lokasi.
33+
34+
Tambahkan source code yang dibutuhkan.
35+
36+
- klik kanan pada nama project
37+
- klik **Add**
38+
- klik **New item**
39+
- klik **C++ File (.cpp)**
40+
- masukkan nama yang sesuai.
41+
42+
Lakukan pengaturan project dengan cara:
43+
44+
- klik kanan pada nama project
45+
- klik **Properties**
46+
- pilih konfigurasi target (Debug/Release dsb).
47+
- navigasi ke **Configuration Properties** - **C/C++** - **Code Generation**
48+
- set **Security Check** menjadi `Disable Security Check (/GS-)`
49+
- set **Spectre Migitation** menjadi `Disabled`
50+
- navigasi ke **Configuration Properties** - **Linker** - **Advanced**
51+
- set **Entry Point** menjadi `DriverEntry`
52+
- navigasi ke **Configuration Properties** - **Inf2Cat** - **General**
53+
- set **Run Inf2Cat** menjadi `No`
54+
55+
## Debugging Environment
56+
57+
Debugging kernel (dan driver/kernel module) tidak dapat dilakukan pada mesin yang sama. Diperlukan environment terpisah untuk menjalankan kernel dan kernel module yang akan diuji.
58+
59+
Setup yang diperlukan sebagai berikut:
60+
61+
- Target Machine.
62+
- Debugger Machine.
63+
64+
Debugging dilakukan secara remote (`Remote Debugging`) dengan `Target Machine` dapat berupa mesin fisik maupun VM (vmware, virtualbox, dsb).
65+
66+
Berdasarkan koneksi, setidaknya terdapat dua cara debugging, yaitu:
67+
68+
- Serial line
69+
- Network
70+
71+
#### Serial Line
72+
73+
`Target Machine` dan `Debugger machine` dihubungkan dengan serial port. Jika `Target Machine` berupa VM maka koneksi serial terjadi secara virtual dengan named pipe.
74+
75+
Pada VM (vmware), lakukan konfigurasi sebagai berikut:
76+
77+
- pastikan `Target Machine` dalam keadaan mati (turn off).
78+
- klik **VM** - **Settings**
79+
- pada tab **Hardware**, klik **Add**
80+
- pilih **Serial Port** dan klik **Finish**
81+
- kembali pada tab **Hardware**, pilih **Use named pipe**
82+
- set named pipe sebagai `\\.\pipe\target` (atau nama apapun)
83+
84+
Kemudian jalankan perintah berikut untuk mengaktifkan fitur debugging pada kernel setiap booting. Eksekusi pada cmd dengan hak akses Administrator.
85+
86+
```
87+
$ bcdedit /debug on
88+
$ bcdedit /dbgsettings serial debugport:2 baudrate:115200
89+
$ bcdedit /set nointegritychecks on
90+
$ bcdedit /set testsigning on
91+
```
92+
93+
Restart `Target Machine` untuk load pengaturan yang telah diberikan.
94+
95+
Pengaturan serial line hanya dilakukan sekali saja. Untuk setiap kali debugging akan dilakukan, lakukan pengaturan berikut pada debugger (`windbg`):
96+
97+
- klik **File** - **Kernel debug**
98+
- pilih tab **COM**
99+
- set **Baud Rate** menjadi 115200
100+
- set **Port** menjadi `\\.\pipe\target`
101+
- centang **Pipe** dan **Reconnect**
102+
103+
Restart `Target Machine` dan tunggu sampai `windbg` mendapat komunikasi dari `Target Machine`.
104+
105+
#### Network
106+
107+
`Target Machine` dan `Debugger machine` dihubungkan dengan TCP/IP network. Jika `Target Machine` berupa VM maka koneksi terjadi secara virtual.
108+
109+
Download [Debugging Tools](https://docs.microsoft.com/en-us/windows-hardware/drivers/debugger/debugger-download-tools)
110+
111+
Pada `Target machine`, lakukan:
112+
113+
- buat direktori `C:\KDNET`
114+
- salin `kdnet.exe` dan `VerifiedNICList.xml` ke `C:\KDNET`.
115+
116+
Kemudian jalankan perintah berikut untuk mengaktifkan fitur debugging pada kernel setiap booting. Eksekusi pada cmd dengan hak akses Administrator.
117+
118+
```
119+
$ bcdedit /debug on
120+
$ bcdedit /dbgsettings net hostip:HOST port:53000
121+
$ bcdedit /set nointegritychecks on
122+
$ bcdedit /set testsigning on
123+
```
124+
125+
dengan HOST adalah IP address dari `Debugger Machine`.
126+
127+
Sebuah key akan diberikan ketika mengatur `/dbgsettings`. Simpan key tersebut, anggap sebagai KEY.
128+
129+
Restart `Target Machine` untuk load pengaturan yang telah diberikan.
130+
131+
Pengaturan serial line hanya dilakukan sekali saja. Untuk setiap kali debugging akan dilakukan, lakukan pengaturan berikut pada debugger (`windbg`):
132+
133+
- klik **File** - **Kernel debug**
134+
- pilih tab **NET**
135+
- set **Port** menjadi 53000
136+
- set **Key** masukkan KEY yang diberikan oleh `bcdedit /dbgsettings`
137+
138+
Restart `Target Machine` dan tunggu sampai `windbg` mendapat komunikasi dari `Target Machine`.
+70
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
/*
2+
Windows KMDF Skeleton
3+
Archive of Reversing.ID
4+
Universal Driver
5+
6+
Tested on Windows 10.0.19041
7+
8+
Kerangka kode Windows KMDF (Kernel-Mode Drivers Framework)
9+
10+
Load:
11+
$ sc create DriverService type=kernel binpath=code.sys
12+
$ sc start DriverService
13+
14+
Unload:
15+
$ sc stop DriverService
16+
$ sc delete DriverService
17+
*/
18+
#pragma warning (disable : 4100)
19+
20+
#include <ntddk.h>
21+
#include <wdf.h>
22+
23+
24+
25+
/* ****************** Type Definition & Data Declaration ****************** */
26+
27+
DRIVER_INITIALIZE entry;
28+
EVT_WDF_DRIVER_DEVICE_ADD EventAddCallback;
29+
30+
31+
/* ********************* Internal Functions Prototype ********************* */
32+
33+
VOID UnloadDriver (PDRIVER_OBJECT driver);
34+
35+
36+
/* *************************** Helper Functions *************************** */
37+
38+
39+
/* ****************** Loadable Kernel Module Initialize ******************* */
40+
41+
NTSTATUS DriverEntry (PDRIVER_OBJECT driver, PUNICODE_STRING regpath)
42+
{
43+
NTSTATUS status = STATUS_SUCCESS;
44+
WDF_DRIVER_CONFIG config;
45+
46+
WDF_DRIVER_CONFIG_INIT (&config, EventAddCallback);
47+
48+
driver->DriverUnload = UnloadDriver;
49+
50+
status = WdfDriverCreate (driver, regpath, WDF_NO_OBJECT_ATTRIBUTES, &config, WDF_NO_HANDLE);
51+
52+
return status;
53+
}
54+
55+
56+
NTSTATUS EventAddCallback (WDFDRIVER driver, PWDFDEVICE_INIT devinit)
57+
{
58+
UNREFERENCED_PARAMETER (driver);
59+
NTSTATUS status;
60+
WDFDEVICE device;
61+
62+
status = WdfDeviceCreate (&devinit, WDF_NO_OBJECT_ATTRIBUTES, &device);
63+
64+
return status;
65+
}
66+
67+
VOID UnloadDriver (PDRIVER_OBJECT driver)
68+
{
69+
70+
}

0 commit comments

Comments
 (0)