這幾天上網(wǎng)查了一些關(guān)于WINDBG的資料,發(fā)現(xiàn)很多朋友在尋找關(guān)于WINDBG的教程.
(呵呵,我也在尋找有關(guān)于此的一些材料)
本來是一想寫關(guān)于sr.sys的分析的,不過覺得始終不妥,一句老話,授人以魚不
如授人以漁,所以這篇文章以sr.sys分析作為示例,不過我們的重點卻是要放在
WINDBG的使用上.
首先來介紹一下搭建的環(huán)境:
WINDBG:Windows Debugger Version 6.2.0013.1
Vmware-workstation-4.5
Target Computer:winxp sp1 free
Host Computer:win2003
關(guān)于VM和WINDBG的基本配置請參考相關(guān)的文檔.(在這里給各位一篇不錯的文章,
就是jiurl老大寫的<<利用VM使用windbg>>)
好了,廢話少說,讓我們整點干的:
既然我們要分析的是sr.sys,當(dāng)然我們先要看的就是目標(biāo)機(jī)加載的驅(qū)動程序的位置了,
sr.sys是XP系統(tǒng)系統(tǒng)還原的主體部分,它是建立在NTFS文件分區(qū)格式下的一個驅(qū)動,
說白了sr.sys其實就是ntfs.sys的filter driver.
kd>!drivers
Base Code Size Data Size Image Name Creation Time
……
fc3ed000 de80 ( 56 k) 2c00 ( 11 k) sr.sys Thu Aug 29 16:17:56 2002
……
我查找了與sr.sys相關(guān)的資料,不過沒找到什么有用的東西,最有用的可能就是MSDN里面
關(guān)于WINXP SYSTEM RESTORE的相關(guān)介紹了,不過實在是沒有什么幫助,看來只有自己動手
豐衣足食了,首先我們先來大概的分析一下代碼,然后由此擴(kuò)展開來.
Kd>u fc3ed000
sr!SrMakeContextUninteresting <PERF> (sr+0x0):
fc3ed000 4d dec ebp
sr!SrMakeContextUninteresting <PERF> (sr+0x1):
fc3ed001 5a pop edx
sr!SrMakeContextUninteresting <PERF> (sr+0x2):
fc3ed002 90 nop
sr!SrMakeContextUninteresting <PERF> (sr+0x3):
fc3ed003 0003 add [ebx],al
sr!SrMakeContextUninteresting <PERF> (sr+0x5):
fc3ed005 0000 add [eax],al
sr!SrMakeContextUninteresting <PERF> (sr+0x7):
fc3ed007 000400 add [eax+eax],al
sr!SrMakeContextUninteresting <PERF> (sr+0xa):
fc3ed00a 0000 add [eax],al
sr!SrMakeContextUninteresting <PERF> (sr+0xc):
fc3ed00c ffff ???
kd>u
……
我們向后翻查,找到下面的內(nèi)容:
kd>
sr!DriverEntry+0x12:
fc3fbcd6 59 pop ecx
fc3fbcd7 33c0 xor eax,eax
fc3fbcd9 8b3d40f03efc mov edi,[sr!global (fc3ef040)]
fc3fbcdf f3ab rep stosd
fc3fbce1 a140f03efc mov eax,[sr!global (fc3ef040)]
fc3fbce6 c7005372474c mov dword ptr [eax],0x4c477253
fc3fbcec 8b5d08 mov ebx,[ebp+0x8]
fc3fbcef a140f03efc mov eax,[sr!global (fc3ef040)]
不好意思,每個人都有自己的分析習(xí)慣,而我喜歡從開始執(zhí)行的部分分析,我感覺自這樣
分析比較清晰,鑒于篇幅,具體的代碼分析我不在這里列出(具體的代碼分析請參看我的
另一篇文章<<winxp system restore 全面解析>>).
一點建議:上面的代碼相當(dāng)于靜態(tài)反匯編,不過我建議如果是靜態(tài)反匯編的話,我們不如
直接用IDA,我們還是來看看動態(tài)反匯編的結(jié)果,看看里面的具體變化,主要是堆棧,
寄存器,各個變量等的值.
重新啟動我們的target computer,在連接上的那一刻,按CTRL+Break斷下來,然后下斷點:
kd>bp 0xfc3fbcc4
kb>g
注意要及時按下CTRL+Break,不要過了,因為sr.sys是系統(tǒng)驅(qū)動,在ntldr加載驅(qū)動時會被加載,
所以等系統(tǒng)起來之后就斷不著了(我就曾經(jīng)錯過了好幾次機(jī)會)
好了,終于斷到了,我們來看看:
kd> bp 0xfc3fbcc4
kd> g
Breakpoint 0 hit
sr!DriverEntry:
fc3fbcc4 6a54 push 0x54
單步執(zhí)行:
kd> p
sr!DriverEntry+0x2:
fc3fbcc6 68c8de3efc push 0xfc3edec8
好了,剩下的就要看看我們的匯編功底了(黨和國家考驗我們的時候來到了,呵呵)
至于代碼分析我就不在這里過多的敘述了,因為這不屬于WINDBG使用的范圍.
其實用了這么長時間的WINDBG,主要就是用其做動態(tài)反匯編的工作,之所以我不選擇
SOFTICE有兩個原因:第一,softice 使我的系統(tǒng)變的極不穩(wěn)定,很多奇怪的問題搞的
我措手不及;第二,在使用softice的過程中,有一些命令會有誤差,舉一個具體的例子
來說,在SoftIce中使用irp命令時,所查看的寄存器并不一定就是irp,只要查看的
寄存器有合法的內(nèi)容,那么irp命令就嘗試去匹配,所以在使用irp命令時要注意,
可以利用windbg的!irp /address/ 1來查看,windbg首先會檢驗irp的sign,
所以基本上不會有誤差.
雖然softice在操作比windbg要好很多,可是我可不想因為一些誤差走錯路.
好了讓我們回到正題,在使用windbg的過程中,我經(jīng)常使用的命令如下:
.reboot 重新啟動Target computer
dd 顯示寄存器或者是內(nèi)存地址的內(nèi)容
dt 其實這個命令的使用效率并不高,我把它列出來的原因是因為有一個關(guān)于
它的一個竅門,比如說我想查看一個數(shù)據(jù)結(jié)構(gòu)的成員,我可以用如下的命令:
dt –v –r ntdll!_FIEL_OBJECT,我們可以使用該命令查看大部分的數(shù)據(jù)
結(jié)構(gòu),在windbg列出的結(jié)構(gòu)中包括了各個數(shù)據(jù)成員之間的偏移,所以我很喜歡
該命令,即便我知道一個數(shù)據(jù)結(jié)構(gòu)的成員,我也會使用該命令打印出來,這樣
更便于理解匯編語言中對數(shù)據(jù)結(jié)構(gòu)的操作.
!devobj 使用deviceObject結(jié)構(gòu)的內(nèi)容.
該命令的使用效率并不是很高(起碼我?guī)缀鯖]有使用過),不過在調(diào)試驅(qū)動時會
起到關(guān)鍵的作用.
!irp 顯示irp數(shù)據(jù)結(jié)構(gòu)中的內(nèi)容.
!irp eax 1
在我的理解中,驅(qū)動程序就是對irp的處理,所以我經(jīng)常使用該命令查看參數(shù)和irp中的
數(shù)據(jù)成員,以便更好的理解過程.
bp 下斷點.
bc 清除斷點.
bd 暫時禁止斷點.
be 允許執(zhí)行被禁止的斷點.
!drvobj 顯示driverObject數(shù)據(jù)結(jié)構(gòu)中的內(nèi)容,同樣該命令在調(diào)式驅(qū)動程序時可能會用到.
雖然使用這十個命令,但是對我來說已經(jīng)是受用不盡了,其實在這些命令中,只有4個是我最常用的:
dd、dt、bp、!irp
還有一點,是我沒有提到的:
比如說我們想查看該驅(qū)動程序在哪個進(jìn)程中運行,可以做如下的操作:
kd>!thread //查看當(dāng)前的線程
在列出的各項數(shù)據(jù)中,看到PID了嗎?
kd>!process [pid] 0
在其中列出的Image就是當(dāng)前的進(jìn)程了.
下面說一下用windbg 調(diào)式services
想要調(diào)式services,就必須在UserMode下運行windbg,即不用打開Target computer.
首先,安裝和啟動我們的服務(wù);
其次,啟動windbg;
選擇File->Attach to a Process菜單;
在出現(xiàn)的Attach to Process對話框中雙擊我們想要調(diào)式的服務(wù);
OK,下斷點.
現(xiàn)在我們就可以調(diào)試了,不過要注意調(diào)式的完整性,因為是本機(jī)調(diào)試,所以如果我們隨意關(guān)閉windbg的話
很可能會引起一些其他的后果,比如死機(jī),重起等.