欧美在线观看视频网站,亚洲熟妇色自偷自拍另类,啪啪伊人网,中文字幕第13亚洲另类,中文成人久久久久影院免费观看 ,精品人妻人人做人人爽,亚洲a视频

非法代碼執(zhí)行的防止方法、非法代碼執(zhí)行的防止用程序以及非法代碼執(zhí)行的防止用程序...的制作方法

文檔序號:6496079閱讀:268來源:國知局
專利名稱:非法代碼執(zhí)行的防止方法、非法代碼執(zhí)行的防止用程序以及非法代碼執(zhí)行的防止用程序 ...的制作方法
技術(shù)領(lǐng)域
本發(fā)明涉及保護在計算機上動作的程序不受到非法代碼引起的動作不完備或者外部攻擊的非法代碼執(zhí)行的防止方法、非法代碼執(zhí)行的防止用程序以及非法代碼執(zhí)行的防止用程序的記錄媒體。
更詳細地講,涉及檢測緩沖區(qū)溢出,改善程序的動作不完備的非法代碼執(zhí)行的防止方法,非法代碼執(zhí)行的防止用程序以及非法代碼執(zhí)行的防止用程序的記錄媒體。
背景技術(shù)
電子計算機的操作系統(tǒng)被復(fù)雜地設(shè)計出來。從而,在操作系統(tǒng)中,存在稱為安全漏洞的弱點。所謂安全漏洞,是由軟件設(shè)計的缺陷或者錯誤產(chǎn)生的脆弱性的構(gòu)造。存在惡意的使用者有時利用操作系統(tǒng)的該安全漏洞,非法地侵入操作系統(tǒng),進行侵犯、攻擊等惡意的行為。作為其方法,有利用存儲器的緩沖區(qū)溢出的方法。
這里,說明緩沖區(qū)溢出。在電子計算機中動作的程序由程序代碼和程序數(shù)據(jù)的兩個部分構(gòu)成。程序代碼是用機器語言編寫的只用于讀出的代碼。程序數(shù)據(jù)是根據(jù)操作系統(tǒng)的執(zhí)行命令執(zhí)行的程序代碼在存儲器上的位置等的信息部分。
程序通常保存在計算機的硬盤中。當(dāng)由操作系統(tǒng)調(diào)出并執(zhí)行程序時,程序整體或者其一部分保存在作為電子計算機的主存儲器的RAM(隨機訪問存儲器)中動作。主存儲器是能夠從計算機的CPU(中央處理裝置)直接進行數(shù)據(jù)讀寫的存儲器,針對每一個保存數(shù)據(jù)的單位容量建立地址號碼進行管理。把主存儲器的地址號碼小的一方作為高位地址(高位存儲器)區(qū),如果地址號碼增大,則作為低位地址(低位存儲器)區(qū)。以下,僅把主存儲器作為存儲器進行說明。
如果由操作系統(tǒng)讀出程序,則存儲器的一部分分配給該程序,在該所分配的存儲器的高位地址(高位存儲器)區(qū)中保存程序數(shù)據(jù),在低位地址(低位存儲器)區(qū)中保存程序代碼。程序數(shù)據(jù)分為棧數(shù)據(jù)(棧數(shù)據(jù))、堆數(shù)據(jù)(堆數(shù)據(jù))、狀態(tài)數(shù)據(jù)(狀態(tài)數(shù)據(jù))的三個數(shù)據(jù)區(qū)。這三個數(shù)據(jù)區(qū)相互獨立配置在存儲器中。如果由操作系統(tǒng)從硬盤調(diào)用所執(zhí)行的程序,則首先讀出程序代碼保存在存儲器中。接著,讀出程序數(shù)據(jù)保存在存儲器中。
圖5是表示電子計算機的存儲器的構(gòu)造的概念圖。存儲器的高位地址一側(cè)成為棧存儲區(qū)。在每次執(zhí)行程序時,棧存儲區(qū)在這里確保其程序和程序內(nèi)的子程序用的棧存儲器,順序保存到存儲器的低位地址。棧存儲器由變元區(qū)、返回地址區(qū)、棧數(shù)據(jù)區(qū)等構(gòu)成。
存儲器的低位地址一側(cè)由堆數(shù)據(jù)區(qū)、棧數(shù)據(jù)區(qū)、程序代碼區(qū)等區(qū)域構(gòu)成。棧數(shù)據(jù)區(qū)與程序代碼區(qū)相比較位于高位地址區(qū)一側(cè),是預(yù)約全部變量和staticC++等級號碼的存儲區(qū)。堆數(shù)據(jù)區(qū)位于比棧數(shù)據(jù)區(qū)高位的地址一側(cè)。堆數(shù)據(jù)區(qū)是分配給C語言的malloc( )、alloc( )函數(shù)、C++語言的new操作器的區(qū)域。
棧存儲區(qū)用FIFO(后入先出)方式訪問。棧存儲器保存執(zhí)行命令結(jié)束了以后執(zhí)行下一個命令的返回地址等函數(shù)參數(shù)或者局部變量等。該返回地址是非常重要的值。
圖6中例示出用C語言編寫的程序。當(dāng)執(zhí)行程序后,首先執(zhí)行main( )函數(shù)(行1~3),調(diào)用第4行的子程序的sub(Date1),使程序的處理移動到第10行。在sub( )子程序中,在第16行的return命令下,把處理移動到調(diào)用了sub( )的原來的位置。說明這時在存儲器中怎樣保存數(shù)據(jù)。
當(dāng)調(diào)用子程序后,如圖7所示,在棧存儲區(qū)中寫入數(shù)據(jù)。從棧存儲區(qū)的高位地址一側(cè)保存「向main( )的返回地址」,預(yù)約保存子程序內(nèi)的局部變量的區(qū)域。在該例子中,有變量i(第11行)和buf(第12行)。在第14行的strcpy命令下把子程序的變元Data的值復(fù)制到buf中。這時,在變元Data的值大于buf的尺寸時,局部變量i根據(jù)情況,覆蓋到向main( )程序的返回地址上。這樣,所確保的存儲器的區(qū)域中容不下進入的數(shù)據(jù),而將其寫入到用于其它變量的區(qū)域中。這就是緩沖區(qū)溢出。由于返回地址被改寫為其它的值,因此程序不能夠進行正常的動作。
通常結(jié)束執(zhí)行這些程序、程序的子程序和函數(shù)后,返回到返回地址表示的位置,繼續(xù)執(zhí)行程序。但是,如果在程序的編寫方法中有錯誤,則如在上面說明過的那樣,當(dāng)寫入數(shù)據(jù)時,有可能超過局部變量的確保區(qū)域而覆蓋返回地址。
由于返回地址的改寫而引起的緩沖區(qū)溢出的程序通常為不穩(wěn)定的執(zhí)行狀態(tài)。根據(jù)情況,程序幾乎都是失控或者停止。如果返回地址返回到有意準備的存儲器地址,則操作系統(tǒng)不知其為非法代碼而繼續(xù)執(zhí)行保存在該存儲器地址中的命令。利用了緩沖區(qū)溢出的脆弱性的攻擊就在于如此執(zhí)行有意準備的代碼。
在進行程序的執(zhí)行管理的操作系統(tǒng)中不能夠完全把握這種由緩沖區(qū)溢出引起的非法代碼的執(zhí)行。為了防止該非法代碼的執(zhí)行,重要的是如何防止或者能夠檢測返回地址的篡改和改寫。
作為解決該問題的方法,提出了在操作系統(tǒng)中加入修正的方法或者在編譯程序中建立防止緩沖區(qū)溢出的結(jié)構(gòu)的方法等。作為在操作系統(tǒng)中加入修正的方法,有非專利文獻1(Openwall Linux kernel patchproject,UPLhttp//www.openwall.com/linux/)的設(shè)計。在該設(shè)計中,為了防止開放源的操作系統(tǒng)的緩沖區(qū)溢出,用把棧的返回地址區(qū)移動到?jīng)]有執(zhí)行函數(shù)的其它存儲區(qū)中的方法應(yīng)對。
作為在編譯程序中建立防止存儲緩沖區(qū)溢出的結(jié)構(gòu)的方法,有非專利文獻2(StackGuardSimple Stack Smash Protection go GCC,URLhttp//www.immunix.com/~wagle)。該方法在GCC編譯程序中,在棧存儲器的低位地址設(shè)置保護段,來檢測數(shù)據(jù)的溢出寫入。
另外,在專利文獻1(美國公開專利號碼US2001013094?Al?-?2001-08-09,“Memory device,stack protection system,computer system,compiler,stack protection method,storage mediumand program transmission apparatus”)的情況下,在存儲裝置中定義保護數(shù)值的區(qū)域,把棧存儲器的數(shù)據(jù)保存在保護數(shù)值的區(qū)域中進行保護,執(zhí)行處理命令。由于在保護數(shù)值的區(qū)域中保護返回地址等,因此即使執(zhí)行子程序等處理指令也能夠保護程序計數(shù)器。

發(fā)明內(nèi)容
在上述任一種方法中,都需要程序代碼的變更以及重建。由此,在執(zhí)行這些方法時花費時間。另外,利用該非法代碼執(zhí)行的代表性的是計算機病毒。當(dāng)前防止計算機病毒的方法是署名方式,在未知的攻擊模型的情況下沒有任何效果。從而,在每次發(fā)生錯誤時,都需要變更操作系統(tǒng),提供批處理文件。
本發(fā)明是根據(jù)上述那樣的技術(shù)背景而完成的,達到下述的目的。
本發(fā)明的目的在于提供防止保存在電子計算機的存儲器的地址中的數(shù)據(jù)篡改,檢測數(shù)據(jù)篡改的方法,及其程序和程序的記錄媒體。
本發(fā)明的目的在于提供防止對于程序執(zhí)行時的棧存儲器內(nèi)的返回地址的篡改和進行檢測的方法。
本發(fā)明的其它目的在于提供能夠不變更硬件、操作系統(tǒng)、核心模式軟件、應(yīng)用軟件而是加以利用的非法代碼執(zhí)行的防止功能。
本發(fā)明的又一個目的在于提供即使在應(yīng)用軟件以及核心模式軟件有緩沖區(qū)溢出的脆弱性時也能夠有效地防止非法代碼執(zhí)行的功能。
本發(fā)明的又一個目的在于在執(zhí)行非法代碼之前進行檢測,抑制非法代碼的執(zhí)行。
本發(fā)明為了達到上述目的,采用以下的方法。
本發(fā)明方案1的非法代碼執(zhí)行的防止方法當(dāng)由中央運算處理裝置執(zhí)行保存在電子計算機的存儲媒體中的程序時,檢測保存在存儲器的棧存儲區(qū)的返回地址由于非法代碼的執(zhí)行而被改寫的上述存儲器的緩沖區(qū)溢出,防止發(fā)生上述緩沖區(qū)溢出。
該非法代碼執(zhí)行的防止方法的特征是備份上述返回地址,當(dāng)由于上述非法代碼的執(zhí)行而篡改上述返回地址時,根據(jù)上述中央運算處理裝置的故障排除功能檢測上述篡改。
另外,也可以在上述故障排除功能中利用的故障排除寄存器內(nèi),記錄保存上述返回地址的存儲器地址,當(dāng)篡改了記錄在上述故障排除寄存器內(nèi)的上述存儲器地址的值時,上述中央運算處理裝置輸出出錯的信號,進行上述檢測。
進而,也可以把上述返回地址保存在沒有保存執(zhí)行程序的數(shù)據(jù)的存儲區(qū)中,進行上述備份。
另外,還可以具有把保存在上述棧存儲區(qū)中的上述返回地址與上述備份了的地址進行比較,檢測上述緩沖區(qū)溢出的單元。
進而,還可以具有當(dāng)篡改了上述返回地址時,用所保存的上述返回地址改寫上述存儲器地址的控制單元。
進而,還可以把保存上述返回地址的上述棧存儲區(qū)設(shè)為只讀的屬性,保護上述返回地址,當(dāng)在設(shè)定為只讀屬性的上述棧存儲區(qū)中進行寫入時,上述中央運算處理裝置輸出出錯的信號進行上述檢測,具有當(dāng)接收到上述出錯的信號后,用于使上述程序停止或者控制上述程序的流程的控制單元。
上述返回地址也可以是當(dāng)執(zhí)行上述程序時調(diào)用的過程以及從上述過程調(diào)用的線程內(nèi)的大于等于一個的返回地址。
本發(fā)明方案2的非法代碼執(zhí)行的防止用程序用于使計算機動作,使得當(dāng)由中央運算處理裝置執(zhí)行保存在電子計算機的存儲媒體中的程序時,檢測保存在存儲器的棧存儲區(qū)中的返回地址由于非法代碼的執(zhí)行而被改寫的存儲器的緩沖區(qū)溢出,防止發(fā)生上述緩沖區(qū)溢出。
該非法代碼執(zhí)行的防止用程序的特征是由以下步驟構(gòu)成,這些步驟是當(dāng)從上述存儲媒體調(diào)用上述程序時,取得上述程序中的轉(zhuǎn)移命令進行分析的分析步驟、用于抽取上述程序的過程或者線程的上述返回地址的抽取步驟、用于把在上述棧存儲區(qū)中保存上述返回地址的地址登錄到上述中央運算處理裝置的故障排除功能的故障排除地址中的登錄步驟、當(dāng)上述程序動作時,用于控制上述程序的流程的控制步驟、登錄上述返回地址和上述地址進行備份的備份步驟,在執(zhí)行上述程序時,當(dāng)篡改上述返回地址時,通過上述故障排除功能,上述中央運算處理裝置輸出出錯信號,在上述程序的執(zhí)行中進行中斷,把上述程序的流程移動到上述控制步驟。
另外,當(dāng)改寫了上述返回地址時,上述控制步驟還可以具有使上述程序停止的步驟。
進而,當(dāng)改寫了上述返回地址時,上述控制步驟還可以具有用備份的上述返回地址改寫上述返回地址的步驟。
進而,當(dāng)改寫了上述返回地址時,上述控制步驟還可以具有保存上述改寫了的值的步驟。
還可以具有把保存上述返回地址的上述棧存儲區(qū)設(shè)置成只讀的屬性,用于保護上述返回地址的保護步驟、當(dāng)在設(shè)定為只讀屬性的上述棧存儲器中進行寫入時,上述中央運算處理裝置輸出出錯信號,用于進行上述檢測的檢測步驟、當(dāng)接收到上述出錯的信號后,用于使上述程序停止或者控制上述程序的流程的上述控制步驟。
進而,上述程序可以是從在應(yīng)用軟件、操作系統(tǒng)的軟件模塊、核心模式軟件中使用的函數(shù)、子程序中選擇出的大于等于一個的程序。
本發(fā)明方案3的非法代碼執(zhí)行的防止用程序的記錄媒體是記錄了上述非法代碼執(zhí)行的防止用程序的記錄媒體。
發(fā)明的效果如果依據(jù)本發(fā)明,則起到以下的效果。
本發(fā)明的非法代碼防止方法能夠不變更硬件、操作系統(tǒng)、核心模式軟件、應(yīng)用軟件而防止非法代碼的執(zhí)行。
本發(fā)明的非法代碼防止方法當(dāng)應(yīng)用軟件以及核心模式軟件具有緩沖區(qū)溢出的脆弱性時也能夠有效地應(yīng)對。
本發(fā)明的非法代碼防止方法能夠在執(zhí)行非法代碼之前進行檢測,抑制非法代碼的執(zhí)行。


圖1是圖示出本發(fā)明的概要的概念圖。
圖2是表示本發(fā)明的緩沖區(qū)溢出的出錯檢測的概念圖。
圖3是表示執(zhí)行文件的裝載時的順序的流程圖。
圖4是表示執(zhí)行文件的執(zhí)行時的順序的流程圖。
圖5是表示存儲器的構(gòu)造的圖。
圖6是例示了程序的主程序和子程序的圖。
圖7是表示棧存儲器的構(gòu)造的圖。
圖8是表示驅(qū)動器軟件起動時的初始化處理的順序的流程圖。
圖9是表示過程生成回叫的登錄的順序的流程圖。
圖10是表示線程生成事件的連接設(shè)定的順序的流程圖。
圖11是表示正在跟蹤CALL、RET等轉(zhuǎn)移命令時的處理過程的流程圖。
圖12是表示圖11的CALL或者JMP處理的處理順序的流程圖。
圖13是表示執(zhí)行CALL命令時的處理的流程圖。
圖14是表示執(zhí)行RET命令時的處理的流程圖。
圖15是表示執(zhí)行RET命令時的處理的流程圖。
圖16是表示JPM ESP處理的順序的流程圖。
符號的說明1......軟件2......驅(qū)動器軟件3......文件系統(tǒng)驅(qū)動器4......硬盤5......可執(zhí)行文件6......存儲器10......網(wǎng)卡具體實施方式
以下,根據(jù)附圖具體地說明本發(fā)明的最佳實施形態(tài)。

以下,說明本發(fā)明的實施形態(tài)1。
本發(fā)明提供檢測改寫、篡改保存在電子計算機的主存儲器中的數(shù)據(jù)的行為的方法。另外,提供用于根據(jù)該方法,檢測改寫、篡改保存在電子計算機的主存儲器中的數(shù)據(jù)的行為,恢復(fù)被改寫或者被篡改了的數(shù)據(jù)的程序。進而,本發(fā)明提供記錄了該程序的記錄媒體。說明本發(fā)明的實施形態(tài)的概要。
CPU的故障排除功能是用于檢測在執(zhí)行應(yīng)用程序時發(fā)生的錯誤的功能。為此,在CPU中準備多個稱為故障排除寄存器的存儲器,利用為監(jiān)視主存儲器的特定地址的動作。在該故障排除寄存器中登錄所監(jiān)視的地址的地址以及CPU動作,當(dāng)變更該地址的值時CPU檢測出該動作,輸出出錯信號。而且,能夠在應(yīng)用程序的執(zhí)行中進行中斷,使其它的程序動作。
在本實施形態(tài)1中,說明檢測基于緩沖區(qū)溢出的非法代碼的執(zhí)行,防止數(shù)據(jù)篡改等的程序的動作。當(dāng)程序在電子計算機上動作時,如在現(xiàn)有技術(shù)中說明過的那樣,針對每次調(diào)用程序、子程序和函數(shù),其返回地址保存在棧存儲區(qū)中。在電子計算機的CPU的故障排除寄存器中,指定并預(yù)先登錄保存返回地址的主存儲器的地址。
另外,同時把返回地址預(yù)先備份在主存儲器的其它區(qū)域中。如果篡改該地址的數(shù)據(jù),則由CPU檢測錯誤,在所執(zhí)行的程序中進行中斷,使控制移動到其它的程序,能夠防止數(shù)據(jù)篡改、非法代碼的執(zhí)行。把備份了的返回地址改寫到原來的地址,使程序返回到正常的動作。另外,還能夠備份被改寫了的地址,在基于緩沖區(qū)溢出的計算機病毒攻擊的模型分析中利用。
以下,本發(fā)明實施形態(tài)1的非法代碼防止方法為了實現(xiàn)利用了該故障排除寄存器的檢測數(shù)據(jù)的篡改,修復(fù)被篡改了的數(shù)據(jù)的方法,提供驅(qū)動器軟件層和出錯程序。該驅(qū)動器軟件層具有把握上述的返回地址,登錄到故障排除寄存器中進行備份的功能。出錯程序提供如果篡改返回地址的數(shù)據(jù),則修復(fù)該篡改的功能。以下,詳細地說明本發(fā)明的實施形態(tài)1。
圖1表示本發(fā)明的實施形態(tài)的概要。在圖1中,圖示出在電子計算機上動作的軟件1、驅(qū)動器軟件2、文件系統(tǒng)驅(qū)動器3、硬盤4。通常,可執(zhí)行的程序作為可執(zhí)行的文件5保存在硬盤4中,按照操作系統(tǒng)的調(diào)用命令讀出,保存到存儲器6中。軟件1意味著在電子計算機上動作的應(yīng)用程序。該應(yīng)用程序可以是在操作系統(tǒng)的核心模式或者用戶模式下動作的任一種程序。
驅(qū)動器軟件2位于文件系統(tǒng)驅(qū)動器3與操作系統(tǒng)提供的服務(wù)之間,是進行從操作系統(tǒng)向或者從電子計算機的各設(shè)備讀出/寫入時的控制的程序。
文件系統(tǒng)驅(qū)動器3是用于讀出在電子計算機內(nèi)置的或者與電子計算機連接的存儲裝置中保存的數(shù)據(jù),并在該存儲裝置中寫入數(shù)據(jù)的驅(qū)動器。硬盤4通常是在電子計算機中內(nèi)置的硬盤。但是如果是保存了軟件1,能夠從操作系統(tǒng)調(diào)用執(zhí)行,則也可以是外裝硬盤、閃存、CD-ROM等外存裝置。
在本實施形態(tài)1中,采用從文件系統(tǒng)調(diào)用程序(圖1的可執(zhí)行文件5)的命令經(jīng)過驅(qū)動器軟件2向文件系統(tǒng)驅(qū)動器3發(fā)送的形式。
文件系統(tǒng)驅(qū)動器3從硬盤4調(diào)用程序,傳送給驅(qū)動器軟件2。驅(qū)動器軟件2分析程序,把握主程序、子程序,取得各個返回地址,進行檢測緩沖區(qū)溢出的控制。返回地址是用于按照CALL命令等轉(zhuǎn)移命令輸出并保存到棧存儲器中,按照RET、RETxx命令返回的地址。
參照圖3的流程圖說明該一系列的動作。從操作系統(tǒng)或者應(yīng)用程序起動程序(圖1的可執(zhí)行文件5)(步驟1)。驅(qū)動器軟件2檢測出程序的起動(步驟2)。驅(qū)動器軟件2分析程序,把握主程序、子程序,取得各個返回地址。驅(qū)動器軟件2檢查通過程序的起動所生成的變元、局部變量、函數(shù)地址(步驟3),保存函數(shù)地址。具體地講,檢查在程序內(nèi)執(zhí)行的呼叫(CALL)、返回(RET、RETN)、跳轉(zhuǎn)(JMP)等轉(zhuǎn)移命令的執(zhí)行事件,取得并保存返回地址(步驟4)。
而且,驅(qū)動器軟件2在執(zhí)行程序的期間,使呼叫命令(CALL命令)等轉(zhuǎn)移命令掛鉤,以便能夠使控制移動到驅(qū)動器軟件2(步驟5)。具體地講,調(diào)用OS提供的PsSetLoadlmageNotifyRoutine( ),在過程起動時登錄調(diào)用的回叫函數(shù)(LoadlmageNotifyRoutine)。在線程生成的情況下,取得beginthread( )的開始地址,在該開始地址中設(shè)置斷點。驅(qū)動器軟件2在程序的執(zhí)行時,安裝棧存儲器上的返回地址的保護和檢測篡改的功能(步驟6)。
在返回地址的保護中,利用上述的CPU的故障排除功能。這樣,在CPU的故障排除功能內(nèi),具有如果改寫特定的存儲器地址則進行出錯輸出的功能,能夠使控制移動到所指定的地址。這時,在CPU的故障排除寄存器中指定返回地址的存儲器地址,當(dāng)檢測到出錯時,操作系統(tǒng)輸出中斷命令,把控制移動到驅(qū)動器軟件2。
在返回地址中適用該功能。由此,設(shè)定成如果改寫返回地址,則通過故障排除功能檢測到出錯,把控制向驅(qū)動器軟件2移動。驅(qū)動器軟件2執(zhí)行在步驟1中指定的程序(步驟7)。
圖4是表示檢測驅(qū)動并執(zhí)行程序時的緩沖區(qū)溢出的順序的流程圖。
在執(zhí)行程序時如果從操作系統(tǒng)或應(yīng)用程序執(zhí)行調(diào)用命令(Call命令),則發(fā)生CPU的中斷,控制移動到驅(qū)動器軟件2(步驟10~11)。驅(qū)動器軟件2檢查通過程序的執(zhí)行生成的變元、局部變量、函數(shù)地址(步驟12),根據(jù)故障排除功能,保護或者存儲執(zhí)行時的棧存儲器上的返回地址(步驟13)。
把保存返回地址的棧存儲器設(shè)定為只讀屬性進行該保護。當(dāng)在該棧存儲器中進行寫入時,CPU發(fā)生出錯,由于發(fā)生CPU的中斷,控制移動到驅(qū)動器軟件2,因此不能夠變更、篡改返回地址,能夠進行保護。上述的存儲把棧存儲器上的返回地址備份到存儲器的其它區(qū)域中保存。當(dāng)篡改了返回地址時,與該備份返回地址進行比較,能夠檢驗篡改。
而且,驅(qū)動器軟件3輸出命令(IRET)(步驟14),向在步驟11中中斷了的執(zhí)行地址返回控制(步驟15),執(zhí)行命令(步驟16)。
在程序的執(zhí)行過程中如果成為緩沖區(qū)溢出,則覆蓋返回地址,CPU輸出出錯。另外,在即將從調(diào)用的函數(shù)返回之前,驅(qū)動器軟件把在步驟13中保存的返回地址與棧上的返回地址進行比較(步驟17~19)。驅(qū)動器軟件2檢測出錯(步驟20)。而且,中斷程序的執(zhí)行,控制向出錯程序移動(步驟21)。出錯程序(未圖示)是在檢測到出錯時執(zhí)行,具有停止執(zhí)行程序,保存棧存儲器的內(nèi)容或者把返回地址用事前保存的數(shù)據(jù)改寫等功能的程序。根據(jù)該出錯程序,能夠停止、繼續(xù)程序的執(zhí)行,而且能夠保存非法代碼(步驟22)。
在圖2中圖示出從外部攻擊計算機的例子。經(jīng)過網(wǎng)卡10,傳送來具有病毒或者非法代碼等的外部數(shù)據(jù)。外部數(shù)據(jù)經(jīng)過網(wǎng)卡10、NDIS11、Winsock12保存在存儲器6中。當(dāng)外部數(shù)據(jù)保存到存儲器6中時,如果改寫程序的返回地址的一部分或者全部,則CPU輸出出錯,控制移動到驅(qū)動器軟件2。驅(qū)動器軟件2接收該出錯檢測,掛鉤出錯程序來應(yīng)對。
這樣,能夠全部把握利用了緩沖區(qū)溢出的非法侵入和攻擊進行對應(yīng)處理。能夠停止執(zhí)行中的過程,保存棧存儲器的內(nèi)容,繼續(xù)執(zhí)行原來的過程等。通過停止過程,停止正在執(zhí)行的過程,能夠制止程序的失控。通過保存棧存儲器的內(nèi)容,能夠保存非法代碼,能夠在以后的分析等作業(yè)中把握攻擊、病毒的種類及其模型。
本實施形態(tài)不僅適應(yīng)于只在用戶模式下動作的應(yīng)用程序,還能夠適應(yīng)于在核心模式下動作的程序。另外,如果是能夠在同樣的方法下利用緩沖區(qū)溢出的方法的程序,則就都能夠適應(yīng)。
(實施例)示出本發(fā)明的實施形態(tài)1的實施例。在本實施例中,是Intel公司(登錄商標)的32比特結(jié)構(gòu)的處理器,假定安裝了命令跟蹤功能。具體地講,在PentiumPro(登錄商標)以后開發(fā)的處理器或者與該處理器具有互換性的處理器。操作系統(tǒng)是微軟公司的Windows2000(登錄商標)。
驅(qū)動器軟件2動作,進行作為用于檢測緩沖區(qū)溢出的準備的初始化處理,如果執(zhí)行程序則檢測所發(fā)生的過程和線程,把握主程序、子程序。而且,驅(qū)動器軟件2如果檢測出存儲器溢出,則作為出錯程序使過程中斷處理動作進行應(yīng)對。對這些動作詳細地進行說明。
如果驅(qū)動器軟件起動,則進行初始化處理(參照圖8,在后面進行說明。)。在該初始化處理中,進行在調(diào)用程序時所生成的過程和線程的檢測。該初始化處理的詳細過程用圖8~10的流程圖(后述)表示。
在進行了該初始化處理以后,程序開始動作。全部登錄并跟蹤在該程序的動作過程中執(zhí)行的跳轉(zhuǎn)(JMP)、呼叫(CALL)、返回(RET)等轉(zhuǎn)移命令。如果執(zhí)行CALL、RET、RETxx命令時,則檢測緩沖區(qū)溢出。CALL、RET、RETxx命令的檢測在圖11、12所示的流程圖中表示。
檢測了CALL、RET、RETxx命令以后的處理在圖13~圖16的流程圖和與該流程圖相對應(yīng)的說明中的程序代碼中表示。
(初始化處理)圖8的流程圖表示初始化處理的概要。首先,驅(qū)動器軟件起動,從登記處讀入監(jiān)視緩沖區(qū)溢出的過程名(步驟100)。然后,登錄監(jiān)視對象的過程的過程生成回叫(步驟101)。關(guān)于該過程生成回叫的登錄的詳細過程在圖9的流程圖中表示。然后,把棧記錄器初始化,確保存儲區(qū)(步驟102)。而且,進行監(jiān)視對象線程的線程生成事件的掛鉤設(shè)定(步驟103)。然后,開始執(zhí)行命令的跟蹤。
調(diào)用OS提供的PsSetLoadImageNotifyRoutine( ),登錄在過程起動時調(diào)用的回叫函數(shù)( )進行過程生成回叫的登錄。該回叫函數(shù)用以下的標準定義。
void LoadImageNotifyRoutine(PUNICODE_STRING FullImageName,HANDLE ProcessId,PIMAGE_INFO ImageInfo)其次,在圖9的流程圖中表示過程生成回叫的登錄的順序。如果生成過程,則調(diào)用LoadImageNotifyRoutine函數(shù)(步驟110)。以下,表示LoadImageNotifyRoutine內(nèi)的動作。判定是否是所監(jiān)視的對象的過程(步驟111)。在該判定時,檢查在LoadImageNotifyRoutine的變元FullImageName中是否存在成為對象的過程模塊名。存在時轉(zhuǎn)移到隨后的處理(是)。
取得過程模塊的進入點地址(步驟112)。檢查在Windows中使用的執(zhí)行模塊文件的起始部分(標題),取得首先執(zhí)行的函數(shù)(進入點)的地址。然后,在進入點,設(shè)置斷點(步驟113)。這時的程序代碼的例子如下。
PVOID ImageBase=(PVOID)ImageInfo->ImageBase;
MZ_HEADER*mz_Header=(MZ_HEADER*)ImageBase;
MZ_NE*mz_ne=(MZ_NE*)((char*)ImageBase+sizeof(MZ_HEADER));I MAGE_NT_HEADERS*ImageNtHeaders=(IMAGE_NT_HEADERS*)((char*)ImageBase+mz_ne->ne_header);char*EntryPoint=(char*)((ULONG)ImageInfo->ImageBase+ImageNtHeaders->OptionalHeader.AddrassOfEntryPoint);
然后,使IA-32命令的跟蹤功能有效,為了登錄跟蹤回叫函數(shù)(ASO_Hook_INT01H),改寫IDT(中斷描述符表)的01H(步驟114)。用于該登錄的程序代碼如下。
<pre listing-type="program-listing">   IDTR idtr;   PIDTENTRY OIdt;   PIDTENTRY NIdt;   _asm{   SIDT idtr;   }   OIdt=(PIDTENTRY)MAKELONG(idtr.LowIDTbase,idtr.HiIDTbase);   gOIdINT01H_Handler=MAKELONG(OIdt[IGATE01].OffsetLow,OIdt[IGATE01].OffsetHigh);   NIdt=&amp;amp;(OIdt[IGATE01]);   _asm{   LEA EAX,ASO_Hook_INT01H//   MOV EBX,NIdt;   MOV [EBX],AX   SHR EAX,16   MOV [EBX+6],AX;   LIDT idtr   }</pre>在過程起動時最初執(zhí)行的命令中設(shè)定硬件斷點,以便在執(zhí)行時調(diào)用跟蹤回叫函數(shù)(ASO_Hook_INT01H)(步驟115)。進行該動作的程序代碼如下。
MOV EAX,KickStartAddress//最初に実行される命のアドレスMOV DR0,EAXMOV EAX,DR7OR EAX,0x00000000;//Set LEN0=00(1Byte Length)OR EAX,0x00000000;//Set R/W0=00(On Execution Only)OR EAX,0x00000200;//Set GEOR EAX,0x00000002;//Enable G0MOV DR7,EAX; //Set DR7在每次生成所指定的監(jiān)視對象的過程的線程時動態(tài)實施棧記錄器的初始化(參照步驟102)。棧記錄器的各棧定義如下。
typedef struct_ASO_STACK_LIST{LIST_ENTRY m_LIstEntry;
ULONG ThreadId;
ULONG*StackPointer;
LONG CurrentStackLocation;
}ASO_STACK_LIST,*PASO_STACK_LIST;
在圖10的流程圖中表示線程生成事件的掛鉤設(shè)定(參照步驟103)的順序。如果生成線程(步驟120),則判定是否是所監(jiān)視的對象的過程(步驟121)。當(dāng)所生成的線程是所監(jiān)視的對象的過程時,取得_beginthread的開始地址(步驟122)。在該開始地址中設(shè)置斷點(步驟123)。然后,開始跟蹤(步驟124)。
在多個線程的系統(tǒng)中,通過把作為生成線程的核心API的NtCreateThread掛鉤而適用。為此,改寫在調(diào)用NtCreateThread時所經(jīng)過的矢量2E的中斷處理程序(ASO_Hook_INT2EH)。這時的程序代碼如下。
<pre listing-type="program-listing">  IDTR idtr;  PIDTENTRY OIdt;PIDTENTRY NIdt;_asm SIDT idtr;OIdt=(PIDTENTRY)MAKELONG(idtr.LowIDTbase,Idtr.HllDTbase);gOIdINT2EH_Handler=MAKELONG(OIdt[IGATE2E].OffsetLow,  OIdt[IGATE2E].OffsetHigh);  NIdt=&amp;amp;(OIdt[IGATE2E]);  _asm{   CLI   LEA EAX,ASO_Hook_INT2EH   MOV EBX,NIdt;   MOV [EBX],AX   SHR EAX,16   MOV [EBX+6],AX;   LIDT idtr   STI  }</pre>在線程生成事件(CreateThread( ))的掛鉤設(shè)定中使用的程序代碼如下。
KIRQL OIdIrql;
KeRaiseIrql(HIGH_LEVEL,&amp;OldIrql);
_asm{PUSHAD//for CreateThread()MOV EAX,EBP //現(xiàn)在のEBPMOV EAX,[EAX] //前のEBP(ASO_Hook_INT2BH)MOV EAX,[EAX] //前のEBP(CreateThread)ADD EAX,0x10//Stack+10H(IpStartAddress)MOV EBX,[EAX] //EBX&lt;-Thread addressCMP EBX,0x7800BE4A //if EBX==_beginthread's start_address(2K+SP0)thenJNZ SET_MEMORYBREAK//for_beginthread()MOV EAX,EBP //現(xiàn)在のEBPMOV EAX,[EAX] //前のEBP(ASO_Hook_INT2BH)MOV EAX,[EAX] //前のEBP(CreateThread)MOV EAX,[EAX] //前のEBP(_begInthread)ADD EAX,0x0C//Stack+0CH(start_address)MOV EBX,[EAX] //EBX&lt;-Thread addressSET_MEMORYBREAK:
PUSH EBX //Param1CALL InstallNewInt01 HandlerPOPAD}
這樣,當(dāng)結(jié)束一系列的初始化處理后,執(zhí)行程序,跟蹤CALL、RET等轉(zhuǎn)移命令。其次,圖11、12的流程圖中表示正在跟蹤時的處理。在開始跟蹤處理后(步驟150),清除DR6的跟蹤標志(步驟151),判別CALL命令、RET命令。在圖11、圖12的轉(zhuǎn)移判定時(步驟154~183),判別CALL、RET、RETN命令,分別成為「至CALL處理」、「至RET處理」、「至RENT處理」?!钢罜ALL處理」、「至RET處理」、「至RENT處理」分別在圖13、圖14、圖15的流程圖中表示。
判別CALL、RET、RETN命令時的程序代碼如下。
<pre listing-type="program-listing">  //DR6<-0x00000000  MOV EAX,DR6  AND EAX,0xFFFFBFFF  MOV DR6,EAX  //EDX:EAX<-LastBranchFromIp  MOV ECX,0x000001DB;//MSR=0x01DB(LastBranchFromIp)  RDMSR;  PUSH ES  MOV BX,0x001B  MOV ES,BX  MOV EDX,EAX  MOV EAX,ES:[EAX]  POP ES  //  //Branch on Instruction  //  CMP AL,0xE8 //Relative near call  JZ CALL_FOUND  CMP AL,0xFF //Direct near/far call  JZ CALLORJMP_FOUND  CMP AL,0x9A //Direct far call  JZ CALL_FOUND  CMP AL,0xC3 //near RET  JZ RET_FOUND  CMP AL,0xCB //far RET  JZ RET_FOUND  CMP AL,0xC2 //near RET with POP  JZ RETN_FOUND  CMP AL,0xCA //far RET with POP  JZ RETN_FOUND  JMP CALL_NOTFOUND  CALLORJMP_FOUND:  TEST AH,0x10 //CALL/2  JNZ CALL_FOUND  TEST AH,0x18 //CALL/3  JNZ CALL_FOUND  CMP AH,0xE4 //JMP ESP  JZ JMPESP_FOUND  JMP CALL_NOTFOUND</pre>這里,CALL、RET、RETN的判別分別作為CALL_FOUND、RET_FOUND、RETN_FOUND被編碼。在程序代碼的轉(zhuǎn)移命令下跳轉(zhuǎn)到CALL_FOUND時視為執(zhí)行CALL命令,進行圖13的流程圖所示的處理。RET、RETN的情況也相同。
圖13中表示執(zhí)行CALL命令時的處理。當(dāng)開始執(zhí)行CALL命令后(步驟200),取得分配給CALL命令的棧存儲器的棧段(CS)的地址(步驟201)。然后,取得用CALL命令保存的返回地址的棧點(步驟202)。然后,從棧存儲器取得返回地址(步驟203)。這時的程序代碼如下。
<pre listing-type="program-listing">  CALL_FOUND:  PUSH ES  //Get Stack segment(CS)  MOV ECX,EBP  ADD ECX,+4+4+4+4+4  MOV EAX,[ECX]  MOV ES,AX  //Get Stack pointer  MOV ECX,EBP  ADD ECX,+4+4+4+4  LES EDX,[ECX]//Now EDX point to Stack Address  //Get RetIP  MOV ECX,EDX  MOV AX,0x001B //Usermode Only  MOV ES,AX //  MOV EDX,ES:[ECX] //Retrieve RetIP on Stack  //  //Now EDX point to RetIP on Stack  //  POP ES</pre>把該取得的返回地址登錄到棧記錄器中(步驟204)。這時的程序代碼如下。
<pre listing-type="program-listing">  KeRalseIrql(HIGH_LEVEL,&amp;amp;OIdIrql);  PASO_STACK_LIST StackList=(PASO_STACK_LIST)gStackList[ThreadId];  if(StackList==0){   //Error  }else if(StackList->CurrentStackLocation>STACK_LIMIT){   StackList=NULL;  }else if(StackList->CurrentStackLocation&gt;=0){   StackList->StackPointer[StackList->CurrentStackLocation]=ExpectedRetIp;   StackList->CurrentStackLocation++;  }  KeLowerIrql(OldIrql);</pre>然后,設(shè)定MSR和EFLAG,再次開始命令跟蹤(步驟205、206)。用IRETD結(jié)束處理。
在圖14中表示執(zhí)行RET命令時的處理。當(dāng)開始執(zhí)行RET命令后(步驟250),取得分配給RET命令的棧存儲器的棧段(CS)的地址(步驟251)。然后,取得用RET命令指定的返回地址的棧點(步驟252)。然后,從棧存儲器取得返回地址(步驟253)。這時的程序代碼如下。
<pre listing-type="program-listing">  RET_FOUND:  PUSH ES  //Get Stack segment(CS)  MOV ECX,EBP  ADD ECX,+4+4+4+4+4  MOV EAX,[ECX]  MOV ES,AX  //Get Stack pointer  MOV ECX,EBP  ADD ECX,+4+4+4+4  MOV EAX,[ECX]  LES EDX,[ECX] //Now EDX point to Stack Address  SUB EDX,+4//Back 4Bytes from Current Stack Address  MOV ECX,EDX  MOV AX,0x001B  MOV ES,AX  MOV EDX,ES:[ECX]</pre>然后,從棧記錄器檢索是否存在與返回地址相同的值(步驟254)。返回地址是在與該RET命令相對應(yīng)的CALL命令時登錄到棧記錄器中的地址。但是,在篡改了返回地址的情況下,不能夠從棧記錄器中找到相同的地址。這時,移動到過程中斷處理(下一個代碼的Terminate_VirusCode( ))(步驟260)。如果找到相同的地址,則從棧記錄器清除一個代碼(步驟255)。這時的程序代碼如下。
<pre listing-type="program-listing">  KeRaiseIrql(HIGH_LEVEL,&amp;amp;OldIrql);  PASO_STACK_LIST StackList=(PASO_STACK_LIST)gStackList[ThreadId];  If(StackList==0){   //Stack not found  }else if(StackList-&gt;CurrentStackLocation>0){   StackList-&gt;CurrentStackLocation-;   ULONG ExpectedRetIp   =StackList->StackPointer[StackList-&gt;CurrentStackLocation];   StackList-&gt;StackPointer[StackList->CurrentStackLocation]=0;   if(ExpectedRetIp I=ToIp){   LONG i;   BOOLEAN StackFound=FALSE;   for(I=StackList->CurrentStackLocation;i>=0;i-){   if(StackList->StackPointer[i]==ToIp){   LONG j;   for(j=i;j<=StackList->CurrentStackLocation;j++){   StackList->StackPointer[j]=0;   }   StackList->CurrentStackLocation=i;   StackFound=TRUE;   break;   }   }   if(IStackFound){   //Not found   Terminate_VirusCode(FromIp,ToIp,ExpectedRetIp);   }   }  }else{   DbgPrint("Illegal Stack Locationn");  }  KeLowerIrql(OldIrql);</pre>然后,設(shè)定MSR和EFLAG,再次開始命令跟蹤(步驟256、257)。用IRETD結(jié)束處理。
在圖15中表示執(zhí)行RETN命令時的處理。當(dāng)開始執(zhí)行RETN命令后(步驟300),取得分配給RETN命令的棧存儲器的棧段(CS)的地址(步驟301)。然后,取得用RETN命令指定的返回地址的棧點(步驟302)。然后,從棧存儲器取得返回地址(步驟303)。這時的程序代碼如下。
<pre listing-type="program-listing">  RETN_FOUND:  //Get Stack Byte Length  ADD EDX,+1  MOV EAX,[EDX]  PUSH ES  PUSH EAX  //Get Stack segment(CS)  MOV ECX,EBP  ADD ECX,+4+4+4+4+4  MOV EAX, [ECX]  MOV ES,AX  //Get Stack pointer  MOV ECX,EBP  ADD ECX,+4+4+4+4  MOV EAX,[ECX]  LES EDX,[ECX]//Now EDX point to Stack Address  POP EAX  MOVZX EAX,EAX  SUB EDX,EAX  SUB EDX,+4  MOV ECX,EDX  MOV AX,0x001B  MOV ES,AX  MOV EDX,ES:[ECX]</pre>然后,從棧記錄器檢索是否存在與返回地址相同的值(步驟304)。返回地址是在與該RETN命令相對應(yīng)的CALL命令時登錄到棧記錄器中的地址。但是,在篡改了返回地址的情況下,不能夠從棧記錄器中找到相同的地址。這時,移動到過程中斷處理(下一個代碼的Terminate_VirusCode( ))(步驟310)。如果找到相同的地址,則從棧記錄器清除一個代碼(步驟305)。這時的程序代碼如下。
<pre listing-type="program-listing">  KeRaiseIrql(HIGH_LEVEL,&amp;amp;OldIrql);  PASO_STACK_LIST StackList=(PASO_STACK_LIST)gStackList[Threadid];  if(StackList==0){   //Stack not found  }else if(StackList->CurrentStackLocation>0){   StackList->CurrentStackLocation-;   ULONG ExpectedRetIp   =StackList->StackPointer[StackList->CurrentStackLocation];   StackList->StackPointer[StackList->CurrentStackLocation]=0;   if(ExpectedRetIp I=ToIP){   LONG i;   BOOLEAN StackFound=FALSE;   for(I=StackList->CurrentStackLocation;i>=0;i-){   if(StackList->StackPointer[i]==ToIp){   LONG j;   for (j=i;j<=StackList->CurrentStackLocation;j++){  StackList->StackPointer[j]=0;   }   StackList->CurrentStackLocation=i;   StackFound=TRUE;   break;   }   }   if(IStackFound){  //Not found  Terminate_VirusCode(FromIp,ToIp,ExpectedRetIp);   }  }  }else{  DbgPrint("Illegal Stack Locationn");  }  KeLowerIrql(OldIrql);</pre>然后,設(shè)定MSR和EFLAG,再次開始命令跟蹤(步驟306、307)。用IRETD結(jié)束處理。
在圖16中表示執(zhí)行JMP ESP處理時的處理。JMP ESP是例如經(jīng)過網(wǎng)絡(luò)侵入的病毒等為了執(zhí)行棧存器上的程序代碼所必需的命令。因此,不依賴于棧的返回地址的檢索結(jié)果,由于使用JMP ESP命令執(zhí)行的模塊稀少,因此使其為禁止對象。當(dāng)判斷為是JMP ESP后,進行過程中斷處理(步驟351)。
步驟260、310、351的過程中斷處理取得在RET、RETN命令以后執(zhí)行的命令的地址,把其改寫為非法命令(INT3等)。繼續(xù)執(zhí)行過程,以非法命令停止過程。這時的程序代碼如下。
<pre listing-type="program-listing">  void_stdcall Terminate_VirusCode(ULONG FromIp,ULONG ToIp)  {   IsDetected=TRUE;   //Rewrite FromIp(Next instruction of JMP ESP)to INT3   _asm{  PUSH EAX  PUSH EDX  MOV AL,0xCC//INT3  MOV EDX,FromIp  MOV SS:[EDX],AL  POP EDX  POP EAX  }  }</pre>如上所述,能夠全部把握并且應(yīng)對利用了緩沖區(qū)溢出的非法入侵和攻擊。能夠停止所執(zhí)行的過程,制止程序的失控。
這樣的方法也能夠適應(yīng)于有可能實現(xiàn)緩沖區(qū)溢出的所有的操作系統(tǒng)。
(其它的實施形態(tài))產(chǎn)業(yè)上的可利用性本發(fā)明能夠在計算機病毒對策、防止來自外部的非法入侵、要求安全的所有領(lǐng)域中利用。特別是,可以在與網(wǎng)絡(luò)連接的,利用了網(wǎng)絡(luò)的個人計算機、超級計算機、服務(wù)器的系統(tǒng)中利用??捎糜趥€人信息保護、要求電子文件的保密的電子政府、軍事、防務(wù)相關(guān)的系統(tǒng)中。
另外,還可以在檢測程序的缺陷、非法代碼的使用時加以利用。
權(quán)利要求
1.一種非法代碼執(zhí)行的防止方法,該方法在由中央運算處理裝置執(zhí)行保存在電子計算機的存儲媒體中的程序時,檢測保存在存儲器的棧存儲區(qū)中的返回地址由于執(zhí)行非法代碼而被改寫的上述存儲器的緩沖區(qū)溢出,防止發(fā)生上述緩沖區(qū)溢出,其特征在于備份上述返回地址,在由于執(zhí)行上述非法代碼篡改了上述返回地址時,通過上述中央運算處理裝置的故障排除功能檢測上述篡改。
2.根據(jù)權(quán)利要求1所述的非法代碼執(zhí)行的防止方法,其特征在于在上述故障排除功能中所利用的故障排除寄存器內(nèi),記錄保存上述返回地址的存儲器的地址,當(dāng)篡改了記錄在上述故障排除寄存器中的上述存儲器地址的值時,上述中央運算處理裝置輸出出錯的信號進行上述檢測。
3.根據(jù)權(quán)利要求1或2所述的非法代碼執(zhí)行的防止方法,其特征在于把上述返回地址保存在沒有保存執(zhí)行程序的數(shù)據(jù)的存儲區(qū)中,進行上述備份。
4.根據(jù)權(quán)利要求3所述的非法代碼執(zhí)行的防止方法,其特征在于具有把保存在上述棧存儲區(qū)中的上述返回地址與上述備份的地址進行比較,檢測上述緩沖區(qū)溢出的單元。
5.根據(jù)權(quán)利要求3或4所述的非法代碼執(zhí)行的防止方法,其特征在于具有當(dāng)篡改了上述返回地址時,把上述存儲器地址用所保存的上述返回地址改寫的控制單元。
6.根據(jù)權(quán)利要求1或2所述的非法代碼執(zhí)行的防止方法,其特征在于使保存上述返回地址的上述棧存儲區(qū)成為只讀的屬性,保護上述返回地址,當(dāng)在設(shè)定為只讀屬性的上述棧存儲區(qū)中進行寫入時,上述中央運算處理裝置輸出出錯信號進行上述檢測,具有當(dāng)接收到上述出錯的信號后,用于停止上述程序或者控制上述程序的流程的控制單元。
7.根據(jù)權(quán)利要求1~6中選擇出的任一項所述的非法代碼執(zhí)行的防止方法,其特征在于上述返回地址是當(dāng)執(zhí)行上述程序時調(diào)用的過程以及從上述過程調(diào)用的線程內(nèi)的大于等于一個的返回地址。
8.一種非法代碼執(zhí)行的防止用程序,該非法代碼執(zhí)行的防止用程序當(dāng)由中央運算處理裝置執(zhí)行保存在電子計算機的存儲媒體內(nèi)的程序時,使上述計算機動作,以便檢測保存在存儲器的棧存儲區(qū)中的返回地址由于執(zhí)行非法代碼而被改寫的存儲器的緩沖區(qū)溢出,防止發(fā)生上述緩沖區(qū)溢出,其特征在于包括當(dāng)從上述存儲媒體調(diào)用上述程序時,用于取得并分析上述程序中的轉(zhuǎn)移命令的分析步驟;用于抽取上述程序的過程或者線程的上述返回地址的抽取步驟;用于把在上述棧存儲區(qū)中保存上述返回地址的地址登錄到上述中央運算處理裝置的故障排除功能的故障排除地址中的登錄步驟;當(dāng)上述程序動作時,用于控制上述程序的流程的控制步驟;登錄上述返回地址和上述地址,用于進行備份的備份步驟,當(dāng)在執(zhí)行上述程序時篡改了上述返回地址時,通過上述故障排除功能,上述中央運算處理裝置輸出出錯信號,在上述程序的執(zhí)行中進行中斷,使上述程序的流程移動到上述控制步驟。
9.根據(jù)權(quán)利要求8所述的非法代碼執(zhí)行的防止用的程序,其特征在于當(dāng)改寫了上述返回地址時,上述控制步驟具有使上述程序停止的步驟。
10.根據(jù)權(quán)利要求8或9所述的非法代碼執(zhí)行的防止用程序,其特征在于當(dāng)改寫了上述返回地址時,上述控制步驟具有用備份了的上述返回地址改寫上述返回地址的步驟。
11.根據(jù)權(quán)利要求8或9所述的非法代碼執(zhí)行的防止用程序,其特征在于當(dāng)改寫了上述返回地址時,上述控制步驟具有保存上述改寫了的值的步驟。
12.根據(jù)權(quán)利要求8所述的非法代碼執(zhí)行的防止用程序,其特征在于包括用于使保存上述返回地址的上述棧存儲區(qū)成為只讀的屬性,保護上述返回地址的保護步驟;當(dāng)在設(shè)定為只讀屬性的上述幀存儲區(qū)中進行寫入時,上述中央運算處理裝置輸出出錯信號,用于進行上述檢測的檢測步驟;當(dāng)接收到上述出錯的信號后,用于使上述程序停止或者控制上述程序的流程的上述控制步驟。
13.根據(jù)從權(quán)利要求8~12中選擇出的任一項所述的非法代碼執(zhí)行的防止用程序,其特征在于上述程序是從在應(yīng)用軟件、操作系統(tǒng)的軟件模塊、核心模式軟件中使用的函數(shù)、子程序中所選擇出的大于等于一個的程序。
14.一種非法代碼執(zhí)行的防止用程序的記錄媒體,其特征在于記錄了從權(quán)利要求8~13中選擇出的任一項所述的非法代碼執(zhí)行的防止用程序。
全文摘要
本發(fā)明提供防止程序執(zhí)行時的由緩沖區(qū)溢出產(chǎn)生的返回地址的篡改和事前檢測緩沖區(qū)溢出的方法,當(dāng)改寫程序執(zhí)行時的返回地址時,利用中央運算處理裝置的故障清除功能,進行出錯輸出,根據(jù)出錯輸出,檢測返回地址篡改,重新用保存的值改寫被篡改了的返回地址進行恢復(fù),另外,當(dāng)檢測出返回地址篡改時,強制結(jié)束正在執(zhí)行的程序。
文檔編號G06F21/00GK1886728SQ200480028989
公開日2006年12月27日 申請日期2004年9月3日 優(yōu)先權(quán)日2003年9月4日
發(fā)明者小路幸市郎, 武藤佳恭, 野崎隆 申請人:科學(xué)園株式會社
網(wǎng)友詢問留言 已有0條留言
  • 還沒有人留言評論。精彩留言會獲得點贊!
1
汉川市| 两当县| 石林| 扎鲁特旗| 南乐县| 佛山市| 吉隆县| 达拉特旗| 雷山县| 鄂温| 黔西县| 定安县| 上高县| 印江| 旬阳县| 福鼎市| 鲁甸县| 芦山县| 图们市| 呈贡县| 昌吉市| 福鼎市| 南宫市| 布拖县| 丹棱县| 牟定县| 咸宁市| 洪江市| 杨浦区| 当雄县| 天峻县| 正蓝旗| 色达县| 临城县| 清丰县| 宿州市| 双江| 遂平县| 韶关市| 四子王旗| 甘孜|