msvcrt.dll是微軟在windows作業系統中提供的C語言運行庫執行檔案(Microsoft Visual C Runtime Library),其中提供了printf,malloc,strcpy等C語言庫函式的具體運行實現,並且為使用C/C++(Vc)編譯的程式提供了初始化(如獲取命令行參數)以及退出等功能。
基本介紹
外文名:msvcrt.dll
屬於:Windows
安全等級:0
間諜軟體:否
描述,進程信息,檔案信息,檔案hashes,版本信息,產生原因,如何解決,
描述
進程信息
msvcrt.dll是標準的微軟C運行庫檔案。
系統 DLL檔案: 否
常見錯誤: File Not Found, Missing File, Exception Errors
首先,我們讓該問題重現,即雙擊飛信客戶端的桌面圖示,讓其彈出該錯誤對話框。錯誤提示出現了,我們先不急著點擊“OK(確定)”按鈕,而是啟動一個調試程式。(本例中使用著名的Microsoft Windbg工具進行調試分析)然後在“File(檔案)”選單中選擇“Attach to a Process...(附加到一個進程)”。這裡之所以要選擇Attach to a Process就是因為我們要將調試器跟蹤到當前這個產生錯誤的進程,然後從記憶體中實時察看相關的執行緒堆疊甚至API函式的調用。Windbg中還支持其他的幾種類型的調試,須根據具體情形按需選擇。附加到該進程之後的結果如下圖所示:
然後,我們可以在圖中清晰地看到,當系統載入到“dll”時掛起,就是圖中的"Warning: Break-in time out, suspending.",在Windows中的表現也就是彈出了上述的錯誤對話框,並且我們還沒有點擊“確定”按鈕,於是程式暫時掛起。因此,我們可以判斷,啟動時載入的dll在執行某個函式過程的時候遇到了錯誤。那么究竟是什麼樣的函式呢?根據錯誤對話框的信息,我們可以初步猜測是MSVCRT.dll中的_except_handler4_common。於是,我們需要查找一下當前進程中有關該過程的現狀,所以執行"x msvcrt!_except_handler*"命令,返回的結果也在上圖中的底部。在Windbg中,x是查找符號的命令,可以用來查找全局變數的地址或過程的地址。比如x kernel32!*顯示Kernel32.dll中的所有可見變數,數據結構和過程。*號是通配符,代替任意的字元串,為了查找全部的,我們需要使用該通配符。(其實如果你執行“x msvcrt!_except_handler4_common”你會發現沒有任何結果,也就是找不到,其實這也就是出現該錯誤的原因,我們後文分析。因此退一步不輸入"4_common",查找所有_except_handler過程)
此時,我們可以進一步斷定,要么是DLL版本不對,要么就是dwmapi.dll有問題。而這個程式調用的是XP系統的systemroot.system32下面的MSVCRT.DLL,那么我們猜想,是不是Vista版本下的MSVCRT.DLL就存在一個新版本——即第4版的_exception_handler4呢?我們從Microsoft Windows Vista RTM中提取出位於systemroot.system32下面的MSVCRT.DLL,其版本為“7.0.6001.18000 (longhorn_rtm.080118-1840)”,然後再次使用Dependency Walker打開,發現其中果然存在該新的函式!即“_except_handler4_common”。如下圖所示: