專利名稱::一種漏洞檢測的方法和系統(tǒng)的制作方法
技術(shù)領(lǐng)域:
:本申請涉及信息安全的
技術(shù)領(lǐng)域:
,特別是涉及ー種漏洞檢測的方法,ー種漏洞檢測的系統(tǒng),一種用于漏洞檢測的客戶端,以及,一種用于漏洞檢測的云服務(wù)器。
背景技術(shù):
:公知的是,漏洞帶來的最大問題即是木馬,木馬通常會利用計算機(jī)程序漏洞侵入后竊取文件和用戶信息。木馬是ー種具有隱藏性的、自發(fā)性的可被用來進(jìn)行惡意行為的程序。歷史上對計算機(jī)木馬的定義是,試圖以有用程序的假面具欺騙用戶允許其運(yùn)行的ー類滲透。請注意,過去的木馬確實(shí)是這樣,但現(xiàn)在它們已無需偽裝自己。它們唯一的目的就是盡可能輕松地滲透并完成其惡意目標(biāo)?!澳抉R”已成為ー個通用詞,用來形容不屬于任何特定類別的所有滲透。木馬技術(shù)發(fā)展至今,最為常見的就是網(wǎng)頁木馬,網(wǎng)頁木馬是網(wǎng)頁惡意軟件威脅的罪魁禍?zhǔn)祝砻嫔蟼窝b成普通的網(wǎng)頁文件或是將惡意的代碼直接插入到正常的網(wǎng)頁文件中,當(dāng)有人訪問時,網(wǎng)頁木馬就會利用對方系統(tǒng)或者瀏覽器的漏洞自動將配置好的木馬的服務(wù)端下載到訪問者的電腦上來自動執(zhí)行。網(wǎng)頁木馬的實(shí)質(zhì)是利用漏洞向用戶傳播木馬下載器,準(zhǔn)確地說,網(wǎng)頁木馬并不是木馬程序,而應(yīng)該稱為網(wǎng)頁木馬“種植器”,也即ー種通過攻擊瀏覽器或?yàn)g覽器外掛程序(目標(biāo)通常是IE瀏覽器和ActiveX程序)的漏洞,向目標(biāo)用戶機(jī)器植入木馬、病毒、密碼盜取等惡意程序的手段。網(wǎng)頁木馬實(shí)際上是ー個HTML網(wǎng)頁,與其它網(wǎng)頁不同的是該網(wǎng)頁是黑客精心制作的,用戶一旦訪問了該網(wǎng)頁就會中木馬。為什么說是黑客精心制作的呢?因?yàn)榍度朐谶@個網(wǎng)頁中的腳本恰如其分地利用了IE瀏覽器的漏洞,讓IE在后臺自動下載黑客放置在網(wǎng)絡(luò)上的木馬并運(yùn)行(安裝)這個木馬,也就是說,這個網(wǎng)頁能下載木馬到本地并運(yùn)行(安裝)下載到本地電腦上的木馬,整個過程都在后臺運(yùn)行,用戶一旦打開這個網(wǎng)頁,下載過程和運(yùn)行(安裝)過程就自動開始。網(wǎng)頁木馬的防范只靠殺毒軟件和防火墻是遠(yuǎn)遠(yuǎn)不夠的,因?yàn)橐坏┖诳褪褂昧朔磸椂衰淼膫€人版木馬(個人反匯編的一些殺毒軟件無法識別的木馬),那么殺毒軟件和防火墻就無可奈何,所以,現(xiàn)有技術(shù)中,網(wǎng)頁木馬的防范一般采用如下方式進(jìn)行一、及時安裝安全補(bǔ)丁;這種打補(bǔ)丁的方式顯然受到系統(tǒng)服務(wù)商推出補(bǔ)丁的限制,并不能很好的全面防范網(wǎng)頁木馬。ニ、改名或卸載(反注冊)最不安全的ActiveXObject(IE插件)在系統(tǒng)中有些ActiveXObject會運(yùn)行EXE程序,比如“自動運(yùn)行程序”代碼中的Shell,application控件,這些控件一旦在網(wǎng)頁中獲得了執(zhí)行權(quán)限,那么它就會變?yōu)槟抉R運(yùn)行的“溫床”,所以把這些控件改名或卸載能徹底防范利用這些控件的網(wǎng)頁木馬。但是ActiveXObject是為了應(yīng)用而出現(xiàn)的,而不是為了攻擊而出現(xiàn)的,所有的控件都有它的用處,所以在改名或卸載ー個控件之前,必須確認(rèn)這個控件是不需要的,或者即使卸載了也不關(guān)大體的,但實(shí)際上用戶對此很難保證。三、提高IE的安全級別,禁用腳本和ActiveX控件有些網(wǎng)馬只要調(diào)高IE的安全級別,或者禁用腳本,該網(wǎng)頁木馬就不起作用了。從木馬的攻擊原理可以看出,網(wǎng)頁木馬是利用IE腳本和ActiveX控件上的一些漏洞下載和運(yùn)行木馬的,只要我們禁用了腳本和ActiveX控件,就可以防止木馬的下載和運(yùn)行。然而,禁用腳本和ActiveX控件會使一些網(wǎng)頁的功能和效果失去作用。顯然,上述現(xiàn)有技術(shù)受到各種各樣的條件限制,完全無法對網(wǎng)頁木馬進(jìn)行全面、有效的識別。因此,目前需要本領(lǐng)域技術(shù)人員迫切解決的ー個技術(shù)問題就是提出一種全新的漏洞檢測的機(jī)制,用以對造成網(wǎng)頁木馬等安全問題的漏洞進(jìn)行全面、有效的識別,提高用戶上網(wǎng)的安全性。
發(fā)明內(nèi)容本申請所要解決的技術(shù)問題是提供一種漏洞檢測的方法和系統(tǒng),用以對造成網(wǎng)頁木馬等安全問題的漏洞進(jìn)行全面、有效的識別,提高用戶上網(wǎng)的安全性。為了解決上述問題,本申請公開了一種漏洞檢測的方法,包括針對機(jī)器碼代碼執(zhí)行所調(diào)用的函數(shù)進(jìn)行鉤掛;獲得所述函數(shù)的返回地址;依據(jù)所述返回地址檢測所述函數(shù)的入口指令是否為正常的調(diào)用指令CALL;若否,則判定檢測到漏洞。優(yōu)選的,所述機(jī)器碼代碼為在腳本運(yùn)行的由漏洞觸發(fā)的機(jī)器碼代碼Shellcode;所述鉤掛包括內(nèi)嵌鉤掛InlineHook操作。優(yōu)選的,所述的方法,還包括判斷所述返回地址是否在正常的系統(tǒng)模塊中,所述正常的系統(tǒng)模塊包括具有合法簽名信息的DLL文件;若否,則判定檢測到漏洞。優(yōu)選的,所述的方法還包括獲取所述返回地址的內(nèi)存屬性,判斷所述內(nèi)存屬性是否包括可執(zhí)行屬性;若否,則判定檢測到漏洞。優(yōu)選的,所述包括可執(zhí)行屬性的內(nèi)存屬性包括允許執(zhí)行屬性PAGE_EXECUTE;允許執(zhí)行和讀取屬性PAGE_EXECUTE_READ;允許讀寫和執(zhí)行代碼屬性PAGE_EXECUTE_READWRITE;允許讀寫拷貝和執(zhí)行代碼屬性PAGE_EXECUTE_WRITECOPY。優(yōu)選的,所述函數(shù)包括由調(diào)用指令CALL調(diào)用的下載進(jìn)程的系統(tǒng)API函數(shù)和/或執(zhí)行進(jìn)程的系統(tǒng)API函數(shù)。優(yōu)選的,所述正常的調(diào)用指令CALL為滿足標(biāo)準(zhǔn)匯編指令OPCODE格式的調(diào)用指令CALL。本申請實(shí)施例還公開了ー種漏洞檢測的系統(tǒng),包括鉤掛模塊,用于針對機(jī)器碼代碼執(zhí)行所調(diào)用的函數(shù)進(jìn)行鉤掛;返回地址獲得模塊,用于獲得所述函數(shù)的返回地址;第一判斷模塊,用于依據(jù)所述返回地址檢測所述函數(shù)的入口指令是否為正常的調(diào)用指令CALL;若否,則判定檢測到漏洞。優(yōu)選的,所述機(jī)器碼代碼為在腳本運(yùn)行的由漏洞觸發(fā)的機(jī)器碼代碼Shellcode;所述鉤掛包括內(nèi)嵌鉤掛InlineHook操作。優(yōu)選的,所述的系統(tǒng)還包括第二判斷模塊,用于判斷所述返回地址是否在正常的系統(tǒng)模塊中,所述正常的系統(tǒng)模塊包括具有合法簽名信息的DLL文件;若否,則判定檢測到漏洞。優(yōu)選的,所述的系統(tǒng)還包括第三判斷模塊,用于獲取所述返回地址的內(nèi)存屬性,判斷所述內(nèi)存屬性是否包括可執(zhí)行屬性,若否,則判定檢測到漏洞。優(yōu)選的,所述包括可執(zhí)行屬性的內(nèi)存屬性包括允許執(zhí)行屬性PAGE_EXECUTE;允許執(zhí)行和讀取屬性PAGE_EXECUTE_READ;允許讀寫和執(zhí)行代碼屬性PAGE_EXECUTE_READWRITE;允許讀寫拷貝和執(zhí)行代碼屬性PAGE_EXECUTE_WRITECOPY。優(yōu)選的,所述函數(shù)包括由調(diào)用指令CALL調(diào)用的下載進(jìn)程的系統(tǒng)API函數(shù)和/或執(zhí)行進(jìn)程的系統(tǒng)API函數(shù)。優(yōu)選的,所述正常的調(diào)用指令CALL為滿足標(biāo)準(zhǔn)匯編指令OPCODE格式的調(diào)用指令CALL。本申請實(shí)施例還公開了一種用于漏洞檢測的客戶端,包括鉤掛模塊,用于針對機(jī)器碼代碼執(zhí)行所調(diào)用的函數(shù)進(jìn)行鉤掛;返回地址獲得模塊,用于獲得所述函數(shù)的返回地址;第一判斷模塊,用于依據(jù)所述返回地址檢測所述函數(shù)的入口指令是否為正常的調(diào)用指令CALL;若否,則判定檢測到漏洞。優(yōu)選的,所述用于漏洞檢測的客戶端,還包括第二判斷模塊,用于判斷所述返回地址是否在正常的系統(tǒng)模塊中,所述正常的系統(tǒng)模塊包括具有合法簽名信息的DLL文件;若否,則判定檢測到漏洞。優(yōu)選的,所述用于漏洞檢測的客戶端,還包括第三判斷模塊,用于獲取所述返回地址的內(nèi)存屬性,判斷所述內(nèi)存屬性是否包括可執(zhí)行屬性,若否,則判定檢測到漏洞。本申請實(shí)施例還公開了一種用于漏洞檢測的云服務(wù)器,包括鉤掛模塊,用于針對機(jī)器碼代碼執(zhí)行所調(diào)用的函數(shù)進(jìn)行鉤掛;返回地址獲得模塊,用于獲得所述函數(shù)的返回地址;第一判斷模塊,用于依據(jù)所述返回地址檢測所述函數(shù)的入口指令是否為正常的調(diào)用指令CALL;若否,則判定檢測到漏洞。優(yōu)選的,所述用于漏洞檢測的云服務(wù)器,還包括第二判斷模塊,用于判斷所述返回地址是否在正常的系統(tǒng)模塊中,所述正常的系統(tǒng)模塊包括具有合法簽名信息的DLL文件;若否,則判定檢測到漏洞。優(yōu)選的,所述用于漏洞檢測的云服務(wù)器,還包括第三判斷模塊,用于獲取所述返回地址的內(nèi)存屬性,判斷所述內(nèi)存屬性是否包括可執(zhí)行屬性,若否,則判定檢測到漏洞。與現(xiàn)有技術(shù)相比,本申請包括以下優(yōu)點(diǎn)本申請實(shí)施例根據(jù)對漏洞攻擊進(jìn)行主動防御的理念,針對漏洞攻擊中Shellcode的執(zhí)行所必須使用的系統(tǒng)函數(shù)進(jìn)行InlineHook,通過對這些系統(tǒng)函數(shù)進(jìn)行監(jiān)控和檢測,根據(jù)所述函數(shù)的返回地址判斷是否有異常的調(diào)用行為,若是,則將其識別為利用漏洞發(fā)起攻擊的木馬,如網(wǎng)頁木馬,從而實(shí)現(xiàn)了對網(wǎng)頁木馬進(jìn)行全面、有效的識別,提高用戶上網(wǎng)的安全性,并且無需用戶介入操作,提升了用戶體驗(yàn)。圖I是本申請的ー種漏洞檢測的方法實(shí)施例I的步驟流程圖;圖2是本申請的ー種漏洞檢測的方法實(shí)施例2的步驟流程圖;圖3是本申請的ー種漏洞檢測的方法實(shí)施例3的步驟流程圖;圖4是本申請的ー種漏洞檢測的系統(tǒng)實(shí)施例的結(jié)構(gòu)框圖。具體實(shí)施例方式為使本申請的上述目的、特征和優(yōu)點(diǎn)能夠更加明顯易懂,下面結(jié)合附圖和具體實(shí)施方式對本申請作進(jìn)一步詳細(xì)的說明。針對安全漏洞的主動防御是切斷木馬病毒傳播和感染電腦終端的主要途徑之一,通過對安全漏洞攻擊進(jìn)行主動防御,可以大大增強(qiáng)終端系統(tǒng)的安全特性,使黑客的攻擊操作變得更加困難。如在windows平臺上的漏洞在執(zhí)行溢出攻擊時,溢出漏洞的Shellcode在執(zhí)行時被安全軟件的主動防御技術(shù)阻止攔截,那么這次攻擊就會徹底失敗。其中,Shellcode實(shí)際是一段代碼(也可以是填充數(shù)據(jù)),是用來發(fā)送到服務(wù)器利用特定漏洞的代碼,一般可以獲取權(quán)限。另外,Shellcode—般是作為數(shù)據(jù)發(fā)送給受攻擊服務(wù)的。本申請實(shí)施例的核心構(gòu)思之ー在于,基于上述針對漏洞攻擊進(jìn)行主動防御的理念,針對漏洞攻擊中Shellcode的執(zhí)行所必須使用的系統(tǒng)函數(shù)進(jìn)行InlineHook,通過對這些系統(tǒng)函數(shù)進(jìn)行監(jiān)控和檢測,根據(jù)所述函數(shù)的返回地址判斷是否有異常的調(diào)用行為,若是,則將其識別為利用漏洞發(fā)起攻擊的木馬,如網(wǎng)頁木馬。參照圖1,示出了本申請ー種漏洞檢測的方法實(shí)施例I的步驟流程圖,具體可以包括如下步驟步驟101、針對機(jī)器碼代碼執(zhí)行所調(diào)用的函數(shù)進(jìn)行鉤掛;在具體實(shí)現(xiàn)中,所述機(jī)器碼代碼為在腳本運(yùn)行的由漏洞觸發(fā)的機(jī)器碼代碼Shellcode;所述鉤掛可以為內(nèi)嵌鉤掛InlineHook操作。在這種情況下,所述步驟101可以為,針對在腳本運(yùn)行的由漏洞觸發(fā)的Shellcode執(zhí)行所調(diào)用的函數(shù)進(jìn)行內(nèi)嵌鉤掛InlineHook。在實(shí)際中,Shellcode可以是一段系統(tǒng)可以執(zhí)行的代碼,是較底層的CPU執(zhí)行的機(jī)器碼,一般用一段16進(jìn)制字符串表示,通常用于緩沖區(qū)溢出漏洞利用中實(shí)現(xiàn)攻擊功能和攻擊行為的代碼。對于所述鉤掛Hook技術(shù),以下以較為通用的windows系統(tǒng)為例進(jìn)行說明通常,把攔截API(應(yīng)用程序接ロ)的調(diào)用的這個過程稱為是安裝ー個API鉤子(APIHook)0ー個API鉤子至少有兩個模塊組成一個是鉤子服務(wù)器(HookServer)模塊,一般為EXE的形式;一個是鉤子驅(qū)動器(HookDriver)模塊,一般為DLL的形式。服務(wù)器主要負(fù)責(zé)向目標(biāo)進(jìn)程注入鉤子驅(qū)動器,使得驅(qū)動器工作在目標(biāo)進(jìn)程的地址空間中,這是關(guān)鍵的第一歩。驅(qū)動器則負(fù)責(zé)實(shí)際的API攔截工作,便API函數(shù)調(diào)用的前后能做ー些需要的工作。一個比較常見的API鉤子的例子就是ー些實(shí)時翻譯軟件(像金山詞霸)中必備的的功能屏幕抓詞,它主要是對ー些GDI函數(shù)進(jìn)行了攔截,獲取它們的輸入?yún)?shù)中的字符串,然后在自己的窗口中顯示出來。針對上述的兩個部分,有以下兩點(diǎn)需要考慮的ー是選用何種DLL注入技木,ニ是采用何種API攔截機(jī)制。具體而言,注入技術(shù)的選用由于在Win32系統(tǒng)中各個進(jìn)程的地址是互相獨(dú)立的,因此無法在一個進(jìn)程中對另ー個進(jìn)程的代碼進(jìn)行有效的修改。而要完成API鉤子的工作就必須進(jìn)行這種操作。因此,需要采取某種獨(dú)特的手段,使得API鉤子(準(zhǔn)確的說是鉤子驅(qū)動器)能夠成為目標(biāo)進(jìn)程中的一部分,才有較大的可能來對目標(biāo)進(jìn)程數(shù)據(jù)和代碼進(jìn)行有控制的修改。通??梢圆捎靡韵聨追N進(jìn)程注入方式進(jìn)程注入方式I:利用注冊表如果準(zhǔn)備攔截的進(jìn)程連接了User32.dll,也就是使用了User32中的API(一般圖形界面的應(yīng)用程序都符合這個條件),那么就可以簡單把鉤子驅(qū)動器DLL的名字作為值添加在下面注冊表的鍵下HKEY_L0CAL_MACHINE\Software\Microsoft\WindowsNT\CurrentVersion\Windows\AppInit_DLLs,值的形式可以為單個DLL的文件名,或者是ー組DLL的文件名,相鄰的名稱之間用逗號或空格間隔。所有由該值標(biāo)識的DLL將在符合條件的應(yīng)用程序啟動的時候裝載。進(jìn)程注入方式2建立系統(tǒng)范圍的Windows鉤子要向某個進(jìn)程注入DLL,—個十分普遍也是比較簡單的方法就是建立在標(biāo)準(zhǔn)的Windows鉤子的基礎(chǔ)上。Windows鉤子一般是在DLL中實(shí)現(xiàn)的,這是一個全局性的Windows鉤子的基本要求。當(dāng)成功地調(diào)用SetWindowsHookEx函數(shù)之后,便在系統(tǒng)中安裝了某種類型的消息鉤子,這個鉤子可以是針對某個進(jìn)程,也可以是針對系統(tǒng)中的所有進(jìn)程。一旦某個進(jìn)程中產(chǎn)生了該類型的消息,操作系統(tǒng)會自動把該鉤子所在的DLL映像到該進(jìn)程的地址空間中,從而使得消息回調(diào)函數(shù)(在SetWindowsHookEx的參數(shù)中指定)能夠?qū)Υ讼⑦M(jìn)行適當(dāng)?shù)奶幚?,在這里,并不需要關(guān)注對消息進(jìn)行什么處理,因此在消息回調(diào)函數(shù)中只需把消息鉤子向后傳遞就可以了,但是所需的DLL已經(jīng)成功地注入了目標(biāo)進(jìn)程的地址空間,從而可以完成后續(xù)工作。不同進(jìn)程中使用的DLL之間是不能直接共享數(shù)據(jù)的,因?yàn)樗鼈兓顒釉诓煌牡刂房臻g中。但在Windows鉤子DLL中,有一些數(shù)據(jù),例如Windows鉤子句柄HHook,這是由SetWindowsHookEx函數(shù)返回值得到的,并且作為參數(shù)將在CalINextHookEx函數(shù)和UnhookWindoesHookEx函數(shù)中使用,顯然使用SetWindowsHookEx函數(shù)的進(jìn)程和使用CallNextHookEx函數(shù)的進(jìn)程一般不會是同一個進(jìn)程,因此需要能夠使句柄在所有的地址空間中都是有效的有意義的,也就是說,它的值必須在這些鉤子DLL所掛鉤的進(jìn)程之間是共享的。為了達(dá)到這個目的,可以把它存儲在一個共享的數(shù)據(jù)區(qū)域中。進(jìn)程注入方式3使用CreateRemoteThread函數(shù)任何一個進(jìn)程都可以使用LoadLibrary來動態(tài)地加載ー個DLL。但問題是,如何讓目標(biāo)進(jìn)程在我們的控制下來加載我們的鉤子DLL(也就是鉤子驅(qū)動器)呢?這里有一個API函數(shù)CreateRemoteThread,通過它可在一個進(jìn)程中可建立并運(yùn)行ー個遠(yuǎn)程的線程。調(diào)用該API需要指定一個線程函數(shù)指針作為參數(shù),該線程函數(shù)的原型如下FunctionThreadProc(IpParamPointer):DWORD;再來看一下LoadLibrary的函數(shù)原型FunctionLoadLibrary(IpFileNamePChar):HModule;可以看出,這兩個函數(shù)原型實(shí)質(zhì)上是完全相同的(其實(shí)返回值是否相同關(guān)系不大,因?yàn)闊o法得到遠(yuǎn)程線程函數(shù)的返回值的),只是叫法不同而已,這種相同可以直接把LoadLibrary當(dāng)做線程函數(shù)來使用,從而在目標(biāo)進(jìn)程中加載鉤子DLL。進(jìn)程注入方式4:通過BHO來注入DLL:當(dāng)注入DLL的對象僅僅是InternetExplorer??梢岳肂rowserHelperObjects(BHO)一個BHO是一個在DLL中實(shí)現(xiàn)的COM對象,它主要實(shí)現(xiàn)了ー個IObjectWithSite接ロ,而每當(dāng)IE運(yùn)行吋,它會自動加載所有實(shí)現(xiàn)了該接ロ的COM對象。攔截機(jī)制在鉤子應(yīng)用的系統(tǒng)級別方面,有兩類API攔截的機(jī)制--內(nèi)核級的攔截和用戶級的攔截。InlineHook主要涉及內(nèi)核級的攔截。InlineHook是直接在以前的函數(shù)體里面修改指令,用一個跳轉(zhuǎn)或者其他指令來達(dá)到掛鉤的目的。這是相對普通的hook來說,因?yàn)槠胀ǖ膆ook只是修改函數(shù)的調(diào)用地址,而不是在原來的函數(shù)體里面做修改。以下提供ー種InlineHook具體實(shí)現(xiàn)的示例I、Hook之前的準(zhǔn)備工作之一假設(shè)在某個軟件中,總共hook了15個nativeAPI函數(shù)。分別是ZwOpenKey,ZwClose,ZwQueryValueKey,ZwDeleteKey,ZwSetValueKey,AwureateKey,ZwDeleteValueKey,ZwEnumerateValueKey,ZwRestoreKey,ZwReplaceKey,/,wTermmateProcess,/,WbetSecurityObject,ZwCreateThread,ZwTermmateThread,ZwQuerySystemInformationo這15個函數(shù)中,包括2個未公開的函數(shù),ZwCreateThread,ZwTerminateThread,這兩個函數(shù),需要從ntdll.dll的導(dǎo)出表中找到。另外,所有的nativeAPI函數(shù)的最終實(shí)現(xiàn)都是在ntoskrnl模塊中,所以,使用ZwQuerySystemInformation的OB號功能,找出ntoskrnl模塊的內(nèi)存加載區(qū)間,然后逐個判斷ssdt表中這些要hook的函數(shù)地址,是否在這個區(qū)間內(nèi)。2、Hook之前準(zhǔn)備工作之ニI)ー個全局函數(shù)表,保存這15個要hook的函數(shù)的原始地址。這個表起始地址位于.data:00036860,終止于data0003689C共60字節(jié)2)一個hook的函數(shù)地址表,分別對應(yīng)于要hook的15個函數(shù)的跳轉(zhuǎn)。這個表起始地址位于data00034E98.data00034E98off—34E98ddoffsetsub—1EEA8.data00034E9Cddoffsetsub—1EE82.data00034EA0ddoffsetsub—1EF82.data00034EA4ddoffsetsub—1EF4A.data00034EA8ddoffsetsub—1EF6D.data00034EACddoffsetsub—IEECl.data00034EB0ddoffsetsub—1EED2.data00034EB4ddoffsetsub—1EEF5.data00034EB8ddoffsetsub—1EF31.data00034EBCddoffsetsub—1EF18.data00034EC0ddoffsetsub1EF93.data00034EC4ddoffsetsub—1EFA8data:00034EC8ddoffsetsub—IEFBD.data00034ECCddoffsetsub—1EFE6.data00034ED0ddoffsetsub—IEFFF這15個函數(shù),都是在cdnprot.sys中實(shí)現(xiàn)的。3)一個用于保存函數(shù)開頭字節(jié)的ニ維數(shù)組數(shù)據(jù)區(qū),數(shù)組形式是array[15][30];15個函數(shù),每個函數(shù)有30個字節(jié)可用。這30個字節(jié)中,首先保存原h(huán)ook函數(shù)開頭字節(jié),然后寫入0xe9,再寫入數(shù)組當(dāng)前位置跟原h(huán)ook函數(shù)地址偏移已復(fù)制出的字節(jié)碼后的位置之間的相對偏移值。(具體要保存原h(huán)ook函數(shù)開頭多少字節(jié),代碼中有ー個算法。)這個數(shù)組的作用是,當(dāng)hook住了函數(shù)后,執(zhí)行完hook函數(shù)之后,然后,需要恢復(fù)執(zhí)行原API函數(shù),由于原API函數(shù)開頭5字節(jié)已經(jīng)被改寫,由于函數(shù)原開頭字節(jié)已經(jīng)保存到相應(yīng)的數(shù)組里,因此這里的作法是,執(zhí)行這個數(shù)組中的機(jī)器碼,數(shù)組機(jī)器碼執(zhí)行到最后,會跳轉(zhuǎn)到原h(huán)ook函數(shù)某個偏移位置,繼續(xù)執(zhí)行。3、InlinehookI)IoAllocateMdl,分配ー個mdl,將要hook的函數(shù)映射進(jìn)去;2)MmProbeAndLockPages,鎖定頁面;3)去掉寫保護(hù);4)保存函數(shù)開頭機(jī)器碼到對應(yīng)的ニ維數(shù)組區(qū),改寫開頭5個字節(jié),讓其跳轉(zhuǎn)到起始地址位于.data00034E98的跳轉(zhuǎn)表中的對應(yīng)跳轉(zhuǎn)函數(shù);5)恢復(fù)寫保護(hù);6)MmUnlockPages;7)IoFreeMdl;4、Inlinehook后的恢復(fù)工作參見2步驟3)中的描述。對于本申請實(shí)施例而言,InlineHook的操作可以是將函數(shù)入口的前五個字節(jié)替換成自己的代碼,進(jìn)入開發(fā)者自己的函數(shù)代碼中進(jìn)行監(jiān)控和檢測,在匯編指令中實(shí)際上是修改CALL指令的入口為JMP指令到其他的內(nèi)存地址。當(dāng)然,上述InlineHook的處理僅僅用作示例,本領(lǐng)域技術(shù)人員釆用任ー種方式對Shellcode執(zhí)行所調(diào)用的函數(shù)進(jìn)行InlineHook都是可行的,本申請實(shí)施例對此無需加以限制。在具體實(shí)現(xiàn)中,所述函數(shù)可以包括由CALL指令調(diào)用的下載進(jìn)程的系統(tǒng)API函數(shù)和/或執(zhí)行進(jìn)程的系統(tǒng)API函數(shù)。其中,所述Call指令是專門用作函數(shù)調(diào)用的指令,它的作用是將當(dāng)前的程序指針(EIP寄存器)值保存在棧中,然后轉(zhuǎn)移到目標(biāo)操作數(shù)所指定的函數(shù)繼續(xù)執(zhí)行。本申請實(shí)施例不僅可以用于保護(hù)瀏覽器程序,還能保護(hù)adobereader等支持javascript腳本引擎的第三方軟件,如惡意的PDF文件溢出漏洞。同時可以保護(hù)內(nèi)嵌網(wǎng)頁瀏覽的第三方軟件,如迅雷中內(nèi)嵌的網(wǎng)頁廣告被網(wǎng)頁木馬攻擊等。步驟102、獲得所述函數(shù)的返回地址;具體而言,調(diào)用指令CALL的基本功能就是將返回地址(即調(diào)用指令的下一條指令的地址)壓入堆棧,并轉(zhuǎn)向子程序的入口地址處。一般而言,函數(shù)入口的匯編指令是PushebpMovebp,esp通過ebp即可以獲得函數(shù)的返回地址,步驟103、依據(jù)所述返回地址檢測所述函數(shù)的入口指令是否為正常的CALL指令;若否,則執(zhí)行步驟104;在具體實(shí)現(xiàn)中,所述正常的調(diào)用指令CALL是指滿足標(biāo)準(zhǔn)匯編指令OPCODE格式的調(diào)用指令CALL。也就是說,按照英特爾的指令標(biāo)準(zhǔn)文檔,CALL指令有規(guī)定的多種寫法,正常的CALL指令即指滿足規(guī)定寫法的CALL指令。步驟104、判定檢測到漏洞。本實(shí)施例針對漏洞攻擊中Shellcode的執(zhí)行所需要使用的系統(tǒng)函數(shù)進(jìn)行InlineHook,如針對winexec,shellexecute,createprocess等系統(tǒng)API函數(shù)進(jìn)行監(jiān)控和檢測,根據(jù)所述函數(shù)的返回地址回溯檢測函數(shù)入口指令是否正常,若不正常,則判定存在異常的調(diào)用行為,將其識別為利用漏洞發(fā)起攻擊的木馬,如網(wǎng)頁木馬,從而可以主動防御各類漏洞攻擊,阻斷和攔截已知和未知的各種緩沖區(qū)溢出攻擊。在具體實(shí)現(xiàn)中,對于識別出的網(wǎng)頁木馬,可以采用任一種攔截技術(shù)進(jìn)行阻斷和攔截,本領(lǐng)域技術(shù)人員根據(jù)實(shí)際情況任意選用相關(guān)攔截技術(shù)均可,本申請對此不作限制。參考圖2,示出了本申請的ー種漏洞檢測的方法實(shí)施例2的步驟流程圖,具體可以包括如下步驟步驟201、針對由漏洞觸發(fā)的Shellcode執(zhí)行所調(diào)用的函數(shù)進(jìn)行InlineHook;步驟202、獲得所述函數(shù)的返回地址;步驟203、依據(jù)所述返回地址檢測所述函數(shù)的入口指令是否為正常的CALL指令;若是,則執(zhí)行步驟204;若否,則執(zhí)行步驟205;其中,所述正常的系統(tǒng)模塊包括具有合法簽名信息的DLL文件。在實(shí)際中,正常的系統(tǒng)模塊一般是ー個DLL文件,文件會有微軟提供的簽名或第三方廠商提供的文件簽名,通過簽名算法可以驗(yàn)證是否為正常的系統(tǒng)模塊。其中,DLL是DynamicLinkLibrary的縮寫,意為動態(tài)鏈接庫。DLL文件一般被存放在CWindowsSystemM下。DLL是一個包含可由多個程座同時使用的仕遇和數(shù)據(jù)的庫。步驟204,判斷所述返回地址是否在正常的系統(tǒng)模塊中;若否,則執(zhí)行步驟205;若是,則執(zhí)行步驟206;步驟205,判定檢測到漏洞;步驟206,判定為正常調(diào)用行為。本實(shí)施例相較于圖I所示的實(shí)施例而言,增加了判斷所述返回地址是否在正常的系統(tǒng)模塊中的處理步驟,在漏洞攻擊發(fā)生時,程序的執(zhí)行流程會混亂,調(diào)用系統(tǒng)模塊中的函數(shù)的內(nèi)存地址一般為不可執(zhí)行代碼的堆棧地址,因而本實(shí)施例實(shí)質(zhì)上是增加了基于函數(shù)的返回地址的堆棧檢測,以下對相關(guān)處理步驟具體說明。在具體實(shí)現(xiàn)中,CALL指令是專門用作函數(shù)調(diào)用的指令,它的作用是將當(dāng)前的程序指針(EIP寄存器)值保存在棧中,然后轉(zhuǎn)移到目標(biāo)操作數(shù)所指定的函數(shù)繼續(xù)執(zhí)行。InlineHook一般是將函數(shù)入口的前五個字節(jié)替換成自己的代碼,進(jìn)入開發(fā)者自己的函數(shù)代碼中進(jìn)行監(jiān)控和檢測,在匯編指令中實(shí)際上是修改CALL指令的入口為JMP指令到其他的內(nèi)存地址。一般函數(shù)入口的匯編指令是PushebpMovebp,esp通過ebp可以找到函數(shù)的返回地址,通過對返回地址的內(nèi)存地址和匯編指令的判定,可以判定返回地址是否在棧中執(zhí)行,若在棧中執(zhí)行,即表明所述返回地址在進(jìn)程正常的系統(tǒng)模塊,若不在棧中執(zhí)行,則表明所述返回地址未在進(jìn)程正常的系統(tǒng)模塊內(nèi),在這種情況下,則判定存在異常的調(diào)用行為,將其識別為利用漏洞發(fā)起攻擊的木馬,如網(wǎng)頁木馬。需要說明的是,上述步驟204和步驟203可以同步執(zhí)行,或者,所述步驟204也可以在步驟203之前執(zhí)行,本領(lǐng)域技術(shù)人員根據(jù)實(shí)際情況任意設(shè)置執(zhí)行次序均是可行的,本申請對此無需加以限制。本實(shí)施例針對漏洞攻擊中Shellcode的執(zhí)行所需要使用的系統(tǒng)API函數(shù)(主要是下載函數(shù),執(zhí)行函數(shù))進(jìn)行InlineHook,通過對這些系統(tǒng)API函數(shù)進(jìn)行監(jiān)控和檢測,根據(jù)所述函數(shù)的返回地址回溯檢測函數(shù)入口指令是否正常,并判斷所述返回地址是否在進(jìn)程正常的系統(tǒng)模塊中,若否,則判定存在異常的調(diào)用行為,將其識別為利用漏洞發(fā)起攻擊的木馬,如網(wǎng)頁木馬,從而可以主動防御各類漏洞攻擊,阻斷和攔截已知和未知的各種緩沖區(qū)溢出攻擊。參考圖3,示出了本申請的一種漏洞檢測的方法實(shí)施例3的步驟流程圖,具體可以包括如下步驟步驟301、針對由漏洞觸發(fā)的Shellcode執(zhí)行所調(diào)用的函數(shù)進(jìn)行InlineHook;步驟302、獲得所述函數(shù)的返回地址;步驟303、依據(jù)所述返回地址檢測所述函數(shù)的入口指令是否為正常的CALL指令;若是,則執(zhí)行步驟304;若否,則執(zhí)行步驟306;步驟304,判斷所述返回地址是否在正常的系統(tǒng)模塊中;若否,則執(zhí)行步驟306;若是,則執(zhí)行步驟305;步驟305,獲取所述返回地址的內(nèi)存屬性,判斷所述內(nèi)存屬性是否包括可執(zhí)行屬性,若是,則執(zhí)行步驟307;若否,則執(zhí)行步驟306;步驟306,判定檢測到漏洞;步驟307,判定為正常調(diào)用行為。本實(shí)施例相較于圖2所示的實(shí)施例而言,增加了判斷所述返回地址的內(nèi)存屬性是否包括可執(zhí)行屬性的處理步驟,其實(shí)質(zhì)上是增加了基于函數(shù)的返回地址的內(nèi)存屬性檢測,即在做返回地址檢查的時候檢測返回地址的內(nèi)存屬性是否有可執(zhí)行屬性。作為本申請實(shí)施例的一種示例,所述包括可執(zhí)行屬性的內(nèi)存屬性可以包括允許執(zhí)行屬性PAGE_EXECUTE;允許執(zhí)行和讀取屬性PAGE_EXECUTE_READ;允許讀寫和執(zhí)行代碼屬性PAGE_EXECUTE_READWRITE;允許讀寫拷貝和執(zhí)行代碼屬性PAGE_EXECUTE_WRITECOPY。需要說明的是,上述步驟303、304和305可以同步執(zhí)行,或者,所述步驟304可以在步驟303前執(zhí)行,或者,所述步驟305可以在步驟304前執(zhí)行,本領(lǐng)域技術(shù)人員根據(jù)實(shí)際情況任意設(shè)置執(zhí)行次序均是可行的,本申請對此無需加以限制。本實(shí)施例針對漏洞攻擊中Shellcode的執(zhí)行所需要使用的系統(tǒng)API函數(shù)(主要是下載函數(shù),執(zhí)行函數(shù))進(jìn)行InlineHook,通過對這些系統(tǒng)API函數(shù)進(jìn)行監(jiān)控和檢測,根據(jù)所述函數(shù)的返回地址回溯檢測函數(shù)入口指令是否正常,并判斷所述返回地址是否在進(jìn)程正常的系統(tǒng)模塊中,同時判斷所述返回地址的內(nèi)存屬性是否包括可執(zhí)行屬性,若否,則判定存在異常的調(diào)用行為,將其識別為利用漏洞發(fā)起攻擊的木馬,如網(wǎng)頁木馬,從而可以主動防御各類漏洞攻擊,阻斷和攔截已知和未知的各種緩沖區(qū)溢出攻擊。為使本領(lǐng)域技術(shù)人員更好地理解本申請實(shí)施例,以下通過一個具體示例進(jìn)一步說明。假設(shè)黑客針對CALL指令的劫持攻擊方法如下004071608038E8cmpbyteptr[eax],0E8call命令的開頭004071638038E9cmpbyteptr[eax],0E9jmp命令的開頭0040716675OFjnzshort00407177沒有被InlineHook,直接進(jìn)去004071688178059090909cmpdwordptr[eax+5],90909090已被InlineHook,檢查5字節(jié)后部分是否被nop了0040716F7406jeshort004071770040717155pushebp后面5字節(jié)完好,則直接實(shí)現(xiàn)前面5字節(jié)原代碼004071728BECmovebp,esp004071748D4005leaeax,dwordptr[eax+5]跳到5字節(jié)之后執(zhí)行00407177FFEOjmpeax一、采用本申請?zhí)峁┑腃ALL指令檢測方法,通過函數(shù)返回地址回溯檢測函數(shù)入口指令是否正常,具體可以采用以下代碼實(shí)現(xiàn)過程創(chuàng)建一個布爾類型的函數(shù),函數(shù)名為CheckAfterCalllnstruction,聲明其參數(shù)為void類型,該函數(shù)功能為檢測函數(shù)返回地址是否正常的CALL指令;創(chuàng)建一個constunsignedchar類型的字符串變量;使用或條件使用CheckOpCode函數(shù)檢測地址的字節(jié)碼是否為標(biāo)準(zhǔn)的CALL指令;檢測機(jī)器碼16進(jìn)制字符串是否為OxFF,0x15,CALL指令匯編代碼為CALLdwordptr[abs32];檢測機(jī)器碼16進(jìn)制字符串是否為OxFF,0x14,CALL指令匯編代碼為CALLdwordptr[REG*SCALE+BASE];檢測機(jī)器碼16進(jìn)制字符串是否為OxFF,0x10,CALL指令匯編代碼為CALLdwordptr[EAX];檢測機(jī)器碼16進(jìn)制字符串是否為OxFF,0x11,CALL指令匯編代碼為CALLdwordptr[ECX];檢測機(jī)器碼16進(jìn)制字符串是否為OxFF,0x12,CALL指令匯編代碼為CALLdwordptr[EDX];檢測機(jī)器碼16進(jìn)制字符串是否為OxFF,0x13,CALL指令匯編代碼為CALLdwordptr[EBX]"......校驗(yàn)完上述N種CALL指令的寫法是否正常。如果檢測地址的指令非CALL指令,函數(shù)則返回flase。boolCheckOpCode(constunsignedchar*address,intbytes_before,constunsignedcharopcode,constunsignedcharopcode2,constchar*what)CheckOpCode函數(shù)第一個內(nèi)存地址參數(shù)使用無符號字符參數(shù),第二個字節(jié)參數(shù)使用整形參數(shù),第三個字節(jié)碼參數(shù)使用無符號字符參數(shù),第四個字節(jié)碼參數(shù)使用無符號字符參數(shù),第五個參數(shù)為字符類型指針if(*(address_bytes_before)==opcode&&(opcode2==0|*(address_bytes_before+l)==opcode2))轉(zhuǎn)換內(nèi)存地址指令為16進(jìn)制度字符串和CALL指令匯編代碼兩個條件分別進(jìn)行校驗(yàn)。二、系統(tǒng)模塊返回地址檢測,檢測函數(shù)返回地址是否在正常的系統(tǒng)模塊內(nèi),具體可以采用以下代碼實(shí)現(xiàn)過程boolIsAllAddressInValidModule(void*retaddr[],intcount)創(chuàng)建一個布爾類型函數(shù),第一個參數(shù)是無符號數(shù)組,第二個參數(shù)是整形參數(shù);通過一個循環(huán)遍歷第一個參數(shù)的返回地址,與系統(tǒng)模塊中的函數(shù)地址和內(nèi)存地址比對;如果匹配上,函數(shù)返回布爾真值。如果未匹配上,函數(shù)返回布爾假值,即該內(nèi)存地址未落入系統(tǒng)模塊內(nèi)存地址范圍。三、內(nèi)存地址屬性檢測,檢測函數(shù)返回地址的內(nèi)存屬性是否為可執(zhí)行屬性,具體如以下代碼所示boolIsAddressExecutable(void*address)創(chuàng)建一個布爾類型函數(shù),參數(shù)是無類型指針SIZE_Tret=VirtualQuery(address,&mbi,sizeof(mbi));通過windowsapi函數(shù)VirtualQuery查詢地址的內(nèi)存頁屬性。if((mbi.Protect&PAGE_EXECUTE)==PAGE_EXECUTE|(mbi.Protect&PAGE_EXECUTE_READ)==PAGE_EXECUTE_READ|(mbi.Protect&PAGE_EXECUTE_READWRITE)==PAGE_EXECUTE_READWRITE|(mbi.Protect&PAGE_EXECUTE_WRITEC0PY)==PAGE_EXECUTE_WRITEC0PY)加入頁面屬性等于可執(zhí)行,等于可執(zhí)行可讀,等于可執(zhí)行可讀可寫,等于可執(zhí)行可寫可拷貝,函數(shù)返回布爾真值。如果不屬于四種情況,函數(shù)返回布爾假值,即該內(nèi)存地址存在不可執(zhí)行代碼的異常地址。需要說明的是,對于方法實(shí)施例,為了簡單描述,故將其都表述為一系列的動作組合,但是本領(lǐng)域技術(shù)人員應(yīng)該知悉,本申請并不受所描述的動作順序的限制,因?yàn)橐罁?jù)本申請,某些步驟可以采用其他順序或者同時進(jìn)行。其次,本領(lǐng)域技術(shù)人員也應(yīng)該知悉,說明書中所描述的實(shí)施例均屬于優(yōu)選實(shí)施例,所涉及的動作和模塊并不一定是本申請所必須的。參考圖4,示出了本申請的一種漏洞檢測的系統(tǒng)實(shí)施例的結(jié)構(gòu)框圖,具體可以包括如下模塊鉤掛模塊401,用于針對機(jī)器碼代碼執(zhí)行所調(diào)用的函數(shù)進(jìn)行鉤掛;返回地址獲得模塊402,用于獲得所述函數(shù)的返回地址;第一判斷模塊403,用于依據(jù)所述返回地址檢測所述函數(shù)的入口指令是否為正常的CALL指令;若否,則判定檢測到漏洞。在具體實(shí)現(xiàn)中,所述機(jī)器碼代碼為在腳本運(yùn)行的由漏洞觸發(fā)的機(jī)器碼代碼Shellcode;所述鉤掛包括內(nèi)嵌鉤掛InlineHook操作。所述函數(shù)包括由調(diào)用指令CALL調(diào)用的下載進(jìn)程的系統(tǒng)API函數(shù)和/或執(zhí)行進(jìn)程的系統(tǒng)API函數(shù);所述正常的調(diào)用指令CALL為滿足標(biāo)準(zhǔn)匯編指令OPCODE格式的CALL指令。在本申請的一種優(yōu)選實(shí)施例中,所述系統(tǒng)還可以包括如下模塊第二判斷模塊404,用于判斷所述返回地址是否在進(jìn)程正常的系統(tǒng)模塊中,所述正常的系統(tǒng)模塊包括具有合法簽名信息的DLL文件;若否,則判定檢測到漏洞。和/或,第三判斷模塊405,用于獲取所述返回地址的內(nèi)存屬性,判斷所述內(nèi)存屬性是否包括可執(zhí)行屬性,若否,則判定檢測到漏洞。其中,所述包括可執(zhí)行屬性的內(nèi)存屬性可以包括允許執(zhí)行屬性PAGE_EXECUTE;允許執(zhí)行和讀取屬性PAGE_EXECUTE_READ;允許讀寫和執(zhí)行代碼屬性PAGE_EXECUTE_READWRITE;允許讀寫拷貝和執(zhí)行代碼屬性PAGE_EXECUTE_WRITECOPY。對于系統(tǒng)實(shí)施例而言,由于其與方法實(shí)施例基本相似,所以描述的比較簡單,相關(guān)之處參見方法實(shí)施例的部分說明即可。上述系統(tǒng)實(shí)施例可以設(shè)置在客戶端,即在本申請的一種優(yōu)選實(shí)施例中,還提供了一種用于漏洞檢測的客戶端,具體可以包括如下模塊鉤掛模塊,用于針對機(jī)器碼代碼執(zhí)行所調(diào)用的函數(shù)進(jìn)行鉤掛;返回地址獲得模塊,用于獲得所述函數(shù)的返回地址;第一判斷模塊,用于依據(jù)所述返回地址檢測所述函數(shù)的入口指令是否為正常的調(diào)用指令CALL;若否,則判定檢測到漏洞。優(yōu)選的是,所述用于漏洞檢測的客戶端,還可以包括如下模塊第二判斷模塊,用于判斷所述返回地址是否在正常的系統(tǒng)模塊中,所述正常的系統(tǒng)模塊包括具有合法簽名信息的DLL文件;若否,則判定檢測到漏洞。優(yōu)選的是,所述用于漏洞檢測的客戶端,還可以包括如下模塊第三判斷模塊,用于獲取所述返回地址的內(nèi)存屬性,判斷所述內(nèi)存屬性是否包括可執(zhí)行屬性,若否,則判定檢測到漏洞。應(yīng)用本實(shí)施例,可以有效保護(hù)瀏覽器和帶有網(wǎng)頁瀏覽功能的第三方軟件。上述系統(tǒng)實(shí)施例可以設(shè)置在云端,即在本申請的一種優(yōu)選實(shí)施例中,還提供了一種用于漏洞檢測的云服務(wù)器,具體可以包括如下模塊鉤掛模塊,用于針對機(jī)器碼代碼執(zhí)行所調(diào)用的函數(shù)進(jìn)行鉤掛;返回地址獲得模塊,用于獲得所述函數(shù)的返回地址;第一判斷模塊,用于依據(jù)所述返回地址檢測所述函數(shù)的入口指令是否為正常的調(diào)用指令CALL;若否,則判定檢測到漏洞。優(yōu)選的是,所述用于漏洞檢測的云服務(wù)器,還可以包括如下模塊第二判斷模塊,用于判斷所述返回地址是否在正常的系統(tǒng)模塊中,所述正常的系統(tǒng)模塊包括具有合法簽名信息的DLL文件;若否,則判定檢測到漏洞。優(yōu)選的是,所述用于漏洞檢測的云服務(wù)器,還可以包括如下模塊第三判斷模塊,用于獲取所述返回地址的內(nèi)存屬性,判斷所述內(nèi)存屬性是否包括可執(zhí)行屬性,若否,則判定檢測到漏洞。應(yīng)用本實(shí)施例,可以采用云查殺的方式對漏洞進(jìn)行主動防御。本說明書中的各個實(shí)施例均采用遞進(jìn)的方式描述,每個實(shí)施例重點(diǎn)說明的都是與其他實(shí)施例的不同之處,各個實(shí)施例之間相同相似的部分互相參見即可。本申請可用于眾多通用或?qū)S玫挠嬎阆到y(tǒng)環(huán)境或配置中。例如個人計算機(jī)、服務(wù)器計算機(jī)、手持設(shè)備或便攜式設(shè)備、平板型設(shè)備、多處理器系統(tǒng)、基于微處理器的系統(tǒng)、置頂盒、可編程的消費(fèi)電子設(shè)備、網(wǎng)絡(luò)PC、小型計算機(jī)、大型計算機(jī)、包括以上任何系統(tǒng)或設(shè)備的分布式計算環(huán)境等等。本申請可以在由計算機(jī)執(zhí)行的計算機(jī)可執(zhí)行指令的一般上下文中描述,例如程序模塊。一般地,程序模塊包括執(zhí)行特定任務(wù)或?qū)崿F(xiàn)特定抽象數(shù)據(jù)類型的例程、程序、對象、組件、數(shù)據(jù)結(jié)構(gòu)等等。也可以在分布式計算環(huán)境中實(shí)踐本申請,在這些分布式計算環(huán)境中,由通過通信網(wǎng)絡(luò)而被連接的遠(yuǎn)程處理設(shè)備來執(zhí)行任務(wù)。在分布式計算環(huán)境中,程序模塊可以位于包括存儲設(shè)備在內(nèi)的本地和遠(yuǎn)程計算機(jī)存儲介質(zhì)中。最后,還需要說明的是,在本文中,諸如第一和第二等之類的關(guān)系術(shù)語僅僅用來將一個實(shí)體或者操作與另一個實(shí)體或操作區(qū)分開來,而不一定要求或者暗示這些實(shí)體或操作之間存在任何這種實(shí)際的關(guān)系或者順序。而且,術(shù)語“包括”、“包含”或者其任何其他變體意在涵蓋非排他性的包含,從而使得包括一系列要素的過程、方法、物品或者設(shè)備不僅包括那些要素,而且還包括沒有明確列出的其他要素,或者是還包括為這種過程、方法、物品或者設(shè)備所固有的要素。在沒有更多限制的情況下,由語句“包括一個......”限定的要素,并不排除在包括所述要素的過程、方法、物品或者設(shè)備中還存在另外的相同要素。以上對本申請所提供的一種漏洞檢測的方法和一種漏洞檢測的系統(tǒng)進(jìn)行了詳細(xì)介紹,本文中應(yīng)用了具體個例對本申請的原理及實(shí)施方式進(jìn)行了闡述,以上實(shí)施例的說明只是用于幫助理解本申請的方法及其核心思想;同時,對于本領(lǐng)域的一般技術(shù)人員,依據(jù)本申請的思想,在具體實(shí)施方式及應(yīng)用范圍上均會有改變之處,綜上所述,本說明書內(nèi)容不應(yīng)理解為對本申請的限制。權(quán)利要求1.一種漏洞檢測的方法,其特征在于,包括針對機(jī)器碼代碼執(zhí)行所調(diào)用的函數(shù)進(jìn)行鉤掛;獲得所述函數(shù)的返回地址;依據(jù)所述返回地址檢測所述函數(shù)的入口指令是否為正常的調(diào)用指令CALL;若否,則判定檢測到漏洞。2.根據(jù)權(quán)利要求I所述的方法,其特征在于,所述機(jī)器碼代碼為在腳本運(yùn)行的由漏洞觸發(fā)的機(jī)器碼代碼Shellcode;所述鉤掛包括內(nèi)嵌鉤掛InlineHook操作。3.根據(jù)權(quán)利要求I或2所述的方法,其特征在于,還包括判斷所述返回地址是否在正常的系統(tǒng)模塊中,所述正常的系統(tǒng)模塊包括具有合法簽名信息的DLL文件;若否,則判定檢測到漏洞。4.根據(jù)權(quán)利要求I或2所述的方法,其特征在于,還包括獲取所述返回地址的內(nèi)存屬性,判斷所述內(nèi)存屬性是否包括可執(zhí)行屬性;若否,則判定檢測到漏洞。5.根據(jù)權(quán)利要求4所述的方法,其特征在于,所述包括可執(zhí)行屬性的內(nèi)存屬性包括允許執(zhí)行屬性PAGE_EXECUTE;允許執(zhí)行和讀取屬性PAGE_EXECUTE_READ;允許讀寫和執(zhí)行代碼屬性PAGE_EXECUTE_READWRITE;允許讀寫拷貝和執(zhí)行代碼屬性PAGE_EXECUTE_WRITECOPY。6.根據(jù)權(quán)利要求1、2或5所述的方法,其特征在于,所述函數(shù)包括由調(diào)用指令CALL調(diào)用的下載進(jìn)程的系統(tǒng)API函數(shù)和/或執(zhí)行進(jìn)程的系統(tǒng)API函數(shù)。7.根據(jù)權(quán)利要求6所述的方法,其特征在于,所述正常的調(diào)用指令CALL為滿足標(biāo)準(zhǔn)匯編指令OPCODE格式的調(diào)用指令CALL。8.ー種漏洞檢測的系統(tǒng),其特征在于,包括鉤掛模塊,用于針對機(jī)器碼代碼執(zhí)行所調(diào)用的函數(shù)進(jìn)行鉤掛;返回地址獲得模塊,用于獲得所述函數(shù)的返回地址;第一判斷模塊,用于依據(jù)所述返回地址檢測所述函數(shù)的入口指令是否為正常的調(diào)用指令CALL;若否,則判定檢測到漏洞。9.根據(jù)權(quán)利要求8所述的系統(tǒng),其特征在于,所述機(jī)器碼代碼為在腳本運(yùn)行的由漏洞觸發(fā)的機(jī)器碼代碼Shellcode;所述鉤掛包括內(nèi)嵌鉤掛InlineHook操作。10.根據(jù)權(quán)利要求8或9所述的系統(tǒng),其特征在于,還包括第二判斷模塊,用于判斷所述返回地址是否在正常的系統(tǒng)模塊中,所述正常的系統(tǒng)模塊包括具有合法簽名信息的DLL文件;若否,則判定檢測到漏洞。11.根據(jù)權(quán)利要求8或9所述的系統(tǒng),其特征在于,還包括第三判斷模塊,用于獲取所述返回地址的內(nèi)存屬性,判斷所述內(nèi)存屬性是否包括可執(zhí)行屬性,若否,則判定檢測到漏洞。12.根據(jù)權(quán)利要求11所述的系統(tǒng),其特征在于,所述包括可執(zhí)行屬性的內(nèi)存屬性包括允許執(zhí)行屬性PAGE_EXECUTE;允許執(zhí)行和讀取屬性PAGE_EXECUTE_READ;允許讀寫和執(zhí)行代碼屬性PAGE_EXECUTE_READWRITE;允許讀寫拷貝和執(zhí)行代碼屬性PAGE_EXECUTE_WRITECOPY。13.根據(jù)權(quán)利要求8、9或12所述的系統(tǒng),其特征在于,所述函數(shù)包括由調(diào)用指令CALL調(diào)用的下載進(jìn)程的系統(tǒng)API函數(shù)和/或執(zhí)行進(jìn)程的系統(tǒng)API函數(shù)。14.根據(jù)權(quán)利要求13所述的系統(tǒng),其特征在于,所述正常的調(diào)用指令CALL為滿足標(biāo)準(zhǔn)匯編指令OPCODE格式的調(diào)用指令CALL。15.一種用于漏洞檢測的客戶端,其特征在于,包括鉤掛模塊,用于針對機(jī)器碼代碼執(zhí)行所調(diào)用的函數(shù)進(jìn)行鉤桂;返回地址獲得模塊,用于獲得所述函數(shù)的返回地址;第一判斷模塊,用于依據(jù)所述返回地址檢測所述函數(shù)的入口指令是否為正常的調(diào)用指令CALL;若否,則判定檢測到漏洞。16.根據(jù)權(quán)利要求15所述用于漏洞檢測的客戶端,其特征在于,還包括第二判斷模塊,用于判斷所述返回地址是否在正常的系統(tǒng)模塊中,所述正常的系統(tǒng)模塊包括具有合法簽名信息的DLL文件;若否,則判定檢測到漏洞。17.根據(jù)權(quán)利要求15或16所述用于漏洞檢測的客戶端,其特征在于,還包括第三判斷模塊,用于獲取所述返回地址的內(nèi)存屬性,判斷所述內(nèi)存屬性是否包括可執(zhí)行屬性,若否,則判定檢測到漏洞。18.一種用于漏洞檢測的云服務(wù)器,其特征在于,包括鉤掛模塊,用于針對機(jī)器碼代碼執(zhí)行所調(diào)用的函數(shù)進(jìn)行鉤桂;返回地址獲得模塊,用于獲得所述函數(shù)的返回地址;第一判斷模塊,用于依據(jù)所述返回地址檢測所述函數(shù)的入口指令是否為正常的調(diào)用指令CALL;若否,則判定檢測到漏洞。19.根據(jù)權(quán)利要求18所述用于漏洞檢測的云服務(wù)器,其特征在于,還包括第二判斷模塊,用于判斷所述返回地址是否在正常的系統(tǒng)模塊中,所述正常的系統(tǒng)模塊包括具有合法簽名信息的DLL文件;若否,則判定檢測到漏洞。20.根據(jù)權(quán)利要求18或19所述用于漏洞檢測的云服務(wù)器,其特征在于,還包括第三判斷模塊,用于獲取所述返回地址的內(nèi)存屬性,判斷所述內(nèi)存屬性是否包括可執(zhí)行屬性,若否,則判定檢測到漏洞。全文摘要本申請?zhí)峁┝艘环N漏洞檢測的方法及系統(tǒng),其中所述方法包括針對機(jī)器碼代碼執(zhí)行所調(diào)用的函數(shù)進(jìn)行鉤掛;獲得所述函數(shù)的返回地址;依據(jù)所述返回地址檢測所述函數(shù)的入口指令是否為正常的調(diào)用指令CALL;若否,則判定檢測到漏洞。本申請可以對造成網(wǎng)頁木馬等安全問題的漏洞進(jìn)行全面、有效的識別,提高用戶上網(wǎng)的安全性。文檔編號G06F21/22GK102651060SQ20121009375公開日2012年8月29日申請日期2012年3月31日優(yōu)先權(quán)日2012年3月31日發(fā)明者劉起,宋申雷,張聰,肖鵬申請人:北京奇虎科技有限公司