![安全進(jìn)階windows內(nèi)核windbg調(diào)試指南_第1頁](http://file4.renrendoc.com/view/c9785f1aa1490fcae2075ed5a0dad44a/c9785f1aa1490fcae2075ed5a0dad44a1.gif)
![安全進(jìn)階windows內(nèi)核windbg調(diào)試指南_第2頁](http://file4.renrendoc.com/view/c9785f1aa1490fcae2075ed5a0dad44a/c9785f1aa1490fcae2075ed5a0dad44a2.gif)
![安全進(jìn)階windows內(nèi)核windbg調(diào)試指南_第3頁](http://file4.renrendoc.com/view/c9785f1aa1490fcae2075ed5a0dad44a/c9785f1aa1490fcae2075ed5a0dad44a3.gif)
![安全進(jìn)階windows內(nèi)核windbg調(diào)試指南_第4頁](http://file4.renrendoc.com/view/c9785f1aa1490fcae2075ed5a0dad44a/c9785f1aa1490fcae2075ed5a0dad44a4.gif)
![安全進(jìn)階windows內(nèi)核windbg調(diào)試指南_第5頁](http://file4.renrendoc.com/view/c9785f1aa1490fcae2075ed5a0dad44a/c9785f1aa1490fcae2075ed5a0dad44a5.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
WINDOWS調(diào)試工具很強(qiáng)大,但是學(xué)習(xí)使用它們并不容易。特別對(duì)于驅(qū)動(dòng)開發(fā)者使用的WinDbg和KD這兩個(gè)內(nèi)核調(diào)試器(CDB和NTSD是用戶態(tài)調(diào)試器)。本的目標(biāo)是給予一個(gè)已經(jīng)有其他調(diào)試工具使用經(jīng)驗(yàn)的開發(fā)者足夠信息,使其能通過參考WINDOWS調(diào)試工具的幫助文件進(jìn)行內(nèi)核調(diào)試。本文將假定開發(fā)者熟悉一般WINDOWS操作系統(tǒng)和進(jìn)程的建立過程。本文的重點(diǎn)是集成內(nèi)核模式和用戶態(tài)模式的圖形化調(diào)試器WinDbg。KD在和自動(dòng)化調(diào)試中更有用,并且在資深程序員中擁有一定地位,但是本將集中討論WinDbg,只會(huì)偶爾提到KD。WindowsNT4.0,Windows2000X86架構(gòu)。對(duì)于64位平臺(tái),將不會(huì)特別提及??傊?,本由簡(jiǎn)單介紹調(diào)試器的安裝開始,大體分成2部分,基礎(chǔ)知識(shí)和選擇技術(shù)。基礎(chǔ)知識(shí)包括基本調(diào)試命令和常用調(diào)試命令。選擇技術(shù)是其令和在很多情況下都有用的方法。后者并不是象deadlocks,memorycorruption或者resourceleaks的唯一方法。第一次閱讀本,你可能會(huì)跳過選擇技術(shù)。你可以停止閱讀本而轉(zhuǎn)向微軟調(diào)試器討論組,也可以通過調(diào)試器的反饋e-mai解決的取得版的調(diào)試器,并且有規(guī)律的更新它。這里并沒有夸大版的價(jià)值,因?yàn)檎{(diào)試器會(huì)經(jīng)常改進(jìn)和修 調(diào)試器有使用null-modemcable或者1394cable連接兩臺(tái)電腦的安裝方案。本不分析單操作系統(tǒng)的本地調(diào)試(即在調(diào)試器運(yùn)行的電腦上進(jìn)行分析)。3臺(tái)電腦(目標(biāo)電腦,調(diào)試服務(wù)器,調(diào)試客戶端)在主機(jī)調(diào)試軟件(WinDbg或者KD)和目標(biāo)操作系統(tǒng)之間,是一個(gè)協(xié)同處理的調(diào)試過程。每一部分都必須做些什么。更明確地,WinDbg不是作為一個(gè)“管理操作系統(tǒng)”,象客戶和一個(gè)真正操作系統(tǒng)那樣運(yùn)行目標(biāo)。WinDbg是一個(gè)調(diào)試軟件,象目標(biāo)操作系統(tǒng)的合作伙伴那樣知道它在調(diào)試過程中的角色。在這種關(guān)系中,WinDbg從目標(biāo)接收信息,并且向目標(biāo)發(fā)送信息。這是一種有效的通信機(jī)制。serialprotocolnull-modemcableCOM端口連接主機(jī)和目標(biāo)機(jī)器。另一個(gè)可供選擇的通信機(jī)制是1394。在調(diào)試工具的幫助文件中的“ConfiguringSoftwareontheTargetComputer.”有關(guān)于它們的描述。假設(shè)你的主機(jī)使用WIN2K或以上的版本。主機(jī)的操作系統(tǒng)可以不同于目標(biāo)電腦的操作系統(tǒng)。主機(jī)可以在你平常進(jìn)行開發(fā),或者故障診斷的地方。它應(yīng)該與網(wǎng)絡(luò)連接,如果你希望symbol和source服務(wù)器(請(qǐng)看symbols和source)。 到WINDOWS調(diào)試工具的安 。這是windbg.exe和FileKernelDebug1394channel1KernelDebuggingOK。現(xiàn)在你已經(jīng)準(zhǔn)備好在主機(jī)和目標(biāo)之間建立連接。在目標(biāo)機(jī)器以其中一個(gè)調(diào)試啟動(dòng)WINDOWS。立即CTRL+BREAK你需要明白一件細(xì)小卻至關(guān)重要的事:在命令窗口的底部顯示“kd>”WinDbg已經(jīng)準(zhǔn)別好WinDbg將不能處理命令,盡管你輸入的任何命令都將會(huì)被保存在緩沖區(qū)域并盡可能快的運(yùn)行。你必須等待“kd>”WinDbg已經(jīng)作好響應(yīng)的準(zhǔn)備。因?yàn)橛袝r(shí)它正在忙于做某些你看不見的事(例如從目標(biāo)取得信息,該信息可能很龐大)。缺少“kd>”WinDbg處于繁忙狀態(tài)的唯一線索。另一個(gè)可能是WinDbg試圖解析symbol并且時(shí)間超過了你的預(yù)期。不幸地,WinDbg偶爾會(huì)等待一個(gè)不會(huì)響應(yīng)的目標(biāo)連接(可能boot.ini配置得不好,或者選擇了錯(cuò)誤的選項(xiàng))CTRL+BREAKWinDbg重首先確認(rèn)WinDbg能找到你感模塊的symbols。Symbols一個(gè)二進(jìn)制命令與之間的聯(lián)系和什么變量正在被轉(zhuǎn)移。換句話說,就是Symbols表。如果你在建立模塊的地方,那么你將擁有有效的symbols和source文件。但是如果你需要單步調(diào)試其他很早以前建立代碼呢?或者,在那種情況下,如明確的設(shè)置symbols所在的地方,使用.sympath命令。在命令窗口斷(CTRL-BREAK)然后輸 以便告訴WinDbg在公開的symbols服務(wù)器上查找symbols。讓W(xué)inDbg使用該服務(wù)以及在本地保存一份已的symbols。例如,在D:\DebugSymbols,你應(yīng)該這么做:.sympath symbolssymbols時(shí)遇到一些故障。在這個(gè)情況下,使用!symnoisy命令以獲得關(guān)于WinDbg嘗試獲取symbols的信息。然后使用!lmi查看WinDbg知道多少關(guān)于ntoskrnl的信息。然后嘗試取得ntoskrnl的symbols,使用.reload/f。因而:kd>!symnoisymode-symbolpromptskd>!lmiLoadedModuleInfo:Module:ntoskrnlBaseAddress:ImageName:ntoskrnl.exeMachineType:332(I386)TimeStamp:3e80048bMonMar2423:26:032003Size:4d8000CheckSum:3f6f03Characteristics:10eDebugDataDirs:Type VA 25, e600RSDS-GUID:0xd1bb,0x47a6,0xa6,0xd5,0x38,0x35,0x38,0xc2,0xb3,0x1a)Age:1,Pdb:ntoskrnl.pdbImageType:MEMORY -Imagereadsuccessfullyfromloadedmemory.SymbolType:EXPORT -PDBnotfoundLoadReport:export在WINDOWS調(diào)試工具幫助文件中,有關(guān)于這里使用令及其語法的描述輸出symbols通常很大。WINDOWS調(diào)試工具包括一個(gè)symbol服務(wù)器,以便連接到的網(wǎng)絡(luò)服務(wù)器保存這些公開的symbol。添加這些到你的symbol路徑,然后加載它們:kd> Symbolsearchpathis:SRV*d:\DebugSymbols kd>.reload/fnt SYMSRV:ntoskrnl.pdbfrom\\symbols\symbols: bytescopiedDBGHELP:nt-publicsymbols kd>!lmiLoadedModuleInfo:Module:ntoskrnlBaseAddress:ImageName:ntoskrnl.exeMachineType:332(I386)TimeStamp:3e80048bMonMar2423:26:032003Size:4d8000CheckSum:3f6f03Characteristics:10eDebugDataDirs:Type VA 25, e600RSDS-GUID:0xd1bb,0x47a6,0xa6,0xd5,0x38,0x35,0x38,0xc2,0xb3,0x1a)Age:1,Pdb:ntoskrnl.pdbImageType: -ImagereadsuccessfullyfromloadedSymbolType:PDB -Symbolsloadedsuccessfullyfromsymbol Compiler:C-frontend[13.10bld2179]-backend[13.10LoadReport:public symbols只會(huì)給你一些信息,而不會(huì)提供源代碼。在最簡(jiǎn)單的情況下,在它們被建立的時(shí)候,source文件便在同一個(gè)地方(2symbol文件)。但是在大多數(shù)情況下,你不能在那里找到它.srcpath source.srcpath如果你曾經(jīng)在獲取source文件時(shí)遇到麻煩,使用oisy1以取得關(guān)于調(diào)試器查找它們的信息workspace中。所以你應(yīng)該使FileSaveworkspacekernel1394Win2003。在這之后,你希workspaceWinDbg:windbg-Wkernel1394Win2003-k–Wworkspace,而–k給出通信方式(WINDOWS調(diào)試工具幫助文件中的Command-LineOptions”)。注意:在WinDbg或者KD中,你應(yīng)該區(qū)分命令行可選項(xiàng)的大小寫workspaceWinDbg,例如,使用1394連接:cd/d"d:\ProgramFiles\DebuggingToolsforWindows"startwindbg.exe-y /download/symbols-W第一行將切換到WINDOWS調(diào)試工具的安 WinDbgsymbo路徑(-y)workspace-W)。使用示例驅(qū)動(dòng)IoCtl練習(xí),這將會(huì)幫助你熟悉WinDbg。你能在WINDDK和它的后續(xù)產(chǎn)品,WDK中找到。安裝它,你便能在src\general\Ioctl子 下找到該驅(qū)動(dòng)。IoCtl的優(yōu)點(diǎn)在于它是示例,而且是一個(gè)“l(fā)egacy”驅(qū)動(dòng),由服務(wù)管理器(SCM)加載,而不是即插即用的一部分(這里并不關(guān)心PnP的輸入和輸出)。你應(yīng)該建立用戶態(tài)程序(ioctlapp.exe),并者被加載之后建立內(nèi)核態(tài)驅(qū)動(dòng)程序(sioctl.sys)這里有些重要的事需要明白。在優(yōu)化代碼方面,建立程序的處理十分靈巧,優(yōu)化會(huì)導(dǎo)致代碼移動(dòng)(當(dāng)然,原邏輯會(huì)被保留),并且將一些變量單獨(dú)保存在寄存器中。為了確保更簡(jiǎn)單的調(diào)試體驗(yàn),你應(yīng)該在建立窗(這是“Ohd”而不是“zero有時(shí)上述的情況會(huì)引起內(nèi)部函數(shù)的一些問題,例如memcmp請(qǐng)明白優(yōu)化對(duì)于生成正式版產(chǎn)品來說,并不是一個(gè)好選擇。使用上述的指令,你將不能建立或者測(cè) 優(yōu)化的版本來說,是不錯(cuò)的練習(xí)。一旦你熟悉代碼,排除簡(jiǎn)單的錯(cuò)誤,在IoCtl的DriverEntry設(shè)置斷點(diǎn)。在啟動(dòng)驅(qū)動(dòng)之前,中斷在WinDbg令窗口,輸入bubu(“BreakpointUnresolved”)會(huì)探測(cè)“DriverEntry”F5(g,“接下來,ioctlapp.exe和sioctl.sys到目標(biāo)系統(tǒng),例如C:\Temp\IOCTL,以管理員權(quán)限登陸 下。(你不需要在WinDbg中將此路徑設(shè)置為如圖,程序停在斷點(diǎn)之后,!lmiWinDbgDDKsymbols。時(shí)間信息象你期望的一樣,本地symbol文件也符合你的要求。(按鍵順序‘a(chǎn)lt-Keypad*’―不用按單引號(hào)―將會(huì)把窗口置前斷點(diǎn)被設(shè)置,即運(yùn)行停止的地方會(huì)以粉紅色標(biāo)記(WINDOWS調(diào)試工具幫助文件把它稱為紫色)。當(dāng)運(yùn)行IoCreateDevice(運(yùn)行控制描述如何熟練運(yùn)用):命令來自幾個(gè)系列:簡(jiǎn)單的(未修的),一些從句號(hào)開始,一些從驚嘆號(hào)!開始。WINDOW調(diào)試工具幫助件將它們別描述為cmmads, madsadextesincmmad。以現(xiàn)在的效果來,這些系非常接。WinDbgCTRL-ALT-K在下次啟動(dòng)時(shí),在ntoskrnl加載之后的一小段時(shí)間,這時(shí)所有驅(qū)動(dòng)還沒有被加載,操作系統(tǒng)將會(huì)掛起,而WinDbg將會(huì)取得控制權(quán)。在系統(tǒng)引導(dǎo)時(shí)間,你可能會(huì)希望為驅(qū)動(dòng)程序定義斷點(diǎn),這就bp(“Breakpoint”)bpMyDriver!xyzbpf89adeaa第一行,這個(gè)斷點(diǎn)設(shè)在模塊中的一個(gè)名字(<mde>!<ame>);第二行,它被設(shè)置在一個(gè)給出的地址。當(dāng)運(yùn)行到其中一個(gè)斷點(diǎn)時(shí),操作系統(tǒng)就會(huì)掛起,并且把控制權(quán)交給WiDbg。(你可以在“尋找名字”看)注意:第一個(gè)命令的語法假定操作系統(tǒng)已經(jīng)加載該模塊,以及在symbol文件或者外部名定義有足夠可用信息關(guān)于識(shí)別xyz。如果不能在模塊中找到xyz,調(diào)試器會(huì)這么告訴你這些。說到驅(qū)動(dòng)程序沒有被加載,你最初的哪個(gè)斷點(diǎn),使用bu(見上述開始調(diào)試示例驅(qū)動(dòng))設(shè)置的是一個(gè)“可延遲的”斷點(diǎn)。Bu命令的參數(shù)是一個(gè)模塊及它里面的名字,例如:buSioctlDeviceControl是一個(gè)點(diǎn),或者其他在模塊sioctl.sys中的名字。這個(gè)形式假定當(dāng)模塊SioctlDeviceControl以便斷點(diǎn)能夠設(shè)置。(如果模塊已經(jīng)加載名字被找到,那么斷點(diǎn)將會(huì)立即被設(shè)置)。如果操作系統(tǒng)找不到SioctlDeviceControl,調(diào)試器會(huì)提示,SioctlDeviceControl處掛起。mdles!mesmdles!mes(這不會(huì)影響明確地址的斷點(diǎn))。然而,延遲斷點(diǎn)的另外一個(gè)特性使得即使關(guān)聯(lián)模塊被卸載,它仍然會(huì)被保留。sourcesioctl.sysDriverEntry,,你能向下滾動(dòng)窗口到你希望停止地方,將光標(biāo)移動(dòng)到該行代碼,按下F9:bl(“BreakpointList”)kd>e[d:\winddk\3790\src\general\ioctl\sys\sioctl.c@0001(0001)e[d:\winddk\3790\src\general\ioctl\sys\sioctl.c@0001(0001)假設(shè)你希望臨時(shí)停止使用某個(gè)斷點(diǎn)。bd(“DisableBreakpoint”)將會(huì)完成它。你只需指定斷點(diǎn)kd>bd1kd>ble[d:\winddk\3790\src\general\ioctl\sys\sioctl.c@0001(0001)d[d:\winddk\3790\src\general\ioctl\sys\sioctl.c@0001(0001)bc1(“ClearBreakpoint”)。現(xiàn)在該斷點(diǎn)將會(huì)從斷點(diǎn)列表bpSIoctl!SioctlDeviceControl+0x103"j(@@(Irp)=0xffb5c4f8)'';Irp=0xFFB5C4F8(在雙引號(hào)標(biāo)記中);在該項(xiàng)目中,jxecteIFL”)命令是一個(gè)條件操作。JTRFLE項(xiàng)目(在單引號(hào)標(biāo)記中)如上述樣,RE項(xiàng)目(第一)為空,以斷點(diǎn)激活和符合TREWiDbgFE的條件出現(xiàn),由于使用了gbpSIoctl!SioctlDeviceControl+0x103"j(@@(Irp)=0xffb5c4f8)'.echoFoundtheinterestingIRP';'.echoSkipanIRPofnointerest;g'"TRUE項(xiàng)目給出信息并停止。FALSE項(xiàng)目給出信息并繼續(xù)(這個(gè)信息很有用,WinDbg計(jì)算出條件為FALSE,并且默默地繼續(xù))。有時(shí)要注意:下面斷點(diǎn),EAX被檢測(cè)(你能在寄存器中找到關(guān)于它們的處理方法),不會(huì)象你想bpSIoctl!SioctlDeviceControl+0x103"j(@eax=0xffb5c4f8)'.echoHere!';'.echoSkip;g'"原因是可能會(huì)將寄存器的值擴(kuò)充到64位再計(jì)算,例如,擴(kuò)充到0xFFFFFFFF`FFB5C4F8,這將不會(huì)與0x `FFB5C4F8匹配。這導(dǎo)致只有32位的最為1和一些其他條件(例如,一個(gè)32位寄存器)才適用。在WINDOWS調(diào)試工具幫助文件中的“SignExtension”有更詳盡的資料(也“SettingaConditionalBreakpoint”)。斷點(diǎn)可能包含一些條件式,附帶或不附帶條件操作。其中一個(gè)條件是激發(fā)“one-shot”活一次(激活之后便清除)。假如你只對(duì)第一次激活感,對(duì)于那些使用頻繁的代碼,這很便利bp/1bp/p0x bp/t0xff234000它們分別代表,僅當(dāng)進(jìn)程塊(EPROCESS)在0x 塊(ETHREAD)在0xFF234000時(shí)才在指定地方停止。bp/1/C4/p baw4IRx+x4處即它的Itats.Ifrmtn成IRP中Itats.Imation的這4據(jù)斷點(diǎn)(們數(shù)據(jù))或者處理器斷點(diǎn)(因?yàn)閭冇商幚韴?zhí)行,不是調(diào)試器自己)。表達(dá)式:MASM調(diào)試器有兩種評(píng)價(jià)表達(dá)式的方法,參考“MASM”(MacroAssembler)和“C++”。WINDOWS調(diào)試工具幫助文件中的“MASMExpressionsvs.CMASMC++表達(dá)式中,變量中的數(shù)值是它的你能使用.expr改變默認(rèn)類型(WINDOWS調(diào)試工具幫助文件)C++ 相當(dāng)棘手,你應(yīng)該參考WINDOWS調(diào)試工具幫助文件中的“EvaluatingExpressions”?,F(xiàn)在,Sioctl!SioctlDeviceControl+0x103dv查看一個(gè)已知變量(dv命kd>dvIrp=該響應(yīng)的意思是,Irp變量包含0xFF70FBC0。地,dv解釋C++語法中的參數(shù)。該響應(yīng)基于變量?jī)?nèi)kd>??struct_IRP*??C++為基礎(chǔ)(詳見??命令)MASM類型的賦值,嘗試?(?命令kd>?Evaluateexpression: =Irp0XF795BC48dd(dd命令)顯示內(nèi)存數(shù)據(jù),確認(rèn)該變量真的包含數(shù)據(jù)0xFF70FBC0。kd>ddf795bc48l1f795bc48kd>dd ff70fbd0ff70fbd0 ff70fc10ff73f4d8ff70fc20ff70fc30ffb05b90 cIRPdt顯示(dt命令),TypeSizekd>dtLocalvar@0xf795bc48Type_IRP*+0x000 :+0x002 :+0x004 :+0x008 :+0x00c +0x010ThreadListEntry:_LIST_ENTRY[0xff70fbd0-0xff70fbd0+0x018 :+0x020 :1+0x021PendingReturned:0+0x022 :1+0x023CurrentLocation:1+0x024 :0+0x025 :0+0x026 :0+0x027AllocationFlags:0x4+0x028 :+0x02c :+0x030 +0x038 :+0x03c :+0x040 C++MASM表達(dá)式。“@@”表達(dá)式一樣的參數(shù),當(dāng)你使用擴(kuò)展命令!irp(詳見IRPs),你能看到@@kd>!irpIrpisactivewith1stacks1iscurrent(=NoMdlSystembuffer=ff660c30Threadff73f4d8:Irpstacktrace.cmdclDevice >[e, 5 cIrp變量中帶@@前綴,!irp將會(huì)使用變量的地址,而不是變量的值。為了使這更加具體,如果變量位于0xF795BC48,它包含的數(shù)據(jù)是0xFF70FBC0,使用!irpIrp代替@@(Irp)將會(huì)請(qǐng)求WinDbg格式化位于0xF795BC48的IRPstack。MASM,@@C++C++,@@MASM。MASMC++語法。在當(dāng)前例程中顯示一個(gè)變量(當(dāng)前的“scope”),使用dv(“DisyVariables”)。例如,如果Sioctl!SioctlDeviceControl+0x103:kd>DeviceObject=Irp=0xff70fbc0outBufLength=0x64buffer=0x irpSp=0xff70fc30data=0xf886b0c0"ThisStringisfromDriverntStatus=mdl=0xinBufLength=datalen=outBuf= inBuf=0xff660c30"ThisStringisfromUserApplication;usingMETHOD_BUFFERED"已知Ve=>isasebly打開反匯編窗口并且檢查寄存器。kd>dvoutBufLengthoutBufLength=0x64另外一個(gè)有用令是dt(“DisyType”)。例如,繼續(xù)使用kd>dtLocalvar@0xf795bc48Type_IRP*+0x000 :+0x002 :+0x004 :+0x008 :+0x00c +0x010ThreadListEntry:_LIST_ENTRY[0xff70fbd0-0xff70fbd0]+0x018 :IO+0x020 :1+0x021PendingReturned:0+0x022 :1+0x023CurrentLocation:1+0x024 :0+0x025 :0+0x026 :0+0x027AllocationFlags:0x4+0x028 :+0x02c :+0x030 +0x038 :+0x03c :+0x040 Irp0xF795BC480xFF70FBC0dtIRP變量的指針(“Type_IRP*”),0xFF70FBC0區(qū)域被格式化為IRP。kd>dt-r1Localvar@0xf795bc48Type_IRP*+0x000 :+0x002 :+0x004 :+0x008 :+0x00c +0x000 :+0x000 :+0x000 :+0x010ThreadListEntry:_LIST_ENTRY[0xff70fbd0-0xff70fbd0]+0x000Flink :0xff70fbd0[0xff70fbd0-0xff70fbd0]+0x004Blink :0xff70fbd0[0xff70fbd0-0xff70fbd0]+0x018 :IO+0x000 :+0x000 :+0x004 :+0x020 :1+0x021PendingReturned:0+0x022 :1+0x023CurrentLocation:1+0x024:0+0x025:0+0x026:0+0x027:0x4+0x028:+0x000:+0x000:+0x004:+0x02c:+0x030 +0x000AsynchronousParameters +0x000 :LARGE_INTEGER+0x038 :+0x03c :+0x040 +0x000 +0x000 :+0x000 :kd>dtnt!_IRP+0x000 :+0x002 :+0x004 :+0x008 :+0x00c +0x010ThreadListEntry:_LIST_ENTRY[0xff70fbd0-0xff70fbd0]+0x018 :+0x020 :1+0x021PendingReturned:0+0x022 :1+0x023CurrentLocation:1+0x024 :0+0x025 :0+0x026 :0+0x027AllocationFlags:0x4+0x028 :+0x02c :+0x030 +0x038 :+0x03c :+0x040 上面令,按照你知道的來說,就是IRP在0xFF70FBC0,而事實(shí)上,這是在ntoskrnl映射出的IRP結(jié)構(gòu)。kd>dtnt!_IRPSize0xff70fbc0unsignedshort0x94更直接的方法是使用??(“EvaluateC++Expression”)kd>??Irp->Sizeunsignedshort0x94顯示內(nèi)存,而不使用上述的格式,一些可用令,如dd,dw和db(“DisyMemory”)kd>dd0xff70fbc0 ff70fbd0ff70fbd0 kd>dw0xff70fbc0ff70fbc00006009400000000007000000c30ff70fbd0fbd0ff70fbd0ff70000000000000ff70fbe00001010100000400fdc000060000ff70fbf00000000000000000000000008f20kd>db0xff70fbc0ff70fbc00600940000000000-70000000300c66ffp.ff70fbd0d0fb70ffd0fb70ff-0000000000000000ff70fbe00100010100000004-c0fd060000000000ff70fbf00000000000000000-00000000208f0004(3l(字母“l(fā)”)0x10。16個(gè)雙字(464個(gè)字節(jié))。第二個(gè)顯示同樣的字。第三個(gè)顯示同怎么改變變量?繼續(xù)在Sioctl!SioctlDeviceControl+0x103kd>outBufLength=^Syntaxerrorin'outBufLength=kd>??outBufLength=0unsignedlong0IRPdtkd>dtLocalvar@0xf795bc48Type_IRP*+0x000 :+0x002 :+0x004 :+0x008 :+0x00c +0x010ThreadListEntry:_LIST_ENTRY[0xff70fbd0-0xff70fbd0]+0x018 :+0x020 :1+0x021PendingReturned:0+0x022 :1+0x023CurrentLocation:1+0x024 :0+0x025 :0+0x026 :0+0x027AllocationFlags:0x4+0x028 :+0x02c :+0x030 +0x038 :+0x03c :+0x040 改變第一個(gè)字(2個(gè)字節(jié))ew(“Enterkd>ew0xff70fbc03kd>dtIrpLocalvar@0xf795bc48Type_IRP*+0x000 :+0x002 :+0x004 :+0x008 :+0x00c +0x010ThreadListEntry:_LIST_ENTRY[0xff70fbd0-0xff70fbd0]+0x018 :+0x020 :1+0x021PendingReturned:0+0x022 :1+0x023CurrentLocation:1+0x024 :0+0x025 :0+0x026 :0+0x027AllocationFlags:0x4+0x028 :+0x02c :+0x030 +0x038 :+0x03c :+0x040 ew更加自然kd>??irp->type=Typedoesnothavegivenmembererrorat'type=kd>??irp->Type=3short3kd>dtirpLocalvar@0xf795bc48Type_IRP*+0x000 :+0x002 :+0x004 :+0x008 :+0x00c +0x010ThreadListEntry:_LIST_ENTRY[0xff70fbd0-0xff70fbd0]+0x018 :IO+0x020 :1+0x021PendingReturned:0+0x022 :1+0x023CurrentLocation:1+0x024 :0+0x025 :0+0x026 :0+0x027AllocationFlags:0x4+0x028 :+0x02c :+0x030 +0x038 :+0x03c :+0x040 以上需要注意的兩件事。首先,結(jié)構(gòu)中成員的大小寫是有意義的,正如WinDbg的提示那樣,在Irp中沒有這樣的成員。第二,dtirpWinDbg顯示了該實(shí)例,它的想法好象被修正了,其中一個(gè)在ioctlapp.exe而另外一個(gè)則在sioctl.sys。因?yàn)榇笮懯怯幸饬x的,你應(yīng)該關(guān)于ew的信息,有其他“EnterValues”命令:eb用于字節(jié),ed用于雙字,eq用于四倍字長(zhǎng)(8字節(jié))等等。參考WINDOWS調(diào)試工具幫助文件中的“EnterValues”。寄存器(也包括段寄存器和標(biāo)記寄存器)kd>eax=81478f68ebx= ecx=814243a8edx= cesi=81778ea0 esp=f7813bb4ebp=f7813c3ciopl=0 nvupeingnzacpenccs=0008ss=0010ds=0023es=0023fs=0030kd>reax有時(shí)你會(huì)希望改變寄存器。例如,EAX經(jīng)常被用于從例程退出時(shí)傳遞返回參數(shù)。因此,在例程退reax=reip=poi(@esp)resp=@esp+0xcEip命令指針)0x0Esp(堆棧指針)+0xC,有效的釋放堆棧。WINDOWS調(diào)試工具幫助文件中的“RegisterSyntax”,解釋了poi命令和為什DriverEntry將會(huì)引起故busioctl!DriverEntry"reip=poi(@esp);reax=0xc ;resp=@esp+0xc;.echosioctl!DriverEntryentered;g"它的意思是:在sioctl.sysDriverEntry,1)這樣設(shè)置命令指針(Eip)2)這樣設(shè)置返回代碼(Eax)3(Esp)4DriverEntry5繼續(xù)運(yùn)行。(當(dāng)然,這技術(shù)僅僅移除DriverEntry引起的可能性,例如。如果操作系統(tǒng)期待驅(qū)動(dòng)程序供應(yīng)函IoCtldispatchkd> ecx=81a88f18edx=81a88ef4esi=ff9e18a8eip=f87a40feesp=f88fac78ebp=f88fac90iopl=0 nvupeiplzrnaponccs=0008ss=0010ds=0023es=0023fs=0030kd>??ntStatus=@ecxlong-kd>dd&ntStatusf88fac78在這個(gè)情況中,應(yīng)該使用@ecx格式,以保證WinDbg知道你在一個(gè)寄存器rM命令(“M”M參數(shù),這里在命令和參數(shù)之間不允許空格kd>rM ebx=0050e2a3ecx= edx=000003f8esi=000000c0eip=804df1c0esp=8056f564ebp=8056f574iopl=0 nvupeiplnznapenccs=0008ss=0010ds=0023es=0023fs=0030fpcw=0000:rn24fpsw=0000:top=0cc=0000fopcode=6745fpip=2301:a st0=5. 170e-4932st1= st2=0.000000002357022271740e-4932 st4= 120e-4932 st6= 700e-4932 mm2=000000018168d902mm3=f33cffdffmm4=804efc868056f170mm5= mm6=ff02740200000000mm7=f1a48056fxmm0=09.11671e-0413.10647e+035-1.154e-xmm1=-7.98492e-039-2.83455e+038-2.91106e+0385.85182e-042xmm2=1.77965e-043-1.17906e-010-4.44585e-038-7.98511e-039xmm3=-7.98511e-03900-7.98504e-039xmm4=-7.98503e-0391.20545e-040-1.47202e-037-1.47202e-037 .247-1.42468e-037-8.60834e+033xmm6=2.8026e-044-1.47202e-037-452.2470xmm7=8.40779e-045-7.98503e-0390-7.98511e- bcr2=d93db000 dr6=ffff0ff0 (ViewLocals)或者寄存器窗口(ViewRegisters)16進(jìn)制的數(shù)值。面的部分(IoCreateDevice)你曾經(jīng)想程序從一點(diǎn)運(yùn)行到下一點(diǎn),而不需要告訴它怎么做。這里中斷(CTRL-BREAK)—WinDbg(KDCTRL-C)步過(F10—每按一次運(yùn)行一條語句(CC++WinDbg處于“sourcemode”DebugSourceMode切換),或者一條指,并且規(guī)定如果遇到一個(gè)函數(shù)調(diào)用,將會(huì)運(yùn)行步進(jìn)(F11)—(SHIFT-F11)—這會(huì)使程序運(yùn)行直到完成當(dāng)前例程(callstack中的當(dāng)前地址)。如果運(yùn)行到光標(biāo)(F7orCRTL-F10)—當(dāng)你想運(yùn)行到該處中斷,你可以將光標(biāo)放到源代碼窗口或者反F7;程序?qū)?huì)運(yùn)行到該位置。有一點(diǎn)要注意,然而:如果運(yùn)行流程與該處不匹配(IF語句不運(yùn)行),WinDbg將指令設(shè)置在當(dāng)前行(CTRL-SHIFT-I)—在源代碼窗口,你可以把光標(biāo)放在一行中,使用該快捷鍵,只要你允許(例如F5或者F10),程序便從該處開始運(yùn)行。在你想重復(fù)一些指令序列時(shí),這很EipEipF5(F10call間中有一個(gè)內(nèi)核棧,在用戶空間中有一個(gè)用戶棧。當(dāng)中斷發(fā)生時(shí),可能有幾個(gè)例程在當(dāng)前的棧中。例如,sioctl.sysPrintIrpInfok(“StackBacktrace”):kd>ChildEBPf7428ba8f889b54aSIoctl!PrintIrpInfo+0x6[d:\winddk\3790.1824\src\general\ioctl\sys\sioctl.c@708]f7428c3c804e0e0dSIoctl!SioctlDeviceControl+0xfa[d:\winddk\3790.1824\src\general\ioctl\sys\sioctl.c@337]WARNING:Stackunwindinformationnotavailable.Followingframesmaybewrong.f7428c6080580e2ant!IofCallDriver+0x33f7428d00805876c2nt!CcFastCopyRead+0x3c3f7428d34804e7a8cnt!NtDeviceIoControlFile+0x28 最高一行(的)棧幀就是停止的地方。你也可以看到此前的一些調(diào)用。但是如果你沒有symbols,他sioctl.syssymbols的樂趣。你可以為IoCtl的IRP處理程序打開源代碼窗口。但是假如你對(duì)更早的例程不感?你打開調(diào)用窗(ViewCallstack)如果你只對(duì)在堆棧中屬于例程的變量感,你可以雙擊該例程所在的項(xiàng)目,或者你可以用kn(與k同屬)然后.frame。例如,取得關(guān)于調(diào)用了PrintIrpInfo的dispatchroutine的信息:kd>#ChildEBP00f7428ba8f889b54aSIoctl!PrintIrpInfo+0x6[d:\winddk\3790.1824\src\general\ioctl\sys\sioctl.c@708]01f7428c3c804e0e0dSIoctl!SioctlDeviceControl+0xfa[d:\winddk\3790.1824\src\general\ioctl\sys\sioctl.c@337]WARNING:Stackunwindinformationnotavailable.Followingframesmaybewrong.02f7428c6080580e2ant!IofCallDriver+0x3303f7428d00805876c2nt!CcFastCopyRead+0x3c304f7428d34804e7a8cnt!NtDeviceIoControlFile+0x2805f7428d64 kd>.frame01f7428c3c804e0e0dSIoctl!SioctlDeviceControl+0xfa[d:\winddk\3790.1824\src\general\ioctl\sys\sioctl.c@337]kd>DeviceObject=Irp=outBufLength=buffer= irpSp=data=0xf889b0c0"ThisStringisfromDeviceDriver!!!"ntStatus=0mdl=0xinBufLength=datalen=outBuf=0x82096b20"ThisStringisfromUserApplication;usingMETHODBUFFERED"inBuf=0x82096b20"ThisStringisfromUserApplication;usingMETHOD_BUFFERED"kd> ecx=80506be8edx=820572a8esi=81fabda0eip=f889bcf6esp=f7428ba4ebp=f7428ba8iopl=0 nvupeingnzacpenccs=0008ss=0010ds=0023es=0023fs=0030f889bcf6 x(“ExamineSymbols”)symbolsIoctl例程中設(shè)置斷點(diǎn),以便處理DeviceIoControlIRPs。但是你不太記得該例程的名字了,你可以這么做:kd>x SIoctl!SioctlUnloadDriver(structDRIVEROBJECT SIoctl!SioctlCreateClose(struct_DEVICE_OBJECT*,struct SIoctl!SioctlDeviceControl(struct_DEVICE_OBJECT*,_IRPsioctl模塊中,包含“ioctl.”symbolsPopWorkerAction:actionrequest2failed可以推測(cè)PopWorkerAction在ntoskrnl中,你可能看到這些kd>x 805146c0nt!Pop WorkerThread=<notypeinformation>8064e389nt!Pop SystemIdle=<notypeinformation>805b328dnt!Pop WorkerNotify=<notypeinformation>8056e620nt!Pop Lock=<notypeinformation>8064d5f8nt!Pop WorkerActionPromote=<notypeinformation>805c7d10nt!Pop WorkerMain=<notypeinformation>8064d51bnt!Pop WorkerAction=<notypeinformation>80561c70nt!Pop =<notypeinformation>8056e878nt!Pop IrpQueue=<notypeinformation>80561a98nt!Pop LockThread=<notypeinformation>8064e74ant!Pop TimeChange=<notypeinformation>8056e8b0nt!Pop Worker=<notypeinformation>如果一個(gè)EXE文件在建立時(shí)作了一些優(yōu)化,它可能很難在源碼窗口中運(yùn)行,一些本地變量可能無法x86指令,你可能要嘗試在源代碼窗口和反匯編窗口(將這些窗口并排會(huì)方便你工作)中它的運(yùn)行。你不需要為了控制流而對(duì)x86非常了解;主要看比較命令(例如test或者cmp)和分支命令(例如jnz),以便控制流。那適用于基本操作。盡管上面的焦點(diǎn)不是討論如何一些特殊區(qū)域,但是有大量調(diào)試器命令—從技術(shù)上來說,它們是擴(kuò)展命令并且由DLL提供—仍然值得被提及,因?yàn)樗鼈冊(cè)诤芏喾矫娑急环磸?fù)使用。查看當(dāng)前進(jìn)程(在停止的位置kd>PROCESS816fc3c0SessionId:1Cid:08f8 Peb:7ffdf000ParentCid: ObjectTable:e1afeaa8HandleCount:19.Image:ioctlapp.exeVadRoot825145e0Vads22Clone0Private38.Modified0.Locked0.DeviceMape10d0198 WorkingSetSizes(now,min,max)(263,50,345)(1052KB,200KB,668THREAD825d2020Cid08f8.0708Teb:7ffde000RUNNINGonprocessor進(jìn)程塊地址(EPROCESS)和線程塊地址(ETHREAD)被標(biāo)記為紅色。你可以在該處使用條件斷點(diǎn)。 kd>!process0****NTACTIVEPROCESSDUMPPROCESS826af478SessionId:noneCid:0004 ParentCid:0000DirBase:02c20000ObjectTable:e1001e60HandleCount:363.Image:SystemPROCESS82407d88SessionId:noneCid:0158 Peb:7ffdf000ParentCid:0004DirBase:1fbe8000ObjectTable:e13ff740HandleCount:24.Image:smss.exePROCESS82461d88SessionId:0Cid:0188 Peb:7ffdf000ParentCid:DirBase:1f14d000ObjectTable:e15e8958HandleCount:408.Image:csrss.exe ,給出進(jìn)程塊的地址和通過第二個(gè)參數(shù)請(qǐng)求(查看WINDOWS調(diào)試工具幫kd>!process826af478PROCESS826af478SessionId:noneCid:0004 ParentCid:0000DirBase:02c20000ObjectTable:e1001e60HandleCount:362.Image:SystemVadRoot81a43840Vads4Clone0Private3.Modified18884.Locked0.DeviceMape WorkingSetSizes(now,min,max)(54,0,345)(216KB,0KB,1380KB) 1287THREAD826af1f8Cid0004.0008Teb: WAIT:(WrPage)KernelModeNon-AlertableTHREAD826aea98Cid0004.0010Teb: WAIT:(WrQueue)KernelModeNon-Alertable80582d80THREAD826ae818Cid0004.0014Teb: WAIT:(WrQueue)KernelModeNon-Alertable80582d80查看所有關(guān)于某線程的信息,使用!thread0xFFkd>!thread826af1f8THREAD826af1f8Cid0004.0008Teb: WAIT:(WrPage)KernelModeNon-AlertableNotim Owning WaitStartTickCount Ticks:153(0:00:00:02.390)ContextSwitchCount StartAddressnt!Phase1InitializationStackInitf88b3000Currentf88b2780Basef88b3000Limitf88b0000CallPriority0BasePriority0PriorityDecrement0ChildEBPRetAddrf88b2798804edb2bnt!KiSwapContext+0x26(FPO:[EBP0xf88b27c0][0,0,4])f88b27c0804f0e7ant!KiSwapThread+0x280(FPO:[Non-Fpo])(CONV:f88b27f480502fc2nt!KeWaitForMultipleObjects+0x324(FPO:[Non-Fpo])(CONV:stdcall)序,并且檢查該設(shè)備堆棧。假設(shè)你對(duì)ScsiPortminiportdriveraic78xx.sys感。以!drvobj開始:kd>!drvobjDriverobject )isDriverExtensionList:(id,addr) DeviceObject8267b0308263c0304個(gè)設(shè)備對(duì)象。通常查看第一個(gè),使用!devobj取得一些關(guān)于該設(shè)備的信息,而!devstack則會(huì)kd>Deviceobject( )isfor:aic78xx1Port2Path0Target1Lun0\Driver\aic78xxDriverObjectCurrent RefCount0 Dacle13bb39cDevExt826660e8DevObjExt82666d10Dope8267a9d8DevNodeExtensionFlags AttachedDevice(Upper)826bb030\Driver\DiskDevicequeueisnotbusy.kd> 826bbe00\Driver\PartMgr 826bb030 826bb0e8 826660e8!DevNode8263cdc8DeviceInst"SCSI\Disk&VenQUANTUM&Prod_VIKING_II_4.5WLS&Rev_5520\5&375eb691&1&010"ServiceNameis"disk"kd>!irpIrpisactivewith1stacks1iscurrent(=NoMdlSystembuffer=ff660c30Threadff73f4d8:Irpstacktrace.cmdclDevice >[e, 5 cIRPkd>!irp@@(Irp)Irpisactivewith1stacks1iscurrent(=NoMdlSystembuffer=ff660c30Threadff73f4d8:Irpstacktrace.Flags=ThreadListEntry.Flink=ff70fbd0ThreadListEntry.Blink=ff70fbd0IoStatus.Status=IoStatus.Information=RequestorMode=Cancel=CancelIrql=ApcEnvironment=00UserIosb=0006fdc0UserEvent=Overlay.AsynchronousParameters.UserApcRoutine=Overlay.AsynchronousParameters.UserApcContext=Overlay.AllocationSize= CancelRoutine=UserBuffer=04008f20&Tail.Overlay.DeviceQueueEntry=ff70fc00Tail.Overlay.Thread=ff73f4d8Tail.Overlay.AuxiliaryBuffer=Tail.Overlay.ListEntry.Flink=Tail.Overlay.ListEntry.Blink=Tail.Overlay.CurrentStackLocation=ff70fc30Tail.Overlay.OriginalFileObject=ffb05b90Tail.Apc=pletionKeycmdcl >[e, 5 ckd>dtnt!_IRP+0x000 :+0x002 :+0x004 :+0x008 :+0x00c +0x010ThreadListEntry:_LIST_ENTRY[0xff70fbd0-0xff70fbd0+0x018 :+0x020 :1+0x021PendingReturned:0+0x022 :1+0x023CurrentLocation:1+0x024 :0+0x025 :0+0x026 :0+0x027AllocationFlags:0x4+0x028 :+0x02c :+0x030 +0x038 :+0x03c :+0x040 偶然會(huì)用到令!irql(WindowsServer2003或以后的版本可用),因?yàn)樗@示有關(guān)處理器當(dāng)前IRQLSioctl!SioctlDeviceControl+0x0kd>DebuggersavedIRQLforprocessor0x0--0IRQLSioctl!SioctlDeviceControlIOCTL_SIOCTL_METHOD_BUFFEREDIrp->IoStatus.Information={/*Beginaddedcode*/KIRQLsaveIrql;ULONGi=KeRaiseIrql(DISPATCH_LEVEL,&saveIrql);}/*Endaddedcode*/KeRaiseIrqlkd>DebuggersavedIRQLforprocessor0x0--2順便說明一下!pcr命令一般不會(huì)顯示你感的IRQL,也就是說在該IRQL的斷點(diǎn)引起中斷Dump這里有一些DUMP文件獨(dú)有的事要說明。數(shù)一些事值得說明DUMPDUMPDUMP已經(jīng)可以滿足大多數(shù)情況。也有小內(nèi)存DUMP,它只有64KB(比起其他兩種類型生成得更快)。由于小內(nèi)存DUMP沒有關(guān)于執(zhí)行體的所有信息,你可能需要使用.exepath命令指定執(zhí)行體鏡象。你可以通過配置WINDOWS以出現(xiàn)時(shí)建立一個(gè)DUMP文件。DUMP文件時(shí),不需要為WinDbg指定目標(biāo)系統(tǒng)。在WinDbg中使用FileOpenCrashDump打開DUMP文件。如果symbol路徑和source路徑都已經(jīng)設(shè)置好,它們會(huì)幫助你?,F(xiàn)在,在WinDbg令窗口使用!yze–v取得 (.cxr);通過設(shè)置該上下文,你可以錯(cuò)誤發(fā)生時(shí)的callstack(最接近錯(cuò)誤的那個(gè))。你需要進(jìn)入進(jìn)程和線程(!process和!thread),查看內(nèi)核的模塊列表(lmnt),在該列表中挑選需要查看的驅(qū)動(dòng)對(duì)象(!drvobj)和可能要查看設(shè)備節(jié)點(diǎn)(!devnode),設(shè)備對(duì)象(!devobj)和設(shè)備堆棧(!devstack)。但是在查看DUMP文件中,沒有比使用!yze–v更簡(jiǎn)單的方法了。DUMP文件在錯(cuò)誤發(fā)生時(shí)被建立。調(diào)試該文件與使用調(diào)試器附加調(diào)試錯(cuò)誤時(shí)相似。下面的部分將會(huì)展示一個(gè)現(xiàn)場(chǎng)調(diào)試的例子,它與分析DUMP文件相似。這是關(guān)于如何開始分析一個(gè)錯(cuò)誤。在這個(gè)例子中,內(nèi)核調(diào)試器在時(shí)附加,它的過程與分析一個(gè)內(nèi)核模DUMP文件是相似的在這個(gè)例子中,Sioctl.sys被加載,并且在Sioctl!DriverEntry設(shè)置斷點(diǎn)。當(dāng)調(diào)試器在該斷點(diǎn)停止時(shí),甚至EIP為0。這都不會(huì)是一個(gè)有效的數(shù)值,因?yàn)槊钪羔槻荒転?。然后通過F5繼續(xù)運(yùn)行。一個(gè)內(nèi)核錯(cuò)誤發(fā)生,你可以開始查錯(cuò)了。然后你可以使用!yze這個(gè)擴(kuò)展命令:kd>!yze-** Bugcheck***SYSTEM_THREAD_EXCEPTION_NOT_HANDLEDThisisaverycommonbugcheck.Usuallytheexceptionaddressthedriver/functionthatcausedtheproblem.Alwaysnotethisaddressaswellasthelinkdateofthedriver/imagethatcontainsthisaddress.Arg1:c ,Theexceptioncodethatwasnothandled ,TheaddressthattheexceptionoccurredatArg3:f88f2bd8,ExceptionRecordAddressArg4:f88f2828,ContextRecordDebuggingEXCEPTION_CODE:(NTSTATUS)0xc -Theinstructionat"0x%08lx"referencedmemoryat"0x%08lx".Thememorycouldnotbe"%s". EXCEPTIONRECORD:f88f2bd8--(.exrfffffffff88f2bd8)ExceptionCode:c (Accessviolation)NumberParameters:2AttempttoreadfromCONTEXT:f88f2828--(.cxreax=ffff99eaebx= ecx=0000bb40edx=8055f7a4esi=e190049e esp=f88f2ca0ebp=f88f2cf0iopl=0 nvupeiplnznapenccs=0008ss=0010ds=0023es=0023fs=0030 ResettingdefaultscopeDEFAULT_BUCKET_ID:DRIVER_FAULTCURRENT_IRQL:0ERROR_CODE:(NTSTATUS)0xc -Theinstructionat"0x%08lx"referencedmemoryat"0x%08lx".Thememorycouldnotbe"%s".BUGCHECK_STR:LAST_CONTROL_TRANSFER:from805b9cbbtoWARNING:FrameIPnotinanyknownmodule.Followingframesmaybef88f2c9c805b9cbb81e826e8 f88f2d58805b9ee5 8123a00081e826e8nt!IopLoadDriver+0x5e1f88f2d80804ec5c8 f88f2dac805f1828f7718cf4 e804ec50d FOLLOWUP805b9cbb3bc3 SYMBOL_STACK_INDEX:1SYMBOL_NAME:MODULE_NAME:IMAGE_NAME:ntoskrnl.exeDEBUG_FLR_IMAGE_TIMESTAMP:3e800a79MAND:.cxrfffffffff88f2828;kbFAILURE_BUCKET_ID:0x7E_NULL_IP_nt!IopLoadDriver+5e1BUCKET_ID:0x7E_NULL_IP_nt!IopLoadDriver+5e1kd>.cxreax=ffff99eaebx= ecx=0000bb40edx=8055f7a4esi=e190049e esp=f88f2ca0ebp=f88f2cf0iopl=0 nvupeiplnznapenccs=0008ss=0010ds=0023es=0023fs=0030 kd>***Stacktraceforlastsetcontext-.thread/.cxrresetsitChildEBPRetAddrArgstoChildWARNING:FrameIPnotinanyknownmodule.Followingframesmaybef88f2c9c805b9cbb81e826e8 f88f2d58805b9ee5 8123a00081e826e8nt!IopLoadDriver+0x5e1f88f2d80804ec5c8 f88f2dac805f1828f7718cf4 e804ec50d最上層的堆??雌饋硎清e(cuò)誤的。這是你可能在DUMP文件中遇到的。如果你不知道該錯(cuò)誤是如何發(fā)生使用.frame1nt!IopLoadDriver切換到反匯編窗口,nt!IopLoadDriver8062da9edwordptr8062daa1kd>rLastsetcontext:kd>?Evaluateexpression: =該地址在器中的0x81A2BB44處kd>dd81a2bb44l181a2bb44kd>dtf87941a3你可以將偽寄存器當(dāng)作變量使用以完成各種目的。有很多偽寄存器都被預(yù)定義:$racallstack入口的返回地址,$ip是指令指針,$scopeip代表當(dāng)前作用域的地址(使當(dāng)前例程中的本地變量可用的本地上下文),$proc指向當(dāng)前EPROCESS,等等。這些在條件語句中很有用。當(dāng)然也有由使用者定義的偽寄存器,從$t0到$t19。這能用于達(dá)成很多目的,例如計(jì)算中斷的次數(shù)。一個(gè)baw481b404d8-18"r$t0=@$t0+1;as/x${/v:$$t0}@$t0;.block{.echohit#$$t0};ad${/v:$$t0};dd81b404d8-18l1;k;!thread-10;!process-10"上式的近似意思是,當(dāng)0x81B404D8中的雙字被更新時(shí),偽寄存器$t0將作為中斷計(jì)數(shù)器,已中斷0x81B404D8callstack(請(qǐng)參考下面另外一個(gè)用途說明來自于一個(gè)實(shí)例。該實(shí)例需要Atapi.sys的DPC例程的活動(dòng)狀況(Atapi.sys是一個(gè)標(biāo)準(zhǔn)的操作系統(tǒng)驅(qū)動(dòng)程序)。該例程經(jīng)常會(huì)被使用,分析工程師對(duì)一個(gè)特殊的地方感,一個(gè)IRP將要irpIRPTape.sys,所以他在開始的時(shí)候?yàn)锳tapi.sysDPC1次的斷點(diǎn):bp/1 pletedRequest+0x3bd"dvirp;該斷點(diǎn)的作用是設(shè)置偽寄存器$t0的值,使它與irp相等,即那個(gè)感的IRP地址。(同樣會(huì)顯示irp的 pleteAssociated+0x1c6"j(@@(Irp)=$t0)'.echo pleteAssociated+0x1c6;dvIrp';Tape.sysIrp與$t0匹配,給出有用的信息并且顯IrpIrp不等于$t0,繼續(xù)運(yùn)行。當(dāng)?shù)诙€(gè)斷點(diǎn)使運(yùn)行停止時(shí),那便是工程師希望將一些字符替換成其令字符可能會(huì)比較便利。其中一個(gè)用處便是用一個(gè)簡(jiǎn)短的字符來代替長(zhǎng)長(zhǎng)kd>asDemor;!process-10;k;!thread-10kd>al r;!process-10;k;!thread-10kd>demoCouldn'tresolveerrorat'emo'kd>Demo ebx=001a6987ecx= edx=ffd11118esi= eip=804df1c0esp=8056f564ebp=8056f574iopl=0 nvupeiplnznapenccs=0008ss=0010ds=0023es=0023fs=0030804df1c0 PROCESS80579f60SessionId:noneCid:0000 ParentCid:0000 ObjectTable:e1000e78HandleCount:234.Image:IdleChildEBP8056f560804e8682nt!RtlpBreakWithStatusInstruction8056f560804e61cent!KeUpdateSystemTime+0x132 THREAD80579d00Cid0000.0000 RUNNINGonprocessorbpSioctlDeviceControl"r$t0=@$t0+1;as/x${/v:$$t0}@$t0;.block{.echohit#$$t0};ad${/v:$$t0};k;!thread-10;!process-10;g"WinDbghit#0x1ChildEBPRetAddrf747dc2080a2675cSIoctl!SioctlDeviceControlf747dc3c80c70bednt!IofCallDriver+0x62f747dc5480c71b0dnt!IopSynchronousServiceTail+0x159f747dcf480c673aant!IopXxxControlFile+0x665f747dd2880afbbf2nt!NtDeviceIoControlFile+0x28f747dd287ffe0304nt!_KiSystemService+0x13f0006fdc804003bcbSharedUserData!SystemCallStub+0x4 0006ff7804002e020006ffc077e4f38cWARNING:FrameIPnotinanyknownmodule.Followingframesmaybe THREADfeca2b88Cid0714.0e2cTeb:7ffde000Win32Thread:RUNNINGonprocessor0PROCESSff877b50SessionId:1Cid:0714 Peb:7ffdf000ParentCid:DirBase:048f0000ObjectTab
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 誠(chéng)實(shí)守信申請(qǐng)書
- 2025年度合同擔(dān)保在跨境貿(mào)易中的風(fēng)險(xiǎn)控制
- 2025年度盡職調(diào)查報(bào)告應(yīng)用與風(fēng)險(xiǎn)防范合同
- 2025年度數(shù)據(jù)中心建設(shè)與運(yùn)營(yíng)管理合同
- 2025年度新型綠色牧草料采購合同模板
- 2025年棉織內(nèi)褲項(xiàng)目投資可行性研究分析報(bào)告
- 足球協(xié)會(huì)申請(qǐng)書
- 2025年度綠色環(huán)保建筑材料采購合同-@-2
- 2025年度金融服務(wù)買賣合同范本
- 2025年度企業(yè)并購借款擔(dān)保管理協(xié)議
- 《視網(wǎng)膜靜脈阻塞》課件
- 2025《省建設(shè)工程檔案移交合同書(責(zé)任書)》
- 春季安全教育培訓(xùn)課件
- 《大學(xué)英語1》期末考試試卷及答案(???
- 《石油鉆井基本知識(shí)》課件
- 2024新滬教版英語(五四學(xué)制)七年級(jí)上單詞默寫單
- 電力兩票培訓(xùn)
- TCCEAS001-2022建設(shè)項(xiàng)目工程總承包計(jì)價(jià)規(guī)范
- 2024.8.1十七個(gè)崗位安全操作規(guī)程手冊(cè)(值得借鑒)
- 小王子-英文原版
- 二次供水衛(wèi)生管理制度及辦法(4篇)
評(píng)論
0/150
提交評(píng)論