金山毒霸引發(fā)系統(tǒng)崩潰問題技術(shù)分析
昨天晚上,金山論壇貼出一條公告:關(guān)于部分64位Windows 7/8用戶系統(tǒng)啟動(dòng)異常的解決辦法http://bbs.duba.net/thread-23083105-1-1.html
金山公告里,并沒有提bug原因是什么。不過這次確實(shí)中招的很多,群里昨天就有人苦逼正加著班,中間重啟下電腦系統(tǒng)就進(jìn)不去了。也幸虧這樣,金山偷偷摸摸更新驅(qū)動(dòng)搞攤系統(tǒng)被抓了個(gè)現(xiàn)行。簡單分析下原因吧:
一、為什么開機(jī)時(shí)會(huì)進(jìn)不去系統(tǒng),并提示0xC0000359錯(cuò)誤
操作系統(tǒng)在加載BOOT型驅(qū)動(dòng)文件時(shí),會(huì)調(diào)用到winload.exe! ImgpLoadPEImage,這個(gè)函數(shù)會(huì)判斷IMAGE_NT_HEADERS. FileHeader. Machine的值
如果在64位系統(tǒng)上,Machine的值為IMAGE_FILE_MACHINE_I386(0x014c),則不加載,并返回c0000359
二、什么驅(qū)動(dòng)惹得禍
Windows啟動(dòng)管理器顯示的很清楚:windows\system32\drivers\KAVBootC.sys
進(jìn)一步分析,金山毒霸有一個(gè)文件kdf.exe(md5: ecabc14be9008e79bee7696601927762,簽名時(shí)間2014-03-22 15:12:54),關(guān)機(jī)時(shí)改寫KAVBootC.sys服務(wù)的注冊(cè)表,沒有判斷操作系統(tǒng)是32位還是64位,就把該服務(wù)的文件統(tǒng)一寫成了\windows\system32\Drivers\KAVBootC.sys,導(dǎo)致64位機(jī)器上也會(huì)去加載32位的驅(qū)動(dòng)程序,系統(tǒng)無法啟動(dòng);實(shí)際上,64位系統(tǒng)對(duì)應(yīng)的驅(qū)動(dòng)文件名應(yīng)該是KAVBootC64.sys
在昨晚金山更新的版本里,kdf.exe對(duì)這個(gè)問題進(jìn)行了修復(fù),加上了先判斷是32位系統(tǒng)還是64位系統(tǒng)的邏輯。(md5: 0ac5e33f91fb93c62d2db86b11446f76,簽名時(shí)間2014-03-22 18:12:05)
問問金山
你們軟件更新發(fā)布前不做測試的嗎?
之前跟微軟補(bǔ)丁沖突,金山還聲明說“微軟沒有對(duì)補(bǔ)丁做兼容性測試”,這次可是金山毒霸自己更新程序。這么明顯的bug,在64位機(jī)器上更新后只要關(guān)機(jī)或者重啟,100%必現(xiàn)系統(tǒng)無法啟動(dòng)的情況,竟然就草率發(fā)布了。
根據(jù)我這邊一個(gè)數(shù)據(jù),X64的比例大概在10%。昨天金山事故時(shí)間段有三個(gè)小時(shí),而且都在白天,估算占全天用戶量的15%-20%。按金山自己宣傳的上億用戶,就算周末只有一半人用電腦吧,至少也是5000w*10%*15%=75w臺(tái)電腦。難怪windows7貼吧昨天被刷屏。按某人說法,金山真成電腦維修商的好伙伴了。