|
| 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`. |
0 commit comments