一種棧探測器編譯開關(guān)的檢測方法和裝置制造方法【專利摘要】本發(fā)明實施例公開了一種棧探測器編譯開關(guān)的檢測方法和裝置,其中方法包括:對軟件進行殼檢測與脫殼處理后,查找所述軟件的主函數(shù)入口確定主函數(shù);對所述主函數(shù)進行特征掃描,若存在與棧探測器GS編譯開關(guān)對應(yīng)的特征指令,則確定GS編譯開關(guān)被開啟了。以上方案,通過對軟件進行殼檢測與脫殼處理,查到找主函數(shù)入口來確定主函數(shù),然后對主函數(shù)進行特征掃描來可以確定GS編譯開關(guān)是否被開啟了。這樣可以為軟件漏洞挖掘等安全應(yīng)用提供方便。【專利說明】一種棧探測器編譯開關(guān)的檢測方法和裝置【
技術(shù)領(lǐng)域:
】[0001]本發(fā)明涉及通信【
技術(shù)領(lǐng)域:
】,特別涉及一種棧探測器編譯開關(guān)的檢測方法和裝置。【
背景技術(shù):
】[0002]在軟件漏洞挖掘等各種安全應(yīng)用中,安全研究人員需要知道軟件當(dāng)前開啟了哪些保護措施,常用的保護措施包括:DEP(DataExecutionPrevention,數(shù)據(jù)執(zhí)行保護)、ALSR(Addressspacelayoutrandomization,內(nèi)存隨機化保護)、SafeSEH(SafeStructuredExceptionHandling,安全異常處理保護)以及GS(Controlsstackprobes,棧探測器)等。[0003]開啟GS編譯開關(guān)可以防止棧溢出攻擊。若GS編譯開關(guān)處于開啟狀態(tài),那么在函數(shù)調(diào)用發(fā)生時會向棧幀中壓入4個字節(jié)的隨機數(shù),該隨機數(shù)被稱為安全信息(securitycookie),位于棧底EBP(extendedbasepointer,擴展基址指針寄存器)之前,并且.data(數(shù)據(jù)段)的內(nèi)存區(qū)域中還會存放一個securitycookie的副本。若GS編譯開關(guān)沒有打開,則不會壓入securitycookie。打開GS編譯開關(guān)的主要目的是防止棧溢出攻擊,S卩:當(dāng)溢出的數(shù)據(jù)破壞了securitycookie后,軟件程序會取用存放的副本對securitycookie進行校驗,如果校驗失敗則退出程序。這樣就可以防止棧溢出攻擊。[0004]目前有關(guān)于GS編譯開關(guān)的原理以及作用的介紹,但是還沒有可靠的檢測方法來確定軟件程序是否開啟了GS編譯開關(guān)對軟件程序進行保護?!?br/>發(fā)明內(nèi)容】[0005]本發(fā)明實施例提供了一種棧探測器編譯開關(guān)的檢測方法和裝置,用于檢測GS編譯開關(guān)是否開啟。[0006]一種棧探測器編譯開關(guān)的檢測方法,包括:[0007]對軟件進行殼檢測與脫殼處理后,查找所述軟件的主函數(shù)入口確定主函數(shù);[0008]對所述主函數(shù)進行特征掃描,若存在與棧探測器GS編譯開關(guān)對應(yīng)的特征指令,則確定GS編譯開關(guān)被開啟了。[0009]一種棧探測器編譯開關(guān)的檢測裝置,包括:[0010]確定單元,用于對軟件進行殼檢測與脫殼處理后,查找所述軟件的主函數(shù)入口確定主函數(shù);[0011]掃描單元,用于對所述確定單元確定的主函數(shù)進行特征掃描;[0012]判決單元,用于若所述掃描單元經(jīng)掃描確定存在與棧探測器GS編譯開關(guān)對應(yīng)的特征指令,則確定GS編譯開關(guān)被開啟了。[0013]從以上技術(shù)方案可以看出,本發(fā)明實施例具有以下優(yōu)點:通過對軟件進行殼檢測與脫殼處理,查到找主函數(shù)入口來確定主函數(shù),然后對主函數(shù)進行特征掃描來可以確定GS編譯開關(guān)是否被開啟了。這樣可以為軟件漏洞挖掘等安全應(yīng)用提供方便?!緦@綀D】【附圖說明】[0014]為了更清楚地說明本發(fā)明實施例中的技術(shù)方案,下面將對實施例描述中所需要使用的附圖作簡要介紹,顯而易見地,下面描述中的附圖僅僅是本發(fā)明的一些實施例,對于本領(lǐng)域的普通技術(shù)人員來講,在不付出創(chuàng)造性勞動性的前提下,還可以根據(jù)這些附圖獲得其他的附圖。[0015]圖1為本發(fā)明實施例方法流程示意圖;[0016]圖2為本發(fā)明實施例方法流程示意圖;[0017]圖3為本發(fā)明實施例裝置結(jié)構(gòu)示意圖;[0018]圖4為本發(fā)明實施例裝置結(jié)構(gòu)示意圖;[0019]圖5為本發(fā)明實施例裝置結(jié)構(gòu)示意圖;[0020]圖6為本發(fā)明實施例裝置結(jié)構(gòu)示意圖?!揪唧w實施方式】[0021]為了使本發(fā)明的目的、技術(shù)方案和優(yōu)點更加清楚,下面將結(jié)合附圖對本發(fā)明作進一步地詳細描述,顯然,所描述的實施例僅僅是本發(fā)明一部份實施例,而不是全部的實施例。基于本發(fā)明中的實施例,本領(lǐng)域普通技術(shù)人員在沒有做出創(chuàng)造性勞動前提下所獲得的所有其它實施例,都屬于本發(fā)明保護的范圍。[0022]本發(fā)明實施例提供了一種一種棧探測器編譯開關(guān)的檢測方法,如圖1所示,包括:[0023]101:對軟件進行殼檢測與脫殼處理后,查找上述軟件的主函數(shù)入口確定主函數(shù);[0024]上述101中,殼檢測是為了確定軟件的殼,脫殼處理則是為了能夠在后續(xù)找到軟件的真實入口,即Main(主)函數(shù)的入口。由于一些程序,例如使用VS2005編譯的程序,SP使關(guān)閉GS編譯開關(guān),某些初始化函數(shù)運行時還是會使用securitycookie,這樣我們就不能準確地確認到底這個程序是否開啟了GS編譯開關(guān)。也就是說需要找到用戶編寫的代碼部分有沒有開啟GS編譯開關(guān),采用以上方案可以檢測到代碼部分,因此這樣就可以避免這個問題。[0025]更具體地,主函數(shù)入口的查找方式可能與軟件的編譯器類型相關(guān),本發(fā)明實施例給出了如下可選方案:上述查找上述軟件的主函數(shù)入口之前還包括:確定上述軟件的編譯器類型;[0026]上述查找上述軟件的主函數(shù)入口包括:使用與上述編譯器類型對應(yīng)主函數(shù)的特征指令,識別上述軟件的主函數(shù)入口。[0027]軟件使用不同的編譯器真實入口往往不一樣。因此需要對不同的編譯器Main函數(shù)入口進行識別。[0028]例如:vs2005編譯器編譯的程序,主函數(shù)入口前有3個壓棧push指令,和兩個mov指令,我們從PE文件入口開始掃描,遇到push->mov->push->mov->push即可找到其主入口,其中push指令是實現(xiàn)壓入操作的堆棧操作指令,mov指令是傳送指令。另外,為了防止識別錯誤,還可以在主函數(shù)調(diào)用的后面繼續(xù)掃描幾個字節(jié),看有沒有出現(xiàn)恢復(fù)堆棧平衡的add指令。[0029]又例如:VC++6.0編譯器編譯的程序,主函數(shù)入口前為4個push指令,一個call指令再一個push指令,然后是主函數(shù)。[0030]又例如:另外一個版本的編譯器主函數(shù)入口前為2個mov指令緊接著是3個push指令。[0031]對于不同的編譯器編譯的程序,主函數(shù)的入口可能具有不同的特征,可以按照不同的特征來進行區(qū)別識別提高準確性。[0032]102:對上述主函數(shù)進行特征掃描,若存在與棧探測器GS編譯開關(guān)對應(yīng)的特征指令,則確定GS編譯開關(guān)被開啟了。[0033]在研究過程中發(fā)現(xiàn),只要開啟了GS編譯開關(guān),那么在函數(shù)返回結(jié)果前都會有一個校驗函數(shù),該校驗函數(shù)調(diào)用指令前的幾條指令比較特別,因此我們可以掃描這幾條比較特別指令(即特征指令)是否存在,從而判斷GS編譯開關(guān)是否打開。[0034]以上方案,通過對軟件進行殼檢測與脫殼處理,查到找主函數(shù)入口來確定主函數(shù),然后對主函數(shù)進行特征掃描來可以確定GS編譯開關(guān)是否被開啟了。這樣可以為軟件漏洞挖掘等安全應(yīng)用提供方便。[0035]進一步地,GS編譯開關(guān)開啟后并不會保護軟件下的所有的函數(shù),每個函數(shù)是獨立的,要確定是否開啟了GS編譯開關(guān),本發(fā)明實施例采用了如下方案:在確定主函數(shù)之后還包括:對上述主函數(shù)內(nèi)的所有函數(shù)進行特征掃描,若上述主函數(shù)內(nèi)的任一函數(shù)存在與棧探測器GS編譯開關(guān)對應(yīng)的特征指令,則確定GS編譯開關(guān)被開啟了。[0036]上述主函數(shù)內(nèi)的所有函數(shù),可以包括:主函數(shù)的子函數(shù),還可以是子函數(shù)的子函數(shù)。對于每個函數(shù)的掃描方式可以完全相同,采用迭代的方式實現(xiàn)即可。[0037]進一步地,并不是對所有函數(shù)都需要進行掃描,如以下情況:函數(shù)不包含緩沖區(qū);函數(shù)被定義為具有變量參數(shù)列表;函數(shù)使用無保護的關(guān)鍵字標記;函數(shù)在第一個語句中包含內(nèi)嵌會變代碼;緩沖區(qū)不是8字節(jié)類型且大小不大于4個字節(jié);這些情況下,GS并不保護這些函數(shù),因此本發(fā)明實施例還提供了減少被掃描函數(shù)數(shù)量的方案,具體可以如下:對上述主函數(shù)內(nèi)的所有函數(shù)進行特征掃描之前還包括:確定上述主函數(shù)內(nèi)的函數(shù)的函數(shù)類型;[0038]那么,上述對上述主函數(shù)內(nèi)的所有函數(shù)進行特征掃描包括:對除以下五種類型的函數(shù)以外的其他所有函數(shù)進行特征掃描;上述五種類型的函數(shù)包括:不包含緩沖區(qū)的函數(shù)、被定義為具有變量參數(shù)列表的函數(shù)、使用無保護的關(guān)鍵字標記的函數(shù)、在第一個語句中包含內(nèi)嵌會變代碼的函數(shù)、緩沖區(qū)不是8字節(jié)類型且大小不大于4個字節(jié)的函數(shù)。[0039]以上給出了五種可以不用掃描的函數(shù)舉例,需要說明的是,可能還有其它不被GS所保護的函數(shù),也不需要進行掃描,因此以上舉例不應(yīng)理解為對本發(fā)明實施例的窮舉。[0040]進一步地,為了防止誤判,本發(fā)明實施例還提供了如下方案:在確定存在與GS編譯開關(guān)對應(yīng)的特征指令之后還包括:確定上述特征指令之后的設(shè)定范圍內(nèi)是否出現(xiàn)返回指令,若存在,則確定GS編譯開關(guān)被開啟了。[0041]以下實施例以PE(PortableExecutable,可移植可執(zhí)行)文件是否開啟了GS編譯開關(guān)為例進行舉例說明如下:[0042]201:對軟件進行殼檢測與脫殼處理;[0043]殼檢測是為了確定軟件的殼,脫殼處理則是為了能夠在后續(xù)找到軟件的真實入口,即Main(主)函數(shù)的入口。[0044]202:查找真實入口;[0045]由于一些程序,例如使用VS2005編譯的程序,即使關(guān)閉GS編譯開關(guān),某些初始化函數(shù)運行時還是會使用securitycookie,這樣我們就不能準確地確認到底這個程序是否開啟了GS編譯開關(guān)。也就是說需要找到用戶編寫的代碼部分有沒有開啟GS編譯開關(guān),采用以上方案可以檢測到代碼部分,因此這樣就可以避免這個問題。[0046]軟件使用不同的編譯器真實入口往往不一樣。因此需要對不同的編譯器Main函數(shù)入口進行識別。[0047]例如:vs2005編譯器編譯的程序,主函數(shù)入口前有3個壓棧push指令,和兩個mov指令,我們從PE文件入口開始掃描,遇到push->mov->push->mov->push即可找到其主入口,其中push指令是實現(xiàn)壓入操作的堆棧操作指令,mov指令是傳送指令。另外,為了防止識別錯誤,還可以在主函數(shù)調(diào)用的后面繼續(xù)掃描幾個字節(jié),看有沒有出現(xiàn)恢復(fù)堆棧平衡的add指令。[0048]又例如:VC++6.0編譯器編譯的程序,主函數(shù)入口前為4個push指令,一個call指令再一個push指令,然后是主函數(shù)。[0049]又例如:另外一個版本的VC++編譯器主函數(shù)入口前為2個mov指令緊接著是3個push指令。[0050]對于不同的編譯器編譯的程序,主函數(shù)的入口可能具有不同的特征,可以按照不同的特征來進行區(qū)別識別提高準確性。[0051]203:掃描特征指令。[0052]在研究過程中發(fā)現(xiàn),只要是開啟了GS編譯開關(guān),那么在函數(shù)(除后續(xù)舉例的五種函數(shù)以外的函數(shù))返回結(jié)果前都會有一個校驗函數(shù);該校驗函數(shù)調(diào)用指令前的幾條指令比較特別,因此我們可以掃描這幾條比較特別指令(即特征指令)是否存在,從而判斷GS編譯開關(guān)是否打開。不過僅僅是掃描特征指令可能還不夠,這是由于校驗函數(shù)都是在函數(shù)返回結(jié)果前調(diào)用,所以我們還需要判斷特征指令后的一個范圍內(nèi)是否出現(xiàn)了返回指令,這樣就能避免出現(xiàn)誤判。[0053]所以,依照上面掃描特征指令的方法,對Main函數(shù)、子函數(shù)、子函數(shù)的子函數(shù)等進行迭代即可確定所有函數(shù)是否開啟了GS編譯開關(guān)。[0054]由于GS編譯開關(guān)開啟后并不會保護所有的函數(shù),譬如以下情況:[0055]1、函數(shù)不包含緩沖區(qū);[0056]2、函數(shù)被定義為具有變量參數(shù)列表;[0057]3、函數(shù)使用無保護的關(guān)鍵字標記;[0058]4、函數(shù)在第一個語句中包含內(nèi)嵌會變代碼;[0059]5、緩沖區(qū)不是8字節(jié)類型且大小不大于4個字節(jié)。[0060]因此以上五種函數(shù)可以不用掃描特征指令,其他函數(shù)采用迭代方式掃描特征指令。[0061]采用以上方案,通過迭代來確定是否某一個函數(shù)被GS保護了,如果被保護了,那么就可以認為該PE文件開啟了GS編譯開關(guān)。[0062]通過上述找GS編譯開關(guān)是否開啟的方法,結(jié)合ALSR、DEP以及SafeSEH的檢測,這樣就可以編寫一個軟件測試工具。在漏洞挖掘中,直接使用該軟件測試工具,就能發(fā)現(xiàn)這個軟件使用了何種保護措施以及缺少的保護措施。然后可以針對性的作出相應(yīng)的處理。[0063]本發(fā)明實施例還提供了一種棧探測器編譯開關(guān)的檢測裝置,如圖3所示,包括:[0064]確定單元301,用于對軟件進行殼檢測與脫殼處理后,查找上述軟件的主函數(shù)入口確定主函數(shù);[0065]確定單元301執(zhí)行殼檢測是為了確定軟件的殼,脫殼處理則是為了能夠在后續(xù)找到軟件的真實入口,即Main(主)函數(shù)的入口。由于一些程序,例如使用VS2005編譯的程序,即使關(guān)閉GS編譯開關(guān),某些初始化函數(shù)運行時還是會使用securitycookie,這樣我們就不能準確地確認到底這個程序是否開啟了GS編譯開關(guān)。也就是說需要找到用戶編寫的代碼部分有沒有開啟GS編譯開關(guān),采用以上方案可以檢測到代碼部分,因此這樣就可以避免這個問題。[0066]軟件使用不同的編譯器真實入口往往不一樣。因此需要對不同的編譯器Main函數(shù)入口進行識別。[0067]例如:vs2005編譯器編譯的程序,主函數(shù)入口前有3個壓棧push指令,和兩個mov指令,我們從PE文件入口開始掃描,遇到push->mov->push->mov->push即可找到其主入口,其中push指令是實現(xiàn)壓入操作的堆棧操作指令,mov指令是傳送指令。另外,為了防止識別錯誤,還可以在主函數(shù)調(diào)用的后面繼續(xù)掃描幾個字節(jié),看有沒有出現(xiàn)恢復(fù)堆棧平衡的add指令。[0068]又例如:VC++6.0編譯器編譯的程序,主函數(shù)入口前為4個push指令,一個call指令再一個push指令,然后是主函數(shù)。[0069]有例如:另外一個版本的編譯器主函數(shù)入口前為2個mov指令緊接著是3個push指令。[0070]對于不同的編譯器編譯的程序,主函數(shù)的入口可能具有不同的特征,可以按照不同的特征來進行區(qū)別識別提高準確性。[0071]掃描單元302,用于對上述確定單元301確定的主函數(shù)進行特征掃描;[0072]判決單元303,用于若上述掃描單元302經(jīng)掃描確定存在與棧探測器GS編譯開關(guān)對應(yīng)的特征指令,則確定GS編譯開關(guān)被開啟了。[0073]在研究過程中發(fā)現(xiàn),只要開啟了GS編譯開關(guān),那么在函數(shù)返回結(jié)果前都會有一個校驗函數(shù),該校驗函數(shù)調(diào)用指令前的幾條指令比較特別,因此我們可以掃描這幾條比較特別指令(即特征指令)是否存在,從而判斷GS編譯開關(guān)是否打開。[0074]以上方案,通過對軟件進行殼檢測與脫殼處理,查到找主函數(shù)入口來確定主函數(shù),然后對主函數(shù)進行特征掃描來可以確定GS編譯開關(guān)是否被開啟了。這樣可以為軟件漏洞挖掘等安全應(yīng)用提供方便。[0075]進一步地,GS編譯開關(guān)開啟后并不會保護軟件下的所有的函數(shù),每個函數(shù)是獨立的,要確定是否開啟了GS編譯開關(guān),本發(fā)明實施例采用了如下方案:上述掃描單元302,還用于在確定主函數(shù)之后對上述主函數(shù)內(nèi)的所有函數(shù)進行特征掃描;上述主函數(shù)內(nèi)的所有函數(shù),可以包括:主函數(shù)的子函數(shù),還可以是子函數(shù)的子函數(shù)。對于每個函數(shù)的掃描方式可以完全相同,采用迭代的方式實現(xiàn)即可。[0076]上述判決單元303,還用于若上述掃描單元302經(jīng)掃描確定上述主函數(shù)內(nèi)的任一函數(shù)存在與棧探測器GS編譯開關(guān)對應(yīng)的特征指令,則確定GS編譯開關(guān)被開啟了。[0077]進一步地,并不是對所有函數(shù)都需要進行掃描,如以下情況:函數(shù)不包含緩沖區(qū);函數(shù)被定義為具有變量參數(shù)列表;函數(shù)使用無保護的關(guān)鍵字標記;函數(shù)在第一個語句中包含內(nèi)嵌會變代碼;緩沖區(qū)不是8字節(jié)類型且大小不大于4個字節(jié);這些情況下,GS并不保護這些函數(shù),因此本發(fā)明實施例還提供了減少被掃描函數(shù)數(shù)量的方案,具體可以如下:如圖4所示,上述裝置還包括:[0078]函數(shù)類型確定單元401,用于在上述掃描單元302對上述主函數(shù)內(nèi)的所有函數(shù)進行特征掃描之前,確定上述主函數(shù)內(nèi)的函數(shù)的函數(shù)類型;[0079]上述掃描單元302,用于對除以下五種類型的函數(shù)以外的其他所有函數(shù)進行特征掃描;上述五種類型的函數(shù)包括:不包含緩沖區(qū)的函數(shù)、被定義為具有變量參數(shù)列表的函數(shù)、使用無保護的關(guān)鍵字標記的函數(shù)、在第一個語句中包含內(nèi)嵌會變代碼的函數(shù)、緩沖區(qū)不是8字節(jié)類型且大小不大于4個字節(jié)的函數(shù)。[0080]進一步地,主函數(shù)入口的查找方式可能與軟件的編譯器類型相關(guān),本發(fā)明實施例給出了如下可選方案:如圖5所示,上述裝置還包括:[0081]編譯器類型確定單元501,用于在上述確定單元301查找上述軟件的主函數(shù)入口之前,確定上述軟件的編譯器類型;[0082]上述確定單元301,用于使用與上述編譯器類型確定單元501確定的編譯器類型對應(yīng)主函數(shù)的特征指令,識別上述軟件的主函數(shù)入口。[0083]以上給出了五種可以不用掃描的函數(shù)舉例,需要說明的是,可能還有其它不被GS所保護的函數(shù),也不需要進行掃描,因此以上舉例不應(yīng)理解為對本發(fā)明實施例的窮舉。[0084]進一步地,為了防止誤判,本發(fā)明實施例還提供了如下方案:如圖6所示,上述裝置還包括:[0085]指令確定單元601,用于在上述掃描單元302確定存在與GS編譯開關(guān)對應(yīng)的特征指令之后,確定上述特征指令之后的設(shè)定范圍內(nèi)是否出現(xiàn)返回指令;[0086]上述判決單元303,用于若指令確定單元601確定上述特征指令之后的設(shè)定范圍內(nèi)出現(xiàn)了返回指令,則確定GS編譯開關(guān)被開啟了。[0087]值得注意的是,上述裝置實施例中,所包括的各個單元只是按照功能邏輯進行劃分的,但并不局限于上述的劃分,只要能夠?qū)崿F(xiàn)相應(yīng)的功能即可;另外,各功能單元的具體名稱也只是為了便于相互區(qū)分,并不用于限制本發(fā)明的保護范圍。[0088]另外,本領(lǐng)域普通技術(shù)人員可以理解實現(xiàn)上述各方法實施例中的全部或部分步驟是可以通過程序來指令相關(guān)的硬件完成,相應(yīng)的程序可以存儲于一種計算機可讀存儲介質(zhì)中,上述提到的存儲介質(zhì)可以是只讀存儲器,磁盤或光盤等。[0089]以上僅為本發(fā)明較佳的【具體實施方式】,但本發(fā)明的保護范圍并不局限于此,任何熟悉本【
技術(shù)領(lǐng)域:
】的技術(shù)人員在本發(fā)明實施例揭露的技術(shù)范圍內(nèi),可輕易想到的變化或替換,都應(yīng)涵蓋在本發(fā)明的保護范圍之內(nèi)。因此,本發(fā)明的保護范圍應(yīng)該以權(quán)利要求的保護范圍為準?!緳?quán)利要求】1.一種棧探測器編譯開關(guān)的檢測方法,其特征在于,包括:對軟件進行殼檢測與脫殼處理后,查找所述軟件的主函數(shù)入口確定主函數(shù);對所述主函數(shù)進行特征掃描,若存在與棧探測器GS編譯開關(guān)對應(yīng)的特征指令,則確定GS編譯開關(guān)被開啟了。2.根據(jù)權(quán)利要求1所述方法,其特征在于,在確定主函數(shù)之后還包括:對所述主函數(shù)內(nèi)的所有函數(shù)進行特征掃描,若所述主函數(shù)內(nèi)的任一函數(shù)存在與棧探測器GS編譯開關(guān)對應(yīng)的特征指令,則確定GS編譯開關(guān)被開啟了。3.根據(jù)權(quán)利要求2所述方法,其特征在于,對所述主函數(shù)內(nèi)的所有函數(shù)進行特征掃描之前還包括:確定所述主函數(shù)內(nèi)的函數(shù)的函數(shù)類型;所述對所述主函數(shù)內(nèi)的所有函數(shù)進行特征掃描包括:對除以下五種類型的函數(shù)以外的其他所有函數(shù)進行特征掃描;所述五種類型的函數(shù)包括:不包含緩沖區(qū)的函數(shù)、被定義為具有變量參數(shù)列表的函數(shù)、使用無保護的關(guān)鍵字標記的函數(shù)、在第一個語句中包含內(nèi)嵌會變代碼的函數(shù)、緩沖區(qū)不是8字節(jié)類型且大小不大于4個字節(jié)的函數(shù)。4.根據(jù)權(quán)利要求1所述方法,其特征在于,所述查找所述軟件的主函數(shù)入口之前還包括:確定所述軟件的編譯器類型;所述查找所述軟件的主函數(shù)入口包括:使用與所述編譯器類型對應(yīng)主函數(shù)的特征指令,識別所述軟件的主函數(shù)入口。5.根據(jù)權(quán)利要求1至4任意一項所述方法,其特征在于,在確定存在與GS編譯開關(guān)對應(yīng)的特征指令之后還包括:確定所述特征指令之后的設(shè)定范圍內(nèi)是否出現(xiàn)返回指令,若存在,則確定GS編譯開關(guān)被開啟了。6.一種棧探測器編譯開關(guān)的檢測裝置,其特征在于,包括:確定單元,用于對軟件進行殼檢測與脫殼處理后,查找所述軟件的主函數(shù)入口確定主函數(shù);掃描單元,用于對所述確定單元確定的主函數(shù)進行特征掃描;判決單元,用于若所述掃描單元經(jīng)掃描確定存在與棧探測器GS編譯開關(guān)對應(yīng)的特征指令,則確定GS編譯開關(guān)被開啟了。7.根據(jù)權(quán)利要求6所述裝置,其特征在于,所述掃描單元,還用于在確定主函數(shù)之后對所述主函數(shù)內(nèi)的所有函數(shù)進行特征掃描;所述判決單元,還用于若所述掃描單元經(jīng)掃描確定所述主函數(shù)內(nèi)的任一函數(shù)存在與棧探測器GS編譯開關(guān)對應(yīng)的特征指令,則確定GS編譯開關(guān)被開啟了。8.根據(jù)權(quán)利要求7所述裝置,其特征在于,還包括:函數(shù)類型確定單元,用于在所述掃描單元對所述主函數(shù)內(nèi)的所有函數(shù)進行特征掃描之前,確定所述主函數(shù)內(nèi)的函數(shù)的函數(shù)類型;所述掃描單元,用于對除以下五種類型的函數(shù)以外的其他所有函數(shù)進行特征掃描;所述五種類型的函數(shù)包括:不包含緩沖區(qū)的函數(shù)、被定義為具有變量參數(shù)列表的函數(shù)、使用無保護的關(guān)鍵字標記的函數(shù)、在第一個語句中包含內(nèi)嵌會變代碼的函數(shù)、緩沖區(qū)不是8字節(jié)類型且大小不大于4個字節(jié)的函數(shù)。9.根據(jù)權(quán)利要求6所述裝置,其特征在于,還包括:編譯器類型確定單元,用于在所述確定單元查找所述軟件的主函數(shù)入口之前,確定所述軟件的編譯器類型;所述確定單元,用于使用與所述編譯器類型確定單元確定的編譯器類型對應(yīng)主函數(shù)的特征指令,識別所述軟件的主函數(shù)入口。10.根據(jù)權(quán)利要求6至9任意一項所述裝置,其特征在于,還包括:指令確定單元,用于在所述掃描單元確定存在與GS編譯開關(guān)對應(yīng)的特征指令之后,確定所述特征指令之后的設(shè)定范圍內(nèi)是否出現(xiàn)返回指令;所述判決單元,用于若指令確定單元確定所述特征指令之后的設(shè)定范圍內(nèi)出現(xiàn)了返回指令,則確定GS編譯開關(guān)被開啟了?!疚臋n編號】G06F21/12GK104008314SQ201310057221【公開日】2014年8月27日申請日期:2013年2月22日優(yōu)先權(quán)日:2013年2月22日【發(fā)明者】周力申請人:騰訊科技(深圳)有限公司