驱动
1.使用DebugView查看輸出信息
對內核調試是做系統底層驅動開發的必修課,當然也是有興趣才可能進行深入的挖掘。進行驅動調試可以有很多工具可以用,比如DebugView可以查看一些DbgPrint的輸出的輸出信息(當然它的功能還有其他)如下圖(不好意思,圖還在審核中):
點擊菜單“Capture”,在彈出的菜單中勾選想要監控的輸出信息,就可以在動態調試時看到你在程序中使用DbgPrint輸出的信息!
下面我們舉一個驅動的小例子,來看下效果(相關資料可以參考驅動開發的教程《寒江獨釣》)。
實例1:
首
先要安裝相應的工具,我們這里用到了,VMWare,WDK,DebugView,任意文本編輯工具。我這里用了VS2008作為編輯工具,感覺編寫工具
都無所謂的,我機子上裝我這個,而且它可以實現自動生成格式,總而言之,我對這個比較熟悉,大家根據喜好選擇。其他相關的工具從網上下載即可。
(1)測試程序
為了能夠在這個驅動作為服務進行添加于卸載時能夠給大家一清晰的提示,這里編寫MyDriver.c如下(參考《寒江獨釣》)
#include <ntddk.h> //可能大家還記得<ntifs.h>,ntddk.h貌似比ntifs.h要高級些,看其源碼發現,
//在define的時候ntddk.h會關照 ntifs.h,但ntifs.h卻不關照它,哎!好傷心呀!
//在調試時,卸載這個驅動服務時,可以在此輸出調試信息
void DriverUnload( PDRIVER_OBJECT driver )
{
//輸出用于調試的信息
DbgPrint( "My driver is unloaded!
" );
}
//DriverEntry,就相當與主函數main(),很多做驅動的同僚會把這些函數用宏進行重定義,
//以適應其長期用其他工具編寫調試程序和編寫程序的習慣
NTSTATUS DriverEntry(PDRIVER_OBJECT driver, PUNICODE_STRING reg_path)
{
//輸出相應得調試信息
DbgPrint( "This is my driver!
" ); //注意這里的"
",這個我在調試時發現了點問題,下面解釋
//設置卸載函數,便于函數的退出請求的響應,當有服務停止事件時會自動調用DriverUnLoad函數
driver->DriverUnload = DriverUnload;
return STATUS_SUCCESS;
}
(2)makefile文件與SOURCES文件
為
了能夠在WDK中進行編譯,另外還需要兩個文件,makefile與SOURCES文件,makefile文件可以從WDK的安裝目錄下的src文件夾下
的一些實例中進行拷過來,當然SOURCES文件也可拷過來。不過實例這個文件夾要在安裝WDK時選擇完全安裝,否則可能就看不到了,我裝的是WDK
6001.18002,我拷出一個makefile大家可以參考一下。
#
# DO NOT EDIT THIS FILE!!! Edit .sources. if you want to add a new source
# file to this component. This file merely indirects to the real make file
# that is shared by all the driver components of the Windows NT DDK
#
!INCLUDE $(NTMAKEENV)makefile.def
最主要的是最下面的那個包含文件makefile.def,其實不同版本會有不同的makefile,這個makefile.def中會定義相應的信息。我們手工鞋一下SOURCES文件就可以了。
TARGETNAME = MyDriver
TARGETTYPE = DRIVER
SOURCES = MyDriver.c
解
釋一下,TARGETNAME是要生成的.sys的名字;TARGETTYPE是要生成的驅動的類型,為DRIVER時,生成的擴展名自動為.sys
SOURCES為要編譯的源文件名,有多個時以空格分隔。
注意:TARGETNAME后的名字可以起其他名字,不一定要用MyDrivers。
(3)編譯生成
把上面的3個文件放到一個文件夾下,然后打開WDK編譯器,方式如下:點擊"開始菜單"->Windows Driver Kits->WDK 6001.18002->Build Environments->Windows 7->Launch Windows XP x86 Checked Build Environment。這個是調試版的,下劃線部分選為:Launch Windows 7 x86 Free Build Environment 時,編譯出的版本為發行版的。
在
彈出的編譯窗口中,進入到剛新建的放置已經創建的MyDriver.c、makefile、SOURCES三個文件的目錄下,然后直接輸入build指令
就可以成功了。如果提示失敗的話,上面會有發生錯誤的行號,我在VS2008下能看到,所以建議大家在編寫的時候選擇一個帶行號的編輯器,然后根據提示找到錯
誤行進行修改。當然編譯提示的錯誤行并不一定就是那一行出現的問題,調試過大一點程序的同學可能知道,這個就要看你的調試能力了,特別是很大的項目時,做
驅動開發的同學更要注意藍屏問題,這是做驅動項目的一個致命的問題。當然避免這些異常出現也不是不可能的,比如做代碼保護,也就是對自己寫的代碼信不過
時,或者對于容易出現異常的地方,可以做異常處理,VC調試狀態下的異常拋出就是一個很好的例子。編譯后就會生成.sys文件,本編譯器生成的信息放到了 “.objchk_wxp_x86i386” 目錄下,可以找到MyDriver.sys。
(4)安裝驅動
在
具體解釋如何安裝之前,還是要考慮一些問題的。為了不使我們的系統出現很多垃圾信息,并且保證我們真實系統的穩定性,建議大家在虛擬機上測試,市面上比較
好的虛擬機有VMware,大家自由選擇。我個人是做惡意程序分析平臺,采用的是對開源QEMU進行模塊重構(有興趣的同
志們可以一起來做),感覺系統安全性和穩定性還是很必要的。本測試采用VMWare(不過在做惡意程序測試時,感覺這個虛擬機真的很有局限性)。
在
對驅動安裝時大家往往都會看到.inf安裝配置文件,也不是所有的驅動安裝都需要這個,不過這個inf里面的信息對于惡意程序開發者而言還是有值得學習的
地方的,至少它會告訴你要安裝一個服務應該去注冊哪些信息。我們這里先不討論它的具體內容,由于本實例比較簡單,我們直接采用一個小的服務安裝工具就可以
了。srvinstw.exe可以從網上下載,華軍網站上有這個,下載直接運行。用這個工具安裝服務時要注意三點(可以參考《寒江獨釣》,不好意思,不是
為這本書打廣告,只是感覺介紹的還可以)。
A、在要求輸入要安裝的服務的文件路徑是,要手工輸入,當你選擇瀏覽時它只能選擇.exe,當然這也是這個工具的一個Bug,居然只考慮到服務只有.exe形式的情況。
B、在要求輸入服務名時,可以與原來的服務文件名不一致,而且后面對服務的操作以這里輸入的服務名為準。
C、在選擇安裝類型是選擇手動,以便后面好操作。
其他的按提示進行就好了。
(5)信息查看
簡
單的介紹一下VMWare這個虛擬機,用Ctrl + Alt鍵進行主系統與虛擬系統間的切換,安裝下VMWare
Tools就任意實現鼠標切換了,而且可以支持文件的拖放。正常情況下都不會出現拖動與切換的問題。下載DbgView.exe,大家可以下載下來直接拖到到虛擬機中。打開后,勾選菜單”Capture"下的”Captrue Kernel“,這樣才能捕獲到內核信息。
在
開始菜單中,打開運行,輸入"cmd",打開命令提示符窗口,輸入net start MyDriver,即可看到DbgView窗口中的“Debug
Print”列下打印出了“This is my driver!”;然后輸入net stop MyDriver,DbgView就會打印出“My
driver is unloaded!"。
總結
- 上一篇: ewebeditor 路径
- 下一篇: bzoj1385: [Baltic200