分析解決Internet Explorer崩潰一例
?
本文為Eric原創(chuàng)技術(shù)文章,如需轉(zhuǎn)載請事先與我取得聯(lián)系。首發(fā)于WinOS.cn,僅限站內(nèi)交流分享。
?
通過本文,您將了解到:
??l
IE
瀏覽器產(chǎn)生崩潰的幾類原因
??l
為什么發(fā)送錯(cuò)誤匯報(bào)之后得到的官方反饋鏈接不能夠幫助徹底解決崩潰問題
??l
發(fā)送給微軟的錯(cuò)誤匯報(bào)里面都是什么內(nèi)容
??l
WinDbg
調(diào)試程序的進(jìn)階使用以及相關(guān)命令
??l
如何鑒別動(dòng)態(tài)鏈接庫文件是否真正為微軟公司發(fā)行以及真文件的幾點(diǎn)特征
??l
解決IE崩潰的基本分析思路
?
? ? 本月22日,一個(gè)名叫“120”的朋友在Windows Client板塊發(fā)表了一個(gè)求助帖,標(biāo)題為“IE6自動(dòng)關(guān)閉”。這幾天,通過遠(yuǎn)程協(xié)助等手段,在機(jī)主的極力配合之下,問題終于得以解決。在這里,我們進(jìn)行一個(gè)IT Show Case,將整理過后的分析解決過程的核心部分發(fā)表成此文,為大家提供一個(gè)解決此類問題的基本思路及分析方法,也借此文在這里與大家進(jìn)行一個(gè)關(guān)于此問題的交流。
? ? 說到IE的崩潰,也許那簡直就是家常便飯,見怪不怪了。本案例中,機(jī)主的描述也是打開一些網(wǎng)站的時(shí)候,IE自動(dòng)關(guān)閉而且要求錯(cuò)誤報(bào)告,機(jī)主的環(huán)境是Microsoft Windows XP Pro with SP2,錯(cuò)誤模塊為Urlmon.dll。根據(jù)經(jīng)驗(yàn),這并不是引起崩潰的元兇,那么我需要對(duì)機(jī)主的崩潰進(jìn)行一個(gè)具體的分析。下面就是這個(gè)崩潰的截圖:
?
?
? ? 雖然微軟公司在IE的發(fā)行中一直在改善其穩(wěn)定性,但是就算較新的IE6、IE7甚至于目前還在Beta2測試階段的IE8都仍然會(huì)出現(xiàn)不穩(wěn)定現(xiàn)象,或掛起、或崩潰,只是相對(duì)于以前的版本要稍稍穩(wěn)定一些了。細(xì)心的朋友可能發(fā)現(xiàn),如果您的Windows啟用了程序錯(cuò)誤匯報(bào),那么IE崩潰之后會(huì)要求您發(fā)送一個(gè)錯(cuò)誤報(bào)告給微軟,有的時(shí)候還會(huì)立即反饋一個(gè)用于解決問題的鏈接,點(diǎn)擊之后將前往微軟聯(lián)機(jī)崩潰分析頁面,提供一些安裝最新補(bǔ)丁、使用防病毒軟件、禁用第三方加載項(xiàng)之類的解決方案,而往往有的用戶進(jìn)行這些操作之后卻仍不能夠解決問題,是什么原因呢?
? ? 其實(shí),IE的崩潰無非有這樣幾類情況,即加載了不穩(wěn)定的插件、有漏洞被利用、自身不穩(wěn)定、缺少文件、被流氓軟件劫持、存有木馬或者病毒。微軟的反饋鏈接應(yīng)該來說對(duì)于前三種情況是最有效的,而對(duì)于后面的幾種較為復(fù)雜多變的情況,往往是無能為力的。其中有一個(gè)重要原因——有的時(shí)候真正引起崩潰的文件并沒有包含在發(fā)送給微軟的錯(cuò)誤報(bào)告中,也就是說,微軟分析的時(shí)候,根本意識(shí)不到IE加載了這樣的一個(gè)問題組件。關(guān)于這一點(diǎn),本例就是一個(gè)很好的證明,本例中真正引起崩潰的是msxmlfilta.dll,我將發(fā)送給微軟的錯(cuò)誤匯報(bào)技術(shù)信息附在本文的附件errorperort_to_Microsoft.rar之中(前往http://bbs.winos.cn/viewthread.php?tid=50046下載),有興趣的朋友可以打開來查找一下這個(gè)DLL,可以發(fā)現(xiàn)是查找不到的。
? ? 如果我們使用WinDbg的附加到進(jìn)程進(jìn)行調(diào)試的功能,可以得到IE加載了這個(gè)DLL,由于篇幅有限,下面僅展示其中的一個(gè)片段:(完整的進(jìn)程分析信息位于附件的ProcessAnalysis.rar,前往http://bbs.winos.cn/viewthread.php?tid=50046下載)
?
代碼:
ModLoad: 77bb0000 77bc5000? ?C:\WINDOWS\system32\MSACM32.dll
ModLoad: 77ba0000 77ba7000? ?C:\WINDOWS\system32\midimap.dll
ModLoad: 038f0000 0391a000? ?C:\WINDOWS\system32\msxmlfilta.dll
ModLoad: 69760000 69776000? ?C:\WINDOWS\system32\faultrep.dll
ModLoad: 76f20000 76f28000? ?C:\WINDOWS\system32\WTSAPI32.dll
(334.cb0): Break instruction exception - code 80000003 (first chance)
eax=7ffde000 ebx=00000001 ecx=00000002 edx=00000003 esi=00000004 edi=00000005
eip=7c921230 esp=0396ffcc ebp=0396fff4 iopl=0? ?? ?? ?nv up ei pl zr na pe nc
cs=001b??ss=0023??ds=0023??es=0023??fs=0038??gs=0000? ?? ?? ?? ? efl=00000246
ntdll!DbgBreakPoint:
7c921230 cc? ?? ?? ?? ???int? ???3
?
? ? 由于遠(yuǎn)程協(xié)助受到網(wǎng)絡(luò)速度的影響,不能夠進(jìn)行更多地分析,于是我使用了“.dump /ma IE.DMP”命令生成了一個(gè)當(dāng)前崩潰IE的Minidump內(nèi)存轉(zhuǎn)儲(chǔ)文件,然后機(jī)主通過網(wǎng)絡(luò)發(fā)送給我做進(jìn)一步分析。
? ? 得到IE.DMP之后,使用WinDbg進(jìn)行加載。使用“!Analyze -v”命令進(jìn)行分析,WinDbg得到了自動(dòng)判別出的一個(gè)引起問題的模塊——faultrep.dll。下面是相關(guān)的片段:
代碼:
PRIMARY_PROBLEM_CLASS:??STATUS_BREAKPOINT
BUGCHECK_STR:??APPLICATION_FAULT_STATUS_BREAKPOINT
MODULE_NAME: faultrep
STACK_COMMAND:??~0s ; kb
FAILURE_BUCKET_ID:??APPLICATION_FAULT_STATUS_BREAKPOINT_faultrep!StartDWException+5df
BUCKET_ID:??APPLICATION_FAULT_STATUS_BREAKPOINT_faultrep!StartDWException+5df
Followup: MachineOwner
?
? ? 真的是它么?使用“lmvm faultrep”命令,得到以下結(jié)果:
?
代碼:
start? ? end? ?? ???module name
69760000 69776000? ?faultrep? ?(pdb symbols)? ?? ?? ? DownstreamStore\faultrep.pdb\3894E0C34E6A43099670AE3EB5AFD94D1\faultrep.pdb
? ? Loaded symbol image file: faultrep.dll
? ? Image path: C:\WINDOWS\system32\faultrep.dll
? ? Image name: faultrep.dll
? ? Timestamp:? ?? ???Tue Aug 17 07:37:33 2004 (4121453D)
? ? CheckSum:? ?? ?? ?0001F72E
? ? ImageSize:? ?? ???00016000
? ? File version:? ???5.1.2600.2180
? ? Product version:??5.1.2600.2180
? ? File flags:? ?? ? 0 (Mask 3F)
? ? File OS:? ?? ?? ? 40004 NT Win32
? ? File type:? ?? ???1.0 App
? ? File date:? ?? ???00000000.00000000
? ? Translations:? ???0804.04b0
? ? CompanyName:? ?? ?Microsoft Corporation
? ? ProductName:? ?? ?Microsoft(R) Windows (R) 2000 Operating System
? ? InternalName:? ???FAULTREP.DLL
? ? OriginalFilename: FAULTREP.DLL
? ? ProductVersion:? ?5.1.2600.2180
? ? FileVersion:? ?? ?5.1.2600.2180 (xpsp_sp2_rtm.040803-2158)
? ? FileDescription:??Windows Error Reporting
LegalCopyright:? ?(C) Microsoft Corporation. All rights reserved.
?
? ? 很明顯,這個(gè)DLL是Windows錯(cuò)誤報(bào)告的核心組件之一,并不是引起問題的元兇。所以對(duì)于WinDbg的分析,我們還需要加以思考才能判別出問題的根源。那么下一步就是要查明問題的元兇了。使用“kb”命令顯示線程堆棧信息。下面是命令結(jié)果:
?
代碼:
ChildEBP RetAddr??Args to Child? ?? ?? ?? ???
0013aa64 7c92e9ab 7c8094e2 00000002 0013aa90 ntdll!KiFastSystemCallRet
0013aa68 7c8094e2 00000002 0013aa90 00000001 ntdll!ZwWaitForMultipleObjects+0xc
0013ab04 7c80a075 00000002 0013ac34 00000000 kernel32!WaitForMultipleObjectsEx+0x12c
0013ab20 6976763c 00000002 0013ac34 00000000 kernel32!WaitForMultipleObjects+0x18
0013b4b4 697682b1 0013cbf0 ffffffff 00198312 faultrep!StartDWException+0x5df
0013c528 7c8633b1 0013cbf0 ffffffff 0013ee48 faultrep!ReportFault+0x533
0013cbc8 75f1ea3f 0013cbf0 77c05cf5 0013cbf8 kernel32!UnhandledExceptionFilter+0x587
0013cbd0 77c05cf5 0013cbf8 00000000 0013cbf8 browseui!BrowserProtectedThreadProc+0x65
0013cbf8 7c9237bf 0013cce4 0013ee5c 0013cd00 msvcrt!_except_handler3+0x61
0013cc1c 7c92378b 0013cce4 0013ee5c 0013cd00 ntdll!ExecuteHandler2+0x26
0013cccc 7c92eafa 00000000 0013cd00 0013cce4 ntdll!ExecuteHandler+0x24
0013cccc 75c71ed3 00000000 0013cd00 0013cce4 ntdll!KiUserExceptionDispatcher+0xe
0013cfd4 75c73099 001d3818 00237d3c 00237d40 urlmon!CTransaction::GetBindInfo+0x10
0013cffc 011b68d7 00237c00 0013d054 017c8dc0 urlmon!CINet::Start+0x5f
WARNING: Stack unwind information not available. Following frames may be wrong.
0013d034 011b675b 0013d054 001d3810 017c8dc0 msxmlfilta!DllUnregisterServer+0x1a27
0013d104 011b64e4 011b64f5 00000000 017c8d8c msxmlfilta!DllUnregisterServer+0x18ab
0013d108 011b64f5 00000000 017c8d8c 001d3824 msxmlfilta!DllUnregisterServer+0x1634
0013d130 7c9306eb 017c4b00 00150000 00000000 msxmlfilta!DllUnregisterServer+0x1645
001ad858 772f2f3a 622e7777 75646961 6d6f632e ntdll!RtlAllocateHeap+0xeac
001ad858 00000000 622e7777 75646961 6d6f632e 0x772f2f3a
?
? ? 請注意到字樣WARNING后面的部分!同時(shí)我們給出這個(gè)關(guān)鍵部分的截圖:
?
?
? ? 從圖中清晰地可以看到,這里的函數(shù)才是問題的關(guān)鍵,函數(shù)是msxmlfilta.dll提供的。回顧整個(gè)分析過程,發(fā)現(xiàn)WinDbg始終無法為它加載符號(hào)(Symbols),因此這個(gè)應(yīng)該不是微軟的文件吧。(完整的Minidump分析結(jié)果見附件DumpAnalysis.rar,前往http://bbs.winos.cn/viewthread.php?tid=50046下載)我們需要察看它的屬性得到證實(shí)。我通過互聯(lián)網(wǎng)得到了這個(gè)文件的一個(gè)樣本,有的網(wǎng)友說它是來自于Deamon Tools虛擬光驅(qū)的,而且在機(jī)主那兒得到證實(shí),他的確安裝了這個(gè)虛擬光驅(qū)。但是,查看屬性時(shí)我發(fā)現(xiàn),這個(gè)文件的屬性具有仿冒特征,下面是它與右邊的一個(gè)微軟發(fā)行組件的對(duì)比:
?
?
? ? 我們知道,微軟官方發(fā)行的組件都有描述,而這個(gè)文件的描述MsHttpApp.dll也未免不正常吧,再有就是微軟的組件版本信息中版本號(hào)應(yīng)該與Windows一致,或者與其軟件(如IE)的版本號(hào)一致才對(duì),5.1.2600為XP的版本號(hào),現(xiàn)在哪一個(gè)Windows的系統(tǒng)組件還是1.0.0.1呢?而且瑞星殺毒軟件報(bào)告它為風(fēng)險(xiǎn)-廣告程序,如圖:
?
?
? ? 通過測試,并不是所有的殺毒軟件均報(bào)告該文件,因此機(jī)主的殺毒軟件并沒有報(bào)告它。但是這個(gè)文件又是如何造成IE崩潰的呢?我們使用exeScope進(jìn)行函數(shù)以及關(guān)聯(lián)的分析,如下圖:
?
?
? ? 很明顯,這個(gè)文件就提供四個(gè)函數(shù)功能,大多都是與DLL注冊/反注冊、加載/卸載有關(guān)的。而且在左欄我們發(fā)現(xiàn),它的導(dǎo)出為一個(gè)MsHttpApp.dll,也就是說它可以供其調(diào)用,將結(jié)果傳遞給MsHttpApp.dll。問題就在這里了,機(jī)主證實(shí)他的計(jì)算機(jī)上并沒有存在這樣一個(gè)MsHttpApp.DLL。于是我們將這個(gè)來歷不明的msxmlfilta.DLL刪除即可解決問題。(本例中msxmlfilta.DLL并沒有被注冊占用,因此可以直接刪除。萬一被注冊占用,請使用“regsvr32 /u msxmlfilta.DLL”命令進(jìn)行反注冊,然后再刪除即可)
?
? ? 到這里,問題就解決了。但是我仍存有幾個(gè)疑問。這個(gè)msxmlfilta.DLL真的來源于Deamon Tools虛擬光驅(qū)嗎?是它的一個(gè)組件嗎?為什么具有仿冒特征?為什么被部分反病毒軟件報(bào)告?它究竟是用來執(zhí)行什么功能的?由于最近比較忙,時(shí)間有限,因此只有等到日后再架設(shè)環(huán)境進(jìn)行進(jìn)一步分析了,這需要分析Deamon Tools的完整安裝和使用過程。如果您已經(jīng)有此方面的經(jīng)歷或者知道相關(guān)的信息,也請?jiān)诖烁嬖V我,我們一同來探討。
? ? 謝謝大家!