2020年9月18日 星期五

Windows 7 x86 驅動程式編譯

一般在Windows平台上,可能比較少會遇到驅動層級的惡意程式,不過如果遇到了,我們也要知道如何分析它,那麼需要知道驅動程式是如何編譯以及運行它在系統上,因此這篇教學是傾向於如何編譯Windows驅動程式,然後將它運行到記憶體上。

 

工具

1. Windows Driver Kit 8

2. Visual Studio 2012 Professional

3. Dbgview

4. OSR Driver loader

5. 驅動程式運行環境:Windows 7 x86

一、安裝Windows Driver Kit 8

Windows Driver Kit 8 是Windows在開發驅動時的模組,要先安裝完Visual Studio後,再安裝它,就能在Visual Studio裡面開發驅動程式。

執行wdksetup.exe,安裝過程都使用預設的設定即可,接下來都按Next,最後就能完成安裝。



二、設置Visual Studio驅動開發環境

首先創建驅動程式的空專案,滑鼠左鍵點選File->New->Project->Templates->Visual C++->Windows Driver->WDM。



由於我們建立的是驅動空專案,因此裡面什麼檔案都沒有,需要自行創建Main.c。



將Driver Files底下的HelloDriver.inf刪除。



在專案點選滑鼠右鍵->Properties->C/C++->Advanced->Compile As,並且將它修改成 Compile as C Code (/TC)。



在專案點選滑鼠右鍵->Properties->C/C++->All Options-> Treat Warnings As Errors,將它修改成 No (/WX-)。



我們的驅動程式會運作在Windows 7 x86底下,因此在編譯的設定需要選擇Win32和Win7 Debug。



三、編譯驅動程式

在Main.c裡面撰寫簡易的程式碼。

#include <ntifs.h>
#include <intrin.h>

VOID DriverUnload(PDRIVER_OBJECT objDriver)
{
  UNREFERENCED_PARAMETER(objDriver);
  DbgPrint("DriverUnload\n");
}

NTSTATUS DriverEntry(PDRIVER_OBJECT objDriver, PUNICODE_STRING strRegPath)
{
  UNREFERENCED_PARAMETER(strRegPath);
  objDriver->DriverUnload = DriverUnload;
  DbgPrint("Hello Driver\n");
  return STATUS_SUCCESS;
}

寫完程式碼後點選Build->Build Solution開始編譯驅動程式。

編譯完成後,在Output欄位,會顯示編譯成功的訊息,輸出檔案會放在此專案主目錄的Win7Debug資料夾底下,其中HelloDriver.sys就是它的執行檔。


 

四、載入與卸載驅動程式

載入驅動程式我們可以透過OSR Loader工具幫助我們完成這項工作。



執行OSRLOADER後,滑鼠左鍵點選Browser,然後選擇要載入的驅動程式(HelloDriver.sys)。

接者按Register Service,出現操作順利完成的視窗後,再按Start Service,就能順利載入我們的驅動程式。



如果想要看到驅動程式印出的訊息,我們在運行驅動程式之前利用DebugView將它的訊息印出來,不過需要設置DebugView抓取資料的設定,將Capture Kernel和Enable Verbose Kernel Output啟用。



在驅動載入後,我們可以看到它印出的訊息。



如果要卸載驅動,一樣也是透過OSR Loader,先讓驅動程式停止運行Stop Service,然後再執行Unregister Service,這樣就完成卸載驅動了。



在卸載驅動後,一樣能看到我們印出的字串。