Windows内核编程学习1:构建HelloWorld
附本章需要資源:VS+SDK+WDK+InstDrv+DbgView-系統(tǒng)安全文檔類資源-CSDN下載
首先下載VS+WDK,資源可以從微軟上下,我這里資源也附在后面,但不是最新的。
今天我們開始第一個(gè)項(xiàng)目:HelloWorld
(我用的是VS2019)打開VS,[創(chuàng)建新項(xiàng)目]=>[Kernel Mode Driver Empty],再填寫名稱:HelloWorld
進(jìn)入項(xiàng)目后,右擊“解決方案管理器”中的“Source Files”,“添加”,“新建項(xiàng)”,不要選擇上面的任何項(xiàng)目,直接在“名稱”中填寫“main.c”,然后在“main.c”里寫入以下C語(yǔ)言代碼:
#include <ntddk.h>VOID DriverUnload(PDRIVER_OBJECT driver) {DbgPrint("HW: Our driver is unloading...\r\n"); } NTSTATUS DriverEntry(PDRIVER_OBJECT driver, PUNICODE_STRING reg_path) {DbgPrint("HW: Hello, World!\r\n");driver->DriverUnload = DriverUnload;return STATUS_SUCCESS; }保存項(xiàng)目。然后根據(jù)你的系統(tǒng)版本,在菜單欄中選擇“x86”“x64”“ARM”或“ARM64”。
接著開始生成解決方案了。菜單欄中“生成”=>“生成解決方案”。
接下來(lái)有些人會(huì)遇到要添加Spectre緩解庫(kù)的情況,可以從開始菜單里打開“Visual Studio 2019 Installer”,進(jìn)行修改。修改完后重新生成。
還有個(gè)問題。VS會(huì)提示代碼中有錯(cuò)誤,原因在于driver與reg_path沒用到過,可以改成下面的樣子:(也就是自己給自己賦值了一下)
#include <ntddk.h>VOID DriverUnload(PDRIVER_OBJECT driver) {DbgPrint("HW: Our driver is unloading...\r\n");driver = driver; } NTSTATUS DriverEntry(PDRIVER_OBJECT driver, PUNICODE_STRING reg_path) {DbgPrint("HW: Hello, World!\r\n");reg_path = reg_path;driver->DriverUnload = DriverUnload;return STATUS_SUCCESS; }生成完畢后,就是運(yùn)行項(xiàng)目了。這時(shí)候你到項(xiàng)目文件夾下會(huì)找到一個(gè)“.sys”的文件,因?yàn)槲覀冞@里項(xiàng)目名稱叫HelloWorld,所以文件名為“HelloWorld.sys”。怎么運(yùn)行呢?因?yàn)閃indows內(nèi)核程序不同于普通的應(yīng)用程序,你也不要指望它會(huì)彈出個(gè)窗口,所以只能用`DbgPrint`,也就是調(diào)試輸出,來(lái)查看它的狀態(tài)。輸出內(nèi)容可以用DbgView軟件查看——接下來(lái)介紹如何查看`DbgPrint`的內(nèi)容。
先安裝驅(qū)動(dòng)程序。我這里用的InstDrv,資源附在后面。
打開InstDrv.exe,把HelloWorld.sys拖到輸入框上,會(huì)自動(dòng)輸入文件路徑。接下來(lái)先不忙安裝啟動(dòng),我們打開DbgView.exe,把菜單欄中“監(jiān)視”欄中除了“啟動(dòng)日志”以外都勾上,接下來(lái)會(huì)出現(xiàn)一堆監(jiān)視輸出信息,不管它們,我們的程序還沒安裝呢。
但是啟動(dòng)失敗了。為什么?因?yàn)闆]有簽名。
打開測(cè)試模式,在測(cè)試模式下可以安裝啟動(dòng)沒有簽名的驅(qū)動(dòng)程序。Win+R,輸入cmd回車,在命令提示符中輸入`bcdedit /set testsigning on`打開測(cè)試模式,再重啟就行了。(同理,`bcdedit /set testsigning off`可以再重啟后關(guān)閉測(cè)試模式)
InstDrv中 安裝=>啟動(dòng)? 程序,DbgView中會(huì)立刻出現(xiàn)調(diào)試信息(迅速一定要迅速!!!),我這里把我的給大家看看:
?同樣,“停止”之后,會(huì)有驅(qū)動(dòng)程序卸載的信息:
?接下來(lái)可以卸載了。
今天的學(xué)習(xí)就結(jié)束了!感謝大家的閱讀!也歡迎大家提出問題!
總結(jié)
以上是生活随笔為你收集整理的Windows内核编程学习1:构建HelloWorld的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Maven 强制导入jar包
- 下一篇: 使用 Spring Cloud 实现微服