決電腦運(yùn)行慢(8s優(yōu)化) |
修復(fù)Windows顯示問(wèn)題,顯示器上的文字無(wú)法讀取 |
解決光驅(qū)不讀盤或無(wú)法刻錄光盤的問(wèn)題 |
Office2010卸載工具forWinXP |
系統(tǒng)慢、電腦性能變差自動(dòng)診斷和修復(fù) |
自動(dòng)診斷并修復(fù)Windows音頻錄制問(wèn)題 |
邁克菲(McAfee)卸載工具forwinxp/win7/8/10 |
解決windows8/windows10系統(tǒng)電池?zé)o法充滿問(wèn)題(yoga專用) |
自動(dòng)診斷并修復(fù)Windows音頻播放問(wèn)題 |
桌面快捷方式小箭頭去除/恢復(fù)工具winxp/7/8 |
修復(fù)當(dāng)IE掛起或死機(jī)時(shí)InternetExplorer加載項(xiàng)的問(wèn)題 |
解決游戲不能全屏問(wèn)題 |
修復(fù)IE問(wèn)題:IE速度慢、網(wǎng)頁(yè)崩潰、IE不響應(yīng)、報(bào)錯(cuò)和不穩(wěn)定 |
主機(jī)編號(hào)檢測(cè)工具 |
自動(dòng)診斷并修復(fù)Windows防火墻服務(wù)問(wèn)題forwin7/8/8.1/10 |
修復(fù)windows系統(tǒng)安全問(wèn)題,修復(fù)防火墻,保護(hù)電腦系統(tǒng) |
解決IE運(yùn)行時(shí)報(bào)錯(cuò) |
自動(dòng)診斷和修復(fù)Windows系統(tǒng)安全問(wèn)題,修復(fù)安全設(shè)置 |
IE瀏覽器修復(fù)工具 |
解決電腦關(guān)機(jī)慢問(wèn)題 |
Windows系統(tǒng)打印功能檢測(cè)修復(fù)工具 |
解決運(yùn)行WindowsUpdate報(bào)錯(cuò),無(wú)法更新等問(wèn)題winxp |
診斷并修復(fù)WindowsUSB問(wèn)題 |
關(guān)閉磁盤開機(jī)自檢解決開機(jī)自檢時(shí)死機(jī)問(wèn)題 |
修復(fù)WindowsUpdate問(wèn)題 |
修復(fù)Win8/8.1/10應(yīng)用商店無(wú)法打開 |
修復(fù)軟件安裝問(wèn)題和軟件卸載問(wèn)題 |
解決Win8/10應(yīng)用商店中安裝應(yīng)用時(shí)顯示掛起的問(wèn)題 |
啟用或禁用Windows7Sidebar(邊欄)工具 |
聯(lián)想win8開始菜單 |
Office2003卸載工具forWinXP/7 |
Office2007卸載工具forWinXP |
診斷和修復(fù)硬件相關(guān)(未安裝驅(qū)動(dòng)、驅(qū)動(dòng)問(wèn)題、設(shè)備禁用等)問(wèn)題 |
Aero視覺效果問(wèn)題 |
觸控板控制工具 |
Windows文件和文件夾問(wèn)題 |
攝像頭鍵值問(wèn)題(代碼19) |
修復(fù)Windows7和Vista圖片庫(kù)問(wèn)題 |
解決安裝Microsoft.NETFramework4的更新時(shí)間過(guò)長(zhǎng)問(wèn)題 |
啟用所有隧道的接口的IPv6-win7 |
修復(fù)WindowsSearch崩潰或不顯示結(jié)果的問(wèn)題 |
創(chuàng)建桌面快捷圖標(biāo)工具 |
Windows系統(tǒng)優(yōu)化:筆記本電源使用和電池壽命的問(wèn)題 |
攝像頭預(yù)覽失敗修復(fù)工具 |
啟用IPv6及其組件forwin7 |
自動(dòng)獲取ip地址工具 |
Windows優(yōu)化:常見系統(tǒng)優(yōu)化維護(hù) |
禁用所有隧道的接口的IPv6forwin7 |
設(shè)備管理器中光驅(qū)嘆號(hào)修復(fù)工具 |
禁用IPv6及其組件forwin7 |
高分屏顯示模糊修復(fù)工具 |
IE10_11無(wú)法啟動(dòng) |
修復(fù)顯示驅(qū)動(dòng)程序停止響應(yīng),并已恢復(fù)錯(cuò)誤 |
SuperFish檢測(cè)及專用卸載工具 |
IE主頁(yè)設(shè)置工具 |
桌面圖標(biāo)大小異常修復(fù)工具 |
開機(jī)無(wú)法加載Explorer |
攝像頭被占用修復(fù)工具 |
計(jì)算機(jī)中盤符丟失修復(fù)工具 |
攝像頭嘆號(hào)修復(fù)工具 |
內(nèi)存不能為read修復(fù)工具 |
安全刪除硬件圖標(biāo)丟失修復(fù)工具 |
整數(shù)分區(qū)計(jì)算工具 |
音量圖標(biāo)無(wú)法設(shè)置修復(fù)工具 |
打開IE默認(rèn)最大化修復(fù)工具 |
本地連接圖標(biāo)丟失修復(fù)工具 |
聯(lián)想驅(qū)動(dòng)管理工具 |
計(jì)算機(jī)管理打開異常或者沒有反應(yīng) |
解決不能看在線視頻問(wèn)題 |
關(guān)閉驅(qū)動(dòng)自動(dòng)更新 |
修改windows系統(tǒng)密碼工具 |
Pokki官方卸載工具 |
電腦開機(jī)提示報(bào)錯(cuò)svchost.exe應(yīng)用程序錯(cuò)誤修復(fù)工具 |
系統(tǒng)時(shí)間顯示錯(cuò)誤修復(fù)工具 |
機(jī)器睡眠無(wú)法喚醒修復(fù)工具 |
Win8.1/10Flash插件修復(fù)工具 |
寬帶撥號(hào)報(bào)錯(cuò)711修復(fù)工具 |
強(qiáng)力卸載工具 |
亮度調(diào)節(jié)工具 |
Synaptics觸控板如何外接鼠標(biāo)后自動(dòng)禁用觸控板 |
如何取消win7圖標(biāo)右下角的小盾牌 |
解決windows無(wú)法更新,應(yīng)用商店無(wú)法打開 |
在開始菜單創(chuàng)建關(guān)機(jī)快捷方式 |
解決強(qiáng)制要求驅(qū)動(dòng)簽名 |
win8/10連接無(wú)線網(wǎng)絡(luò)提示“網(wǎng)絡(luò)連接受限”,優(yōu)化TCP/IP協(xié)議工具 |
Aero特效診斷工具 |
win7/win8/win10下睡眠不斷網(wǎng) |
藍(lán)牙傳輸文件工具 |
硬件信息在線檢測(cè) |
藍(lán)屏分析診斷工具 |
添加攝像頭快捷方式 |
Fn+F5快捷鍵修復(fù)工具 |
關(guān)閉或啟用windows自動(dòng)更新 |
有線網(wǎng)絡(luò)修復(fù)工具 |
一鍵重啟或關(guān)機(jī)工具 |
設(shè)置無(wú)線共享工具 |
解決運(yùn)行WindowsUpdate報(bào)錯(cuò),無(wú)法更新等問(wèn)題win7/8 |
如何查看系統(tǒng)密鑰 |
分辨率設(shè)置工具 |
win8/8.1/10磁盤占用率高修復(fù)工具 |
Windows10RS1微軟官方升級(jí)工具“易升” |
硬盤保護(hù)系統(tǒng)常見問(wèn)題匯總 |
Win10升級(jí)工具 |
設(shè)置電源管理為“高性能” |
快速打開Windows常用工具 |
無(wú)線網(wǎng)卡開關(guān)切換工具 |
解決系統(tǒng)文件異常問(wèn)題(sfc/scannow) |
無(wú)線網(wǎng)絡(luò)修復(fù)工具 |
一鍵打開系統(tǒng)還原 |
MIIX5(MIIX510)外接原裝鍵盤FN功能翻轉(zhuǎn) |
TYXYWKHD藍(lán)屏工具 |
MIIX5(510)keyboardFN |
快速設(shè)置虛擬內(nèi)存工具 |
桌面圖標(biāo)關(guān)聯(lián)修復(fù)工具(快捷方式圖標(biāo)變?yōu)槟骋怀绦驁D標(biāo)) |
快速卸載Windows自動(dòng)更新 |
啟用/禁用超級(jí)管理員工具 |
新建賬戶工具 |
解決intel3165/3160無(wú)線網(wǎng)卡無(wú)法開啟網(wǎng)絡(luò)承載 |
Windows10系統(tǒng)應(yīng)用商店打不開或閃退 |
免密碼登錄Windows系統(tǒng)工具 |
預(yù)裝office2016家庭版出現(xiàn)試用、購(gòu)買、激活的提示修復(fù)工具 |
office2016家庭版疑難解答工具 |
解決windows10系統(tǒng)開始菜單異常 |
解決Win10電源圖標(biāo)不顯示且圖標(biāo)開關(guān)灰色 |
Windows.old文件夾刪除工具 |
鍵盤按鍵失靈工具 |
DirectX修復(fù)檢測(cè)工具 |
VC++安裝工具 |
.NETFramework安裝、卸載工具 |
LSP/Winsock修復(fù)工具 |
處理器&內(nèi)存顯示“不可用”修復(fù)工具 |
比特幣勒索病毒預(yù)防專家 |
比特幣勒索病毒端口恢復(fù)工具 |
MIIX4(MIIX700)外接原裝鍵盤FN功能翻轉(zhuǎn)工具 |
文件和打印機(jī)共享功能修復(fù)工具 |
文件共享工具 |
游戲彈出bugsplat報(bào)錯(cuò)修復(fù)工具 |
IE主頁(yè)設(shè)置已損壞修復(fù)工具 |
游戲報(bào)錯(cuò)提示缺少xinput*.dll文件的修復(fù)工具 |
安裝游戲提示“出現(xiàn)錯(cuò)誤,并非所有功能被成功更改”的修復(fù)工具 |
系統(tǒng)服務(wù)修復(fù)工具 |
輸入法修復(fù)工具 |
網(wǎng)頁(yè)游戲修復(fù)工具 |
定時(shí)關(guān)機(jī)工具 |
桌面圖標(biāo)關(guān)聯(lián)修復(fù)工具(快捷方式圖標(biāo)變?yōu)槲粗绦驁D標(biāo)) |
WinXP/7系統(tǒng)下的Flash修復(fù)工具 |
資源管理器打不開修復(fù)工具 |
靜態(tài)IP設(shè)置工具 |
解決運(yùn)行WindowsUpdate報(bào)錯(cuò),無(wú)法更新等問(wèn)題win10 |
Office2007/2010/2013/365/2016卸載工具 |
電腦垃圾清理工具 |
下載地址:關(guān)注評(píng)論+轉(zhuǎn)發(fā)+私信回復(fù)
(人工私信回復(fù)有延遲,請(qǐng)理解)
關(guān)注小哥,必出精品。
尋找熱愛表達(dá)的你#
摘要:本文深入探討了兩次全球性大規(guī)模 Windows 死機(jī)事件,主角是 CrowdStrike 創(chuàng)始人喬治·庫(kù)爾茨。文章詳細(xì)闡述了他與 2010 年邁克菲以及近日 CrowdStrike 軟件更新導(dǎo)致的藍(lán)屏死機(jī)事件的關(guān)聯(lián)。通過(guò)回顧這兩次事件的經(jīng)過(guò)、影響以及喬治·庫(kù)爾茨在其中的角色,揭示了軟件更新引發(fā)的嚴(yán)重問(wèn)題以及相關(guān)企業(yè)在網(wǎng)絡(luò)安全領(lǐng)域面臨的挑戰(zhàn)。同時(shí),分析了此類事件對(duì)各行業(yè)的沖擊,并探討了如何避免類似情況再次發(fā)生的措施和建議。
關(guān)鍵詞:CrowdStrike;喬治·庫(kù)爾茨;邁克菲;藍(lán)屏死機(jī)事件;軟件更新;網(wǎng)絡(luò)安全
一、引言
在當(dāng)今數(shù)字化高度發(fā)展的時(shí)代,計(jì)算機(jī)系統(tǒng)的穩(wěn)定運(yùn)行對(duì)于個(gè)人、企業(yè)乃至整個(gè)社會(huì)都至關(guān)重要。然而,軟件更新這一看似平常的操作,卻在某些情況下引發(fā)了全球性的大規(guī)模 Windows 死機(jī)事件,給眾多用戶帶來(lái)了極大的困擾和損失。本文將聚焦于兩次這樣的事件,深入剖析其背后的原因、影響以及相關(guān)責(zé)任人。
二、CrowdStrike 與喬治·庫(kù)爾茨
(一)CrowdStrike 公司簡(jiǎn)介
CrowdStrike 是一家提供在線安全解決方案的知名公司,專注于提供基于云計(jì)算的端點(diǎn)保護(hù)平臺(tái)。該公司成立于 2011 年,總部位于美國(guó)加利福尼亞州。其主要產(chǎn)品 Falcon 平臺(tái)利用人工智能和機(jī)器學(xué)習(xí)技術(shù)來(lái)檢測(cè)、預(yù)防和響應(yīng)網(wǎng)絡(luò)威脅,在網(wǎng)絡(luò)安全領(lǐng)域具有重要地位。
(二)喬治·庫(kù)爾茨的背景
喬治·庫(kù)爾茨在網(wǎng)絡(luò)安全領(lǐng)域有著豐富的經(jīng)驗(yàn)和影響力。他于 2004 年加入邁克菲,擔(dān)任高級(jí)副總裁兼風(fēng)險(xiǎn)管理總監(jiān)理,并在 2009 年 10 月晉升為首席技術(shù)官。2011 年離開邁克菲后,創(chuàng)立了 CrowdStrike。
三、2010 年邁克菲大規(guī)模藍(lán)屏死機(jī)事件回顧
2010 年 4 月,一次嚴(yán)重的藍(lán)屏死機(jī)事件席卷全球大量 Windows XP 系統(tǒng)。而這一事件的源頭,竟是邁克菲發(fā)布的病毒庫(kù)更新 dat5958 版。
當(dāng)時(shí),邁克菲發(fā)布的這個(gè)更新版本出現(xiàn)了嚴(yán)重的誤報(bào),將 Windows 核心文件 svchost.exe 錯(cuò)誤地標(biāo)記為病毒。svchost.exe 是 Windows 操作系統(tǒng)中一個(gè)至關(guān)重要的進(jìn)程,負(fù)責(zé)運(yùn)行許多系統(tǒng)服務(wù)。由于邁克菲的誤報(bào),大量計(jì)算機(jī)系統(tǒng)將該文件當(dāng)作病毒進(jìn)行處理,從而導(dǎo)致了藍(lán)屏死機(jī)現(xiàn)象的大規(guī)模出現(xiàn)。
這一事件給全球范圍內(nèi)的用戶帶來(lái)了巨大的困擾和損失。許多企業(yè)的業(yè)務(wù)運(yùn)營(yíng)受到嚴(yán)重影響,工作效率大幅下降;個(gè)人用戶也面臨數(shù)據(jù)丟失、工作中斷等問(wèn)題。在一些關(guān)鍵領(lǐng)域,如醫(yī)療保健行業(yè),醫(yī)院的正常工作秩序被打亂,可能導(dǎo)致病人的治療延誤;金融領(lǐng)域的銀行系統(tǒng)也遭遇故障,影響了客戶的業(yè)務(wù)辦理。
(一)事件的經(jīng)過(guò)與原因分析
2010 年 4 月的某一天,用戶們像往常一樣開啟他們的 Windows XP 電腦,卻驚訝地發(fā)現(xiàn)屏幕上出現(xiàn)了藍(lán)屏死機(jī)的畫面。經(jīng)過(guò)調(diào)查,發(fā)現(xiàn)是邁克菲的病毒庫(kù)更新出現(xiàn)了問(wèn)題。
邁克菲作為一家知名的安全軟件公司,其病毒庫(kù)更新的目的是為了保護(hù)用戶的計(jì)算機(jī)免受新出現(xiàn)的病毒和惡意軟件的威脅。然而,在這個(gè)特定的更新版本(dat5958 版)中,出現(xiàn)了嚴(yán)重的誤報(bào)情況。
原因可能是多方面的。首先,病毒庫(kù)的更新過(guò)程可能存在缺陷或錯(cuò)誤,導(dǎo)致對(duì)正常文件的誤識(shí)別。其次,可能是病毒庫(kù)的算法或規(guī)則出現(xiàn)了問(wèn)題,使得原本不應(yīng)被判定為病毒的 svchost.exe 文件被錯(cuò)誤地標(biāo)記。此外,測(cè)試環(huán)節(jié)可能不夠充分,未能在發(fā)布前發(fā)現(xiàn)這一嚴(yán)重的誤報(bào)問(wèn)題。
(二)對(duì)各行業(yè)的影響
(三)喬治·庫(kù)爾茨在事件中的責(zé)任
作為邁克菲當(dāng)時(shí)的首席技術(shù)官,喬治·庫(kù)爾茨對(duì)這一事件負(fù)有直接的管理責(zé)任。他負(fù)責(zé)領(lǐng)導(dǎo)和監(jiān)督公司的技術(shù)團(tuán)隊(duì),包括病毒庫(kù)的開發(fā)、測(cè)試和更新等工作。
在這次事件中,喬治·庫(kù)爾茨的管理決策和技術(shù)監(jiān)督可能存在不足之處。他未能確保病毒庫(kù)更新的準(zhǔn)確性和可靠性,沒有及時(shí)發(fā)現(xiàn)并解決誤報(bào)問(wèn)題,從而導(dǎo)致了如此大規(guī)模的藍(lán)屏死機(jī)事件的發(fā)生。
四、近日 CrowdStrike 軟件更新引發(fā)的全球性藍(lán)屏死機(jī)事件
(一)事件的爆發(fā)
快科技 7 月 21 日消息,近日,全球 850 萬(wàn)臺(tái) Windows 設(shè)備因 CrowdStrike 軟件更新而遭遇藍(lán)屏死機(jī),再次引發(fā)了廣泛關(guān)注和巨大的潛在影響。
(二)事件的具體情況
與 2010 年的邁克菲事件相似,CrowdStrike 在發(fā)布的軟件更新中出現(xiàn)了問(wèn)題。盡管具體的原因尚未完全明確,但初步判斷是軟件更新與 Windows 系統(tǒng)的兼容性或某些內(nèi)部錯(cuò)誤導(dǎo)致了系統(tǒng)的崩潰。
這一事件迅速在全球范圍內(nèi)蔓延,大量用戶的 Windows 設(shè)備陷入藍(lán)屏死機(jī)狀態(tài),無(wú)法正常使用。無(wú)論是個(gè)人用戶還是企業(yè)用戶,都受到了嚴(yán)重的影響。
(三)對(duì)各行業(yè)的沖擊
(四)喬治·庫(kù)爾茨的關(guān)聯(lián)與責(zé)任探討
令人意想不到的是,CrowdStrike 的創(chuàng)始人喬治·庫(kù)爾茨竟與此次事件也有著千絲萬(wàn)縷的聯(lián)系。他曾在 2004 年加入邁克菲,擔(dān)任高級(jí)副總裁兼風(fēng)險(xiǎn)管理總監(jiān)理,并于 2009 年 10 月晉升為首席技術(shù)官。而在 2010 年的邁克菲大規(guī)模藍(lán)屏死機(jī)事件中,他作為邁克菲的首席技術(shù)官,對(duì)當(dāng)時(shí)的問(wèn)題負(fù)有直接管理責(zé)任。
盡管目前還不能確定喬治·庫(kù)爾茨在此次 CrowdStrike 事件中具體扮演了怎樣的角色,但他的過(guò)往經(jīng)歷使得人們對(duì)他在網(wǎng)絡(luò)安全和軟件更新管理方面的能力產(chǎn)生了質(zhì)疑。
五、兩次事件的比較與分析
(一)相似之處
兩次事件均由軟件更新引發(fā),無(wú)論是邁克菲的病毒庫(kù)更新還是 CrowdStrike 的軟件更新,都成為了導(dǎo)致大規(guī)模藍(lán)屏死機(jī)事件的直接原因,這凸顯了軟件更新過(guò)程中潛在的風(fēng)險(xiǎn)和可能出現(xiàn)的問(wèn)題。而且,兩次事件都對(duì)全球范圍造成了廣泛影響,波及大量的 Windows 設(shè)備用戶,不分地域和行業(yè),給各個(gè)領(lǐng)域都帶來(lái)了嚴(yán)重的沖擊和損失。此外,兩次事件都涉及到了操作系統(tǒng)的重要系統(tǒng)和進(jìn)程,2010 年邁克菲事件中是 Windows 核心文件 svchost.exe,而此次 CrowdStrike 事件中可能是與系統(tǒng)關(guān)鍵部分相關(guān)的某些因素。
(二)不同之處
首先是時(shí)間間隔,兩次事件相隔數(shù)年,反映了在不同時(shí)期網(wǎng)絡(luò)安全和軟件更新管理方面的挑戰(zhàn)和變化。
其次,公司背景與規(guī)模有所不同。邁克菲是老牌的安全軟件公司,而 CrowdStrike 是相對(duì)較新但在網(wǎng)絡(luò)安全領(lǐng)域具有重要影響力的企業(yè)。
再者,隨著時(shí)間的推移,技術(shù)發(fā)展與復(fù)雜性也有所改變。如今的網(wǎng)絡(luò)環(huán)境更加復(fù)雜,軟件系統(tǒng)的集成度和關(guān)聯(lián)性更高,一個(gè)軟件的問(wèn)題可能會(huì)引發(fā)更多連鎖反應(yīng)。在 2010 年,網(wǎng)絡(luò)安全的重點(diǎn)可能更多地集中在病毒和惡意軟件的檢測(cè)與清除上;而在當(dāng)前,隨著云計(jì)算、物聯(lián)網(wǎng)等技術(shù)的發(fā)展,網(wǎng)絡(luò)安全的范疇更加廣泛,涉及到更多層面和環(huán)節(jié)。
另外,從事件的具體情況來(lái)看,雖然都是軟件更新導(dǎo)致的藍(lán)屏死機(jī),但每次的原因和表現(xiàn)可能會(huì)有所差異。邁克菲事件中是病毒庫(kù)更新的誤報(bào),將正常文件當(dāng)作病毒處理;而 CrowdStrike 此次事件的具體原因尚未完全明確,但初步判斷是軟件更新與 Windows 系統(tǒng)的兼容性或某些內(nèi)部錯(cuò)誤導(dǎo)致了系統(tǒng)崩潰。
(三)喬治·庫(kù)爾茨的角色變化
在 2010 年邁克菲事件中,喬治·庫(kù)爾茨擔(dān)任邁克菲的首席技術(shù)官,對(duì)當(dāng)時(shí)的問(wèn)題負(fù)有直接管理責(zé)任。而在近日的 CrowdStrike 事件中,盡管目前還不能確定他具體扮演了怎樣的角色,但他作為 CrowdStrike 的創(chuàng)始人,其公司的軟件更新引發(fā)了如此大規(guī)模的問(wèn)題,難免使人們對(duì)他在網(wǎng)絡(luò)安全和軟件更新管理方面的能力產(chǎn)生質(zhì)疑。
他在網(wǎng)絡(luò)安全領(lǐng)域的經(jīng)驗(yàn)和地位使得他在這兩次事件中的關(guān)聯(lián)備受關(guān)注。盡管不能簡(jiǎn)單地將所有責(zé)任歸咎于他個(gè)人,但這兩次事件都提醒我們,即使是經(jīng)驗(yàn)豐富的專業(yè)人士和知名企業(yè),也可能在軟件更新和網(wǎng)絡(luò)安全管理上出現(xiàn)疏漏,從而導(dǎo)致嚴(yán)重的后果。
(四)對(duì)行業(yè)的啟示
這兩次事件給整個(gè)網(wǎng)絡(luò)安全行業(yè)帶來(lái)了深刻的啟示。軟件供應(yīng)商必須高度重視軟件更新的質(zhì)量和測(cè)試工作,確保更新不會(huì)引入新的嚴(yán)重問(wèn)題。在發(fā)布更新之前,要進(jìn)行充分的測(cè)試,包括各種環(huán)境和場(chǎng)景的模擬,以盡可能發(fā)現(xiàn)潛在的兼容性問(wèn)題和錯(cuò)誤。
同時(shí),企業(yè)和用戶也應(yīng)該對(duì)軟件更新保持一定的警惕性。盡管更新通常是為了改進(jìn)和增強(qiáng)安全性,但也不能盲目地立即安裝更新,尤其是在一些關(guān)鍵系統(tǒng)上。可以適當(dāng)延遲更新,觀察其他用戶的反饋,或者在測(cè)試環(huán)境中進(jìn)行驗(yàn)證。
此外,建立應(yīng)急響應(yīng)機(jī)制至關(guān)重要。當(dāng)出現(xiàn)類似的大規(guī)模死機(jī)事件時(shí),能夠迅速采取措施,減少損失和影響。這包括及時(shí)發(fā)布解決方案、提供技術(shù)支持,以及與相關(guān)方面進(jìn)行有效的溝通和協(xié)調(diào)。
對(duì)于喬治·庫(kù)爾茨個(gè)人而言,他可能需要認(rèn)真反思在網(wǎng)絡(luò)安全和軟件管理方面的策略和方法,加強(qiáng)對(duì)公司產(chǎn)品質(zhì)量的把控,以恢復(fù)公眾對(duì)他和 CrowdStrike 公司的信任。
而整個(gè)行業(yè)也需要從這樣的事件中吸取教訓(xùn),加強(qiáng)自律和規(guī)范,提高整體的網(wǎng)絡(luò)安全水平,避免類似的事件再次發(fā)生,保障用戶的利益和社會(huì)的正常運(yùn)轉(zhuǎn)。只有通過(guò)不斷地總結(jié)經(jīng)驗(yàn)、改進(jìn)技術(shù)和管理流程,才能更好地應(yīng)對(duì)日益復(fù)雜的網(wǎng)絡(luò)安全挑戰(zhàn)。
未來(lái),網(wǎng)絡(luò)安全公司和相關(guān)企業(yè)需要更加注重技術(shù)研發(fā)和管理流程的優(yōu)化,加強(qiáng)與其他安全機(jī)構(gòu)和廠商的合作與交流,共同應(yīng)對(duì)不斷變化的網(wǎng)絡(luò)威脅。同時(shí),用戶也應(yīng)該增強(qiáng)自身的網(wǎng)絡(luò)安全意識(shí),了解基本的安全知識(shí)和操作規(guī)范,以降低受到此類事件影響的風(fēng)險(xiǎn)。通過(guò)各方的共同努力,才能夠營(yíng)造一個(gè)更加安全可靠的網(wǎng)絡(luò)環(huán)境。
. 多個(gè)服務(wù)共享一個(gè)Svchost.exe進(jìn)程利與弊
windows 系統(tǒng)服務(wù)分為獨(dú)立進(jìn)程和共享進(jìn)程兩種,在windows NT時(shí)只有服務(wù)器管理器SCM(Services.exe)有多個(gè)共享服務(wù),隨著系統(tǒng)內(nèi)置服務(wù)的增加,在windows 2000年ms又把很多服務(wù)做成共享方式,由svchost.exe啟動(dòng)。windows 2000一般有2個(gè)svchost進(jìn)程,一個(gè)是RPCSS(Remote Procedure Call)服務(wù)進(jìn)程,另外一個(gè)則是由很多服務(wù)共享的一個(gè)svchost.exe。而在windows XP中,則一般有4個(gè)以上的svchost.exe服務(wù)進(jìn)程,windows 2003 server中則更多,可以看出把更多的系統(tǒng)內(nèi)置服務(wù)以共享進(jìn)程方式由svchost啟動(dòng)是ms的一個(gè)趨勢(shì)。這樣做在一定程度上減少了系統(tǒng)資源的消耗,不過(guò)也帶來(lái)一定的不穩(wěn)定因素,因?yàn)槿魏我粋€(gè)共享進(jìn)程的服務(wù)因?yàn)殄e(cuò)誤退出進(jìn)程就會(huì)導(dǎo)致整個(gè)進(jìn)程中的所有服務(wù)都退出。另外就是有一點(diǎn)安全隱患,首先要介紹一下 svchost.exe的實(shí)現(xiàn)機(jī)制。
2. Svchost原理
Svchost本身只是作為服務(wù)宿主,并不實(shí)現(xiàn)任何服務(wù)功能,需要Svchost啟動(dòng)的服務(wù)以動(dòng)態(tài)鏈接庫(kù)形式實(shí)現(xiàn),在安裝這些服務(wù)時(shí),把服務(wù)的可執(zhí)行程序指向svchost,啟動(dòng)這些服務(wù)時(shí)由svchost調(diào)用相應(yīng)服務(wù)的動(dòng)態(tài)鏈接庫(kù)來(lái)啟動(dòng)服務(wù)。
那么svchost如何知道某一服務(wù)是由哪個(gè)動(dòng)態(tài)鏈接庫(kù)負(fù)責(zé)呢?這不是由服務(wù)的可執(zhí)行程序路徑中的參數(shù)部分提供的,而是服務(wù)在注冊(cè)表中的參數(shù)設(shè)置的,注冊(cè)表中服務(wù)下邊有一個(gè)Parameters子鍵其中的ServiceDll表明該服務(wù)由哪個(gè)動(dòng)態(tài)鏈接庫(kù)負(fù)責(zé)。并且所有這些服務(wù)動(dòng)態(tài)鏈接庫(kù)都必須要導(dǎo)出一個(gè) ServiceMain()函數(shù),用來(lái)處理服務(wù)任務(wù)。
例如rpcss(Remote Procedure Call)在注冊(cè)表中的位置是 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\RpcSs,它的參數(shù)子鍵Parameters里有這樣一項(xiàng):
“ServiceDll”=REG_EXPAND_SZ:”%SystemRoot%\system32\rpcss.dll”
當(dāng)啟動(dòng)rpcss服務(wù)時(shí),svchost就會(huì)調(diào)用rpcss.dll,并且執(zhí)行其ServiceMain()函數(shù)執(zhí)行具體服務(wù)。
既然這些服務(wù)是使用共享進(jìn)程方式由svchost啟動(dòng)的,為什么系統(tǒng)中會(huì)有多個(gè)svchost進(jìn)程呢?ms把這些服務(wù)分為幾組,同組服務(wù)共享一個(gè)svchost進(jìn)程,不同組服務(wù)使用多個(gè)svchost進(jìn)程,組的區(qū)別是由服務(wù)的可執(zhí)行程序后邊的參數(shù)決定的。
例如rpcss在注冊(cè)表中 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\RpcSs 有這樣一項(xiàng):
“ImagePath”=REG_EXPAND_SZ:”%SystemRoot%\system32\svchost -k rpcss”
因此rpcss就屬于rpcss組,這在服務(wù)管理控制臺(tái)也可以看到。
svchost的所有組和組內(nèi)的所有服務(wù)都在注冊(cè)表的如下位置: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Svchost,例如windows 2000共有4組rpcss、netsvcs、wugroup、BITSgroup,其中最多的就是netsvcs=REG_MULTI_SZ: EventSystem.Ias.Iprip.Irmon.Netman.Nwsapagent.Rasauto.Rasman.Remoteaccess.SENS.Sharedaccess.Tapisrv.Ntmssvc.wzcsvc..
在啟動(dòng)一個(gè)svchost.exe負(fù)責(zé)的服務(wù)時(shí),服務(wù)管理器如果遇到可執(zhí)行程序內(nèi)容ImagePath已經(jīng)存在于服務(wù)管理器的映象庫(kù)中,就不在啟動(dòng)第2個(gè)進(jìn)程svchost,而是直接啟動(dòng)服務(wù)。這樣就實(shí)現(xiàn)了多個(gè)服務(wù)共享一個(gè)svchost進(jìn)程。
3. Svchost代碼
現(xiàn)在我們基本清楚svchost的原理了,但是要自己寫一個(gè)DLL形式的服務(wù),由svchost來(lái)啟動(dòng),僅有上邊的信息還有些問(wèn)題不是很清楚。比如我們?cè)趯?dǎo)出的ServiceMain()函數(shù)中接收的參數(shù)是ANSI還是Unicode?我們是否需要調(diào)用 RegisterServiceCtrlHandler和StartServiceCtrlDispatcher來(lái)注冊(cè)服務(wù)控制及調(diào)度函數(shù)?
這些問(wèn)題要通過(guò)查看svchost代碼獲得。下邊的代碼是windows 2000+ service pack 4 的svchost反匯編片段,可以看出svchost程序還是很簡(jiǎn)單的。
主函數(shù)首先調(diào)用ProcCommandLine()對(duì)命令行進(jìn)行分析,獲得要啟動(dòng)的服務(wù)組,然后調(diào)用SvcHostOptions()查詢?cè)摲?wù)組的選項(xiàng)和服務(wù)組的所有服務(wù),并使用一個(gè)數(shù)據(jù)結(jié)構(gòu) svcTable 來(lái)保存這些服務(wù)及其服務(wù)的DLL,然后調(diào)用PrepareSvcTable() 函數(shù)創(chuàng)建SERVICE_TABLE_ENTRY 結(jié)構(gòu),把所有處理函數(shù)SERVICE_MAIN_FUNCTION 指向自己的一個(gè)函數(shù)FuncServiceMain(),最后調(diào)用API StartServiceCtrlDispatcher() 注冊(cè)這些服務(wù)的調(diào)度函數(shù)。
;===============================Main Funcion===========================================
.text:010010B8 public start
.text:010010B8 start proc near
.text:010010B8 push esi
.text:010010B9 push edi
.text:010010BA push offset sub_1001EBA ; lpTopLevelExceptionFilter
.text:010010BF xor edi, edi
.text:010010C1 call ds:SetUnhandledExceptionFilter
.text:010010C7 push 1 ; uMode
.text:010010C9 call ds:SetErrorMode
.text:010010CF call ds:GetProcessHeap
.text:010010D5 push eax
.text:010010D6 call sub_1001142
.text:010010DB mov eax, offset dword_1003018
.text:010010E0 push offset unk_1003000 ; lpCriticalSection
.text:010010E5 mov dword_100301C, eax
.text:010010EA mov dword_1003018, eax
.text:010010EF call ds:InitializeCriticalSection
.text:010010F5 call ds:GetCommandLineW
.text:010010FB push eax ; lpString
.text:010010FC call ProcCommandLine
.text:01001101 mov esi, eax
.text:01001103 test esi, esi
.text:01001105 jz short lab_doservice
.text:01001107 push esi
.text:01001108 call SvcHostOptions
.text:0100110D call PrepareSvcTable
.text:01001112 mov edi, eax ; SERVICE_TABLE_ENTRY returned
.text:01001114 test edi, edi
.text:01001116 jz short loc_1001128
.text:01001118 mov eax, [esi+10h]
.text:0100111B test eax, eax
.text:0100111D jz short loc_1001128
.text:0100111F push dword ptr [esi+14h] ; dwCapabilities
.text:01001122 push eax ; int
.text:01001123 call InitializeSecurity
.text:01001128
.text:01001128 loc_1001128: ; CODE XREF: start+5Ej
.text:01001128 ; start+65j
.text:01001128 push esi ; lpMem
.text:01001129 call HeapFreeMem
.text:0100112E
.text:0100112E lab_doservice: ; CODE XREF: start+4Dj
.text:0100112E test edi, edi
.text:01001130 jz ExitProgram
.text:01001136 push edi ; lpServiceStartTable
.text:01001137 call ds:StartServiceCtrlDispatcherW
.text:0100113D jmp ExitProgram
.text:0100113D start endp
;===============================Main Funcion end===========================================
由于svchost為該組的所有服務(wù)都注冊(cè)了svchost中的一個(gè)處理函數(shù),因此每次啟動(dòng)任何一個(gè)服務(wù)時(shí),服務(wù)管理器SCM都會(huì)調(diào)用 FuncServiceMain() 這個(gè)函數(shù)。這個(gè)函數(shù)使用 svcTable 查詢要啟動(dòng)的服務(wù)使用的DLL,調(diào)用DLL導(dǎo)出的ServiceMain()函數(shù)來(lái)啟動(dòng)服務(wù),然后返回。
;==============================FuncServiceMain()===========================================
.text:01001504 FuncServiceMain proc near ; DATA XREF: PrepareSvcTable+44o
.text:01001504
.text:01001504 arg_0=dword ptr 8
.text:01001504 arg_4=dword ptr 0Ch
.text:01001504
.text:01001504 push ecx
.text:01001505 mov eax, [esp+arg_4]
.text:01001509 push ebx
.text:0100150A push ebp
.text:0100150B push esi
.text:0100150C mov ebx, offset unk_1003000
.text:01001511 push edi
.text:01001512 mov edi, [eax]
.text:01001514 push ebx
.text:01001515 xor ebp, ebp
.text:01001517 call ds:EnterCriticalSection
.text:0100151D xor esi, esi
.text:0100151F cmp dwGroupSize, esi
.text:01001525 jbe short loc_1001566
.text:01001527 and [esp+10h], esi
.text:0100152B
.text:0100152B loc_100152B: ; CODE XREF: FuncServiceMain+4Aj
.text:0100152B mov eax, svcTable
.text:01001530 mov ecx, [esp+10h]
.text:01001534 push dword ptr [eax+ecx]
.text:01001537 push edi
.text:01001538 call ds:lstrcmpiW
.text:0100153E test eax, eax
.text:01001540 jz short StartThis
.text:01001542 add dword ptr [esp+10h], 0Ch
.text:01001547 inc esi
.text:01001548 cmp esi, dwGroupSize
.text:0100154E jb short loc_100152B
.text:01001550 jmp short loc_1001566
.text:01001552 ;=================================================
.text:01001552
.text:01001552 StartThis: ; CODE XREF: FuncServiceMain+3Cj
.text:01001552 mov ecx, svcTable
.text:01001558 lea eax, [esi+esi*2]
.text:0100155B lea eax, [ecx+eax*4]
.text:0100155E push eax
.text:0100155F call GetDLLServiceMain
.text:01001564 mov ebp, eax ; dll ServiceMain Function address
.text:01001566
.text:01001566 loc_1001566: ; CODE XREF: FuncServiceMain+21j
.text:01001566 ; FuncServiceMain+4Cj
.text:01001566 push ebx
.text:01001567 call ds:LeaveCriticalSection
.text:0100156D test ebp, ebp
.text:0100156F jz short loc_100157B
.text:01001571 push [esp+10h+arg_4]
.text:01001575 push [esp+14h+arg_0]
.text:01001579 call ebp
.text:0100157B
.text:0100157B loc_100157B: ; CODE XREF: FuncServiceMain+6Bj
.text:0100157B pop edi
.text:0100157C pop esi
.text:0100157D pop ebp
.text:0100157E pop ebx
.text:0100157F pop ecx
.text:01001580 retn 8
.text:01001580 FuncServiceMain endp ; sp=-8
;==============================FuncServiceMain() end========================================
由于svchost已經(jīng)調(diào)用了StartServiceCtrlDispatcher來(lái)服務(wù)調(diào)度函數(shù),因此我們?cè)趯?shí)現(xiàn)DLL實(shí)現(xiàn)時(shí)就不用了,這主要是因?yàn)橐粋€(gè)進(jìn)程只能調(diào)用一次StartServiceCtrlDispatcher API。但是需要用 RegisterServiceCtrlHandler 來(lái)注冊(cè)響應(yīng)控制請(qǐng)求的函數(shù)。最后我們的DLL接收的都是unicode字符串。
由于這種服務(wù)啟動(dòng)后由svchost加載,不增加新的進(jìn)程,只是svchost的一個(gè)DLL,而且一般進(jìn)行審計(jì)時(shí)都不會(huì)去 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Svchost 檢查服務(wù)組是否變化,就算去檢查,也不一定能發(fā)現(xiàn)異常,因此如果添加一個(gè)這樣的DLL后門,偽裝的好,是比較隱蔽的。
4. 安裝服務(wù)與設(shè)置
要通過(guò)svchost調(diào)用來(lái)啟動(dòng)的服務(wù),就一定要在HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Svchost下有該服務(wù)名,這可以通過(guò)如下方式來(lái)實(shí)現(xiàn):
1) 添加一個(gè)新的服務(wù)組,在組里添加服務(wù)名
2) 在現(xiàn)有組里添加服務(wù)名
3) 直接使用現(xiàn)有服務(wù)組里的一個(gè)服務(wù)名,但本機(jī)沒有安裝的服務(wù)
4) 修改現(xiàn)有服務(wù)組里的現(xiàn)有服務(wù),把它的ServiceDll指向自己
其中前兩種可以被正常服務(wù)使用,如使用第1種方式,啟動(dòng)其服務(wù)要?jiǎng)?chuàng)建新的svchost進(jìn)程;第2種方式如果該組服務(wù)已經(jīng)運(yùn)行,安裝后不能立刻啟動(dòng)服務(wù),因?yàn)閟vchost啟動(dòng)后已經(jīng)把該組信息保存在內(nèi)存里,并調(diào)用API StartServiceCtrlDispatcher() 為該組所有服務(wù)注冊(cè)了調(diào)度處理函數(shù),新增加的服務(wù)不能再注冊(cè)調(diào)度處理函數(shù),需要重啟計(jì)算機(jī)或者該組的svchost進(jìn)程。而后兩種可能被后門使用,尤其是最后一種,沒有添加服務(wù),只是改了注冊(cè)表里一項(xiàng)設(shè)置,從服務(wù)管理控制臺(tái)又看不出來(lái),如果作為后門還是很隱蔽的。比如EventSystem服務(wù),缺省是指向es.dll,如果把ServiceDll改為EventSystem.dll就很難發(fā)現(xiàn)。
因此服務(wù)的安裝除了調(diào)用CreateService()創(chuàng)建服務(wù)之外,還需要設(shè)置服務(wù)的ServiceDll,如果使用前2種還要設(shè)置svchost的注冊(cè)表選項(xiàng),在卸載時(shí)也最好刪除增加的部分。
具體代碼參見后邊的附例(使用的是方法3)。
注: ImagePath 和ServiceDll 是ExpandString不是普通字符串。因此如果使用.reg文件安裝時(shí)要注意。
5. DLL服務(wù)實(shí)現(xiàn)
DLL程序的編寫比較簡(jiǎn)單,只要實(shí)現(xiàn)一個(gè)ServiceMain()函數(shù)和一個(gè)服務(wù)控制程序,在ServiceMain()函數(shù)里用RegisterServiceCtrlHandler()注冊(cè)服務(wù)控制程序,并設(shè)置服務(wù)的運(yùn)行狀態(tài)就可以了。
另外,因?yàn)榇朔N服務(wù)的安裝除了正常的CreateService()之外,還要進(jìn)行其他設(shè)置,因此最好實(shí)現(xiàn)安裝和卸載函數(shù)。
為了方便安裝,實(shí)現(xiàn)的代碼提供了InstallService()函數(shù)進(jìn)行安裝,這個(gè)函數(shù)可以接收服務(wù)名作為參數(shù)(如果不提供參數(shù),就使用缺省的 iprip),如果要安裝的服務(wù)不在svchost的netsvcs組里安裝就會(huì)失敗;如果要安裝的服務(wù)已經(jīng)存在,安裝也會(huì)失敗;安裝成功后程序會(huì)配置服務(wù)的ServiceDll為當(dāng)前Dll。提供的UninstallService()函數(shù),可以刪除任何函數(shù)而沒有進(jìn)行任何檢查。
為了方便使用rundll32.exe進(jìn)行安裝,還提供了RundllInstallA()和RundllUninstallA()分別調(diào)用InstallService()及UninstallService()。因?yàn)閞undll32.exe使用的函數(shù)原型是:
void CALLBACK FunctionName(
HWND hwnd, // handle to owner window
HINSTANCE hinst, // instance handle for the DLL
LPTSTR lpCmdLine, // string the DLL will parse
int nCmdShow // show state
);
對(duì)應(yīng)的命令行是rundll32 DllName,FunctionName [Arguments]
DLL服務(wù)本身只是創(chuàng)建一個(gè)進(jìn)程,該程序命令行就是啟動(dòng)服務(wù)時(shí)提供的第一個(gè)參數(shù),如果未指定就使用缺省的svchostdll.exe。啟動(dòng)服務(wù)時(shí)如果提供第二個(gè)參數(shù),創(chuàng)建的進(jìn)程就是和桌面交互的。
具體代碼參見后邊的附例8,源代碼和DLL文件請(qǐng)到http://www.binglesite.net下載。
//main service process function
void __stdcall ServiceMain( int argc, wchar_t* argv[] );
//report service stat to the service control manager
int TellSCM( DWORD dwState, DWORD dwExitCode, DWORD dwProgress );
//service control handler, call back by service control manager
void __stdcall ServiceHandler( DWORD dwCommand );
//RealService just create a process
int RealService(char *cmd, int bInteract);
//Install this dll as a Service host by svchost.exe, service name is given by caller
int InstallService(char *name);
//unInstall a Service, be CARE FOR call this to delete a service
int UninstallService(char *name);
//Install this dll as a Service host by svchost.exe, used by RUNDLL32.EXE to call
void CALLBACK RundllInstallA(HWND hwnd, HINSTANCE hinst, char *param, int nCmdShow);
//unInstall a Service used by RUNDLL32.EXE to call, be CARE FOR call this to delete a service
void CALLBACK RundllUninstallA(HWND hwnd, HINSTANCE hinst, char *param, int nCmdShow);
//output the debug infor into log file(or stderr if a console program call me) & DbgPrint
void OutputString( char *lpFmt, … );
6. 代碼使用
C:\>tlist -s
0 System Process
8 System
240 services.exe Svcs: Browser,Dhcp,dmserver,Dnscache,Eventlog,lanmanserver,lanmanworkstation, LmHosts,PlugPlay,ProtectedStorage,TrkWks,Wmi
504 svchost.exe Svcs: RpcSs
1360 svchost.exe Svcs: EventSystem,Netman,RasMan,SENS,TapiSrv
C:\>rundll32 svchostdll.dll,RundllInstall abcd
SvcHostDLL: DllMain called DLL_PROCESS_ATTACH
you specify service name not in Svchost\netsvcs, must be one of following:
– EventSystem
– Ias
– Iprip
– Irmon
– Netman
– Nwsapagent
– Rasauto
– Rasman
– Remoteaccess
– SENS
– Sharedaccess
– Tapisrv
– Ntmssvc
– wzcsvc
C:\>rundll32 svchostdll.dll,RundllInstall IPRIP
SvcHostDLL: DllMain called DLL_PROCESS_ATTACH
CreateService(IPRIP) SUCCESS. Config it
Config service IPRIP ok.
C:\>sc start iprip “cmd /k whoami” 1
NT AUTHORITY\SYSTEM
SvcHostDLL: ServiceMain(3, IPRIP) called
SvcHostDLL: RealService called ‘cmd /k whoami’ Interact
SvcHostDLL: CreateProcess(cmd /k whoami) to 640
C:\>tlist -s
0 System Process
8 System
240 services.exe Svcs: Browser,Dhcp,dmserver,Dnscache,Eventlog,lanmanserver,lanmanworkstation, LmHosts,PlugPlay,ProtectedStorage,TrkWks,Wmi
504 svchost.exe Svcs: RpcSs
640 cmd.exe Title: C:\WINNT\System32\cmd.exe
1360 svchost.exe Svcs: EventSystem,Netman,RasMan,SENS,TapiSrv,IPRIP
C:\>net stop iprip
The IPRIP service was stopped successfully.
C:\>rundll32 svchostdll.dll,RundllUninstall iprip
DeleteService(IPRIP) SUCCESS.
7. 參考
Platform SDK: Tools – Rundll32
1) Inside Win32 Services, Part 2 by: Mark Russinovich, at: http://www.winnetmag.com/Articles/Index.cfm?ArticleID=8943&pg=3
2) Platform SDK: Tools – Rundll32, at: http://msdn.microsoft.com/library/en-us/tools/tools/rundll32.asp
2003/8
8. 代碼
// SvcHostDLL.cpp : Demo for a service dll used by svchost.exe to host it.
//
// for detail comment see articles.
// by bingle_at_email.com.cn
// www.BingleSite.net
//
/* save following as a .def file to export function, only ServiceMain is needed.
other used to install & uninstall service.
or use /EXPORT: link option to export them.
EXPORTS
ServiceMain
InstallService
UninstallService
RundllUninstallA
RundllInstallA
*/
/*
To compile & link:
cl /MD /GX /LD svchostdll.cpp /link advapi32.lib /DLL /base:0x71000000 /export:ServiceMain /EXPORT:RundllUninstallA /EXPORT:RundllInstallA /EXPORT:InstallService /EXPORT:UninstallService
*/
//
// Articles:
// 1. HOWTO Create a service dll used by svchost.exe by bingle, at: http://www.BingleSite.net/article/svchost-dll-service.html
// 2. Inside Win32 Services, Part 2 by: Mark Russinovich, at: http://www.winnetmag.com/Articles/Index.cfm?ArticleID=8943&pg=3
// 3. Platform SDK: Tools – Rundll32, at: http://msdn.microsoft.com/library/en-us/tools/tools/rundll32.asp
#include
#include
#include
#include
#define DEFAULT_SERVICE “IPRIP”
#define MY_EXECUTE_NAME “SvcHostDLL.exe”
//main service process function
void __stdcall ServiceMain( int argc, wchar_t* argv[] );
//report service stat to the service control manager
int TellSCM( DWORD dwState, DWORD dwExitCode, DWORD dwProgress );
//service control handler, call back by service control manager
void __stdcall ServiceHandler( DWORD dwCommand );
//RealService just create a process
int RealService(char *cmd, int bInteract);
//Install this dll as a Service host by svchost.exe, service name is given by caller
int InstallService(char *name);
//unInstall a Service, be CARE FOR call this to delete a service
int UninstallService(char *name);
//Install this dll as a Service host by svchost.exe, used by RUNDLL32.EXE to call
void CALLBACK RundllInstallA(HWND hwnd, HINSTANCE hinst, char *param, int nCmdShow);
//unInstall a Service used by RUNDLL32.EXE to call, be CARE FOR call this to delete a service
void CALLBACK RundllUninstallA(HWND hwnd, HINSTANCE hinst, char *param, int nCmdShow);
//output the debug infor into log file(or stderr if a console program call me) & DbgPrint
void OutputString( char *lpFmt, … );
//dll module handle used to get dll path in InstallService
HANDLE hDll=NULL;
//Service HANDLE & STATUS used to get service state
SERVICE_STATUS_HANDLE hSrv;
DWORD dwCurrState;
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
hDll=hModule;
#ifdef _DEBUG
AllocConsole();
OutputString(“SvcHostDLL: DllMain called DLL_PROCESS_ATTACH”);
break;
case DLL_THREAD_ATTACH:
OutputString(“SvcHostDLL: DllMain called DLL_THREAD_ATTACH”);
case DLL_THREAD_DETACH:
OutputString(“SvcHostDLL: DllMain called DLL_THREAD_DETACH”);
case DLL_PROCESS_DETACH:
TellSCM( SERVICE_STOP_PENDING, 0, 0 );
Sleep(1500);
TellSCM( SERVICE_STOPPED, 0, 0 );
OutputString(“SvcHostDLL: DllMain called DLL_PROCESS_DETACH”);
#endif
break;
}