Windows調試工具入門—1
<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
NetRoc
一、 引子
Debugging Tools for Windows是微軟發佈的一套用於軟件調試的工具包(後面如果沒有指明,那麼我會使用WinDbg來作爲這一套調試工具的簡稱)。我第一次接觸是在三年前的一個內核驅動項目,由於進行了IDT中鍵盤鼠標中斷的Hook,使用Softice調試時造成會造成影響,只得使用WinDbg通過串口進行雙機調試。自此之後這個Windows平臺下最爲強大的調試工具一直是開發過程中的必備。這裏我毫不掩飾的說“最強”,可能很多通過逆向工作而接觸調試的朋友不會認同,但是我相信隨着對WinDbg瞭解的加深,以及對這套工具在軟件開發中應用的瞭解,他們也會和我有一樣的觀點。
一直以來,軟件調試技術在軟件開發者中都沒有得到足夠的普及和重視,互聯網上能找到的系統描述的資料也較少。隨着國內軟件行業整體的發展和進步,這些技術慢慢開始得到推廣。2008年出版的有關調試的數據比以往都要多。我有幸拜讀了Raymond的《軟件調試》,以及熊力的《Windows用戶態程序高效排錯》,獲益良多。 這幾年的工作中也積累了一些關於Windows調試工具的知識,希望能夠將這些東西進行一些分享。因此,利用幾個月空閒時間翻譯了WinDbg文檔中上半部調試器配置、使用和命令介紹的內容,同時準備寫一些關於WinDbg調試工具的初級文章。希望能夠爲對調試技術感興趣而又苦於沒有資料的朋友提供一些幫助。
特別感謝我的前同事小喂。雖然他第一條串口線還是我焊的,但是他對於WinDbg的使用和了解程度很快就超過了我。在相當長時間的共事和討論中,讓我學到了很多。
二、 Windows調試工具的簡介和組成
WinDbg是專門爲Windows NT系列操作系統設計的調試器,最早是作爲Windows NT 3.1的工具發佈的。其後也一直跟隨NT操作系統的發展而不斷髮展完善。如果用一句話來概括,可以說WinDbg是爲了軟件開發而存在的調試工具。軟件包中的調試器和小工具的各種功能都是爲了配合軟件的開發而設計的,並且覆蓋到了Windows平臺下各種不同類型項目的調試(傳統的SDK或MFC應用程序、.NET平臺應用、COM應用、軟硬件驅動程序等等)。
Windows調試工具包中的調試器包括WinDbg、KD、CDB和NTSD。其中, KD用於內核調試;CDB和NTSD用於用戶態調試,在功能和使用上幾乎完全一致;WinDbg是內核調試器和用戶態調試器的綜合體,由於功能完善並且具有圖形界面,所以是最常用的工具。它們能夠在x86、Itanium和x64機器上的所有NT平臺操作系統中運行。
另外,工具包中還有一些小工具,下面是常用的幾個:
l KDbgCtrl:用於控制和配置內核調試的一些參數。例如是否只有當發生異常時纔會啓用內核調試、設置DbgPrint緩衝區大小、如何處理用戶模式異常等等。
l ADPlus:這是一個VB腳本,可以爲一個或多個進程自動創建內存dump。
l SymStore:用於創建符號存儲。當需要創建自己的符號存儲時就要用到它了。
l SymProxy:用於在網絡中創建單獨的HTTP符號服務器,以供所有調試器使用。該工具特別適合企業級應用的環境,可以將多個符號存儲通過單一的接入點提供使用。
l DbgSrv、KdSrv、Remote.exe:用於遠程調試。
l GFlags:用於編輯Global Flags。
l UMDH:用於對用戶模式堆分配的情況進行轉儲和分析。
l USBView:這是WinDbg 6.10.3版本才加入到軟件包中的工具,可以查看當前連接到系統中的USB設備信息。
另外,Application Verifier雖然沒有包含在軟件包中,但是也是一個非常強大的工具。可以對程序運行時的很多狀態進行監控,以發現一些普通調試難以找到的錯誤。下面是Application Verifier配置界面的一個截圖:
<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" />
Application Verifier可以在這個頁面下載:http://go.microsoft.com/fwlink/?linkid=108353
三、 Windows調試器和其他熟知的調試器比較
可能很多已經習慣使用SoftICE、OllyDbg、IDE調試器的朋友會提出這樣的疑問:在這麼多調試器中,爲什麼要選擇WinDbg?它究竟有什麼特點?
設想一下下面幾個場景:
l 公司的軟件針對企業級用戶,該客戶在地球另一半的美國。有一天客戶抱怨了一個BUG,但是從抓取的dump又沒辦法看出個所以然,想進行動態調試查找原因。公司預算有限,不能讓你過去出差順便旅遊、對方公司有防火牆,不允許外部連接,等等等等。。。怎麼辦?
l 項目規模很大,涉及到的模塊多,版本也多,並且是由不同部門開發的。這些部門可能遍佈五湖四海。如何在調試其中某個模塊時,能夠快速獲得它的符號和源文件,而不用每次都從一大堆不同版本的文件中辛苦找尋?調試到某個階段,突然發現這不是自己的模塊出現問題,如何快速知道這個問題應該找誰解決?項目某些重要模塊有保密需要,如何控制調試人員訪問符號和源文件的權限?
l 驅動程序怎麼才能源碼調試?SoftICE不支持新系統,我要在Vista上調試怎麼辦?
l 軟件中包含一個Windows服務組件,但是每次還沒有登陸到桌面之前就崩潰了,怎麼進行動態調試?
l 我想調試Explorer,調試IE,調試CSRSS,調試……,但是調試器一附加上去,系統就會出問題。怎麼辦?
l 公司發佈的軟件,有用戶反饋和XXX安全軟件衝突老是造成系統崩潰,但是搭建環境之後卻又沒有辦法重現;對方是個普通用戶,鼠標都抓得不太穩。用戶很火大,鬧着要抓個老虎到公司來找你上司做俯臥撐,後果很嚴重,怎麼辦?
在現實環境中,有很多複雜的調試場景,我們需要專業級的調試器來解決這些問題。而WinDbg恰恰提供了這種商業軟件環境下的專業級軟件調試功能,它和其他很多我們熟知的調試器的區別也在於此。
我們將WinDbg和其他調試器分作內核調試器和用戶態調試器兩類來進行比較。
內核調試方面:
|
WinDbg |
SoftICE |
原理 |
Windows操作系統內置調試支持 |
Hook中斷,接管系統 |
系統和平臺支持 |
x86、Itanium和x64機器上的所有NT平臺操作系統 |
x86,由於已停止更新,新版本操作系統中支持不佳,老系統中也常常遇到兼容性問題 |
符號和源碼支持 |
完美支持符號調試和源碼調試,可直接使用微軟公共符號 |
支持符號調試和源碼調試,但是需要先轉換符號格式 |
遠程調試 |
通過和遠程工具、轉發器的配合,實現各種靈活的遠程調試方式,以支持不同的網絡環境 |
通過Virtual SoftICE支持基於網絡的遠程調試 |
硬件需求 |
通過串口、1394、USB 2.0接口的雙機調試;通過Pipe連接的虛擬機調試;或者功能有諸多限制的本地內核調試 |
單機或者通過Virtual SoftICE的雙機調試 |
用戶界面 |
由於是雙機調試,調試器只是主控機上運行的一個普通軟件。擁有GUI界面,可以同時進行其他應用。 |
單機調試時完全接管系統,字符界面,操作不是很方便。 |
擴展性 |
支持腳本和插件,並且軟件包本身提供了大量非常有用的插件 |
支持插件 |
由於SoftICE已經停止更新,WinDbg可以說是現在Windows平臺上唯一好用的進行內核調試的工具,並且隨着新版本的不斷推出,不斷地添加對新版操作系統的支持以及完善功能。強大的符號支持,方便的源碼調試,使得內核級調試能夠事半功倍。
用戶態調試方面:
|
Windows調試工具包 |
OllyDbg |
Visual Studio調試器 |
原理 |
Windows的用戶程序調試支持 |
Windows的用戶程序調試支持 |
Windows的用戶程序調試支持 |
系統和平臺支持 |
主要基於NT系統,9x內核下支持不佳並且需要安裝附加模塊 |
主要支持NT系統,9x下也可以使用 |
新版本的VisualStudio不支持在9x系統下安裝。VC6之前可以在9x下調試 |
符號和源碼支持 |
完美支持符號調試和源碼調試,可直接使用微軟公共符號 |
支持符號調試和源碼調試 |
支持。VS2008開始可以直接使用微軟公共符號 |
遠程調試 |
通過和遠程工具、轉發器的配合,實現各種靈活的遠程調試方式,以支持不同的網絡環境 |
不支持 |
較新版本Visual Studio中支持 |
無源碼調試 |
反彙編分析能力較弱,GUI界面偏弱,無源碼時調試比較困難 |
強大的代碼分析能力,無符號和源碼時也能很好的進行調試 |
無源碼調試的支持很弱,使用不便 |
用戶界面 |
GUI界面不是很豐富,大量操作需要通過命令 |
GUI界面強大,能夠實現大多數調試操作 |
介於WinDbg和OllyDbg之間。 |
擴展性 |
支持腳本和插件,並且軟件包本身提供了大量非常有用的插件 |
支持腳本和插件,有大量可用的資源 |
支持插件擴展 |
Dump文件調試 |
支持,分析功能強大 |
不支持 |
支持,但是不夠強大 |
.NET調試 |
通過SOS.dll支持,進行高級調試比較方便 |
不能直接支持 |
功能強大易用,絕大多數情況下都能解決問題 |
由於WinDbg功能相當複雜,有很多方面並不能一一比較,例如非侵入式調試、通過WinDbg控制CDB和NTSD來調試系統服務、創建和分析Dump文件等等。
總體來說,WinDbg更適合作爲軟件項目開發和維護過程中的調試工具使用,而OllyDbg更適合逆向工程。
四、 何時使用Windows調試工具
根據我個人對WinDbg的使用經驗來說,它更適合作爲開發維護的輔助工具來使用。
如果要進行用戶態的逆向工程,推薦使用OllyDbg、IDA這些擁有強大彙編程序分析能力的工具。
WinDbg更適用於以下這些場合:
l 商業軟件的Debug和客戶支持
l 內核驅動的調試,以及對驅動進行逆向工程時進行動態調試
l 研究Windows本身的內核或者軟件
l 疑難BUG的調試,如死鎖、COM調用、資源泄露、堆棧或者堆溢出
l 以性能優化爲目的的調試
對調試目標基本不造成影響的非侵入式調試