軟體運行時執行恢復與重放方法
2023-06-23 08:16:41 1
專利名稱:軟體運行時執行恢復與重放方法
技術領域:
本發明涉及二進位程序運行時執行恢復與重放方法。本發明用於對二進位程序的執行分 析與容錯。
技術背景軟體容錯系統一般採用冗餘來滿足系統高可靠性的要求,冗餘可以劃分為時間冗餘和空 間冗餘兩類。時間冗餘是指出現故障時通過將控制回巻到一個無錯的執行點,通過採用同種 方法或不同方法再試的手段得到正確結果;空間冗餘通常指由多個相同組件並行執行,通過 將各自執行結果比較或者表決的方法來檢測錯誤或者得到正確結果。空間冗餘代價大,成本 高,主要應用於特殊領域。時間冗餘不僅開銷小,而且行之有效。時間冗餘方法中最常用的 是進程檢查點(Checkpointing)方法。進程檢査點機制是在進程正常運行時周期性的設置檢查點,把進程在運行時的正確狀態 保存到穩定存儲器中。如果在隨後運行過程中發生故障,那麼將進程進行巻回恢復,從穩定 存儲器中讀出前一個檢査點時的正確狀態,從該點繼續執行。這樣就避免了由於故障而導致的程序從頭重新執行,因而有效的減少了計算損失,設置檢查點的時刻稱之為檢查點時刻; 保存進程狀態的文件稱之為檢查點文件。通過設置檢查點能夠保存和恢復程序的運行狀態, 因此它在許多領域都有重要的應用。進程檢査點可以分別在作業系統級、用戶級或者應用程式級實現,但各自有其優缺點。 作業系統級進程檢查點對用戶程序透明,容易得到進程的內核數據結構,但需要修改系統內 核,因此對於基於封閉作業系統的進程檢査點難以實現,並且其可配置性和移植性不高,檢 査點開銷很大。用戶級的進程檢査點,將檢查點功能編譯為一個動態連結庫連結到應用程式, 可以實現對應用程式透明,易於配置且開銷較小,.但其率現機制與作業系統平臺密切相關, 無法實現在不同系統平臺之間移植。應用程式級的進程檢查點,優點是能夠實現平臺無關, 可在不同的作業系統間移植;缺點是只限於幾種有限的程式語言,目前僅有基於JAVA虛擬機 的應用程式級檢査點。由於用戶級的進程檢査點具有對應用程式透明,易於配置、開銷較小 且實用等特點,因此大部分檢查點系統都選擇在用戶級實現。隨著PC機使用範圍的不斷擴大,Windows系統己經成為一個日益流行的桌面平臺,尤其 是在中低端市場。與此同時,基於Windows作業系統的機群系統也開始出現。由於Windows 作業系統在集群系統中的運用,隨故障負載和隸屬關係的影響,彼時不再可用,即具有變化 特性。因此,迫切需要一種能有效運行於Windows作業系統環境上,並支持高效快速執行恢復 與重放的方法。該方法應具有較小的運行開銷,能支持各類系統內核資源的恢復,重現系統 的運行狀態,為軟體容錯提供可靠而全面的分析信息和執行平臺。 發明內容有鑑於此,本發明的目的是提供一種基於檢測點設置的執行恢復方法,它將結合對用戶 地址空間、系統內核資源的保存和恢復來實現對二進位程序進程狀態的任意恢復和重放。為了達到上述目的,本發明提供了一種軟體運行時執行恢復與重放方法,其特徵在於 該系統包括了下述組成部件-代碼注入部件檢測點設置部件和執行恢復部件都是以動態連結庫(DLL)的方式存在的, 它們的功能獨立於目標二進位程序。為了能將檢測點設置與恢復的功能增加到目標二進位程 序,必須通過代碼注入方式將動態連結庫的代碼遠程注入到目標二進位程序中,並按代碼的指令執行相應的功能。代碼注入部件利用CreateRemoteThread函數,能夠容易的在另一個進 程中創建線程。利用在目標進程中新創建的線程調用LoadLibrary函數來加載想要插入的 DLL。該方法的基本操作步驟使用VirtualAllocEx函數,在目標進程的地址空間中分配內 存;使用WriteProcessMemory函數,將DLL的路徑拷貝到第一步中分配的內存中;使用 GetProcAddress函數,獲取在Kernel32. dll中的LoadLibraryA或LoadLibraryW函數的實 際地址;使用CreateRemoteThread函數,在目標進程中創建一個線程,它調用正確的 LoadLibmry函數,為它傳遞第一步中分配的內存地址。函數攔截部件作業系統內核對象的狀態是進程狀態重要的一部分。微軟Windows系統 將內核對象的數據結構保存在內核空間中,而內核空間不能由用戶線程直接訪問,如果需對 內核對象進行訪問和操作,必須通過系統提供的應用程式接口(API)調用。因此保存系統內核 對象狀態的一個可行的方法是截獲對內核對象進行訪問和操作的API。從截獲的API中可以 獲知操作內核對象的API調用、參數、返回值等,將他們都保存到檢査點文件中。當程序出 現故障進行恢復時,將重新執行保存的有關API調用,創建及操作內核對象來恢復其狀態。 函數攔截^5件包含對系統進程、文件、註冊表、網絡等API函數的攔截。檢測點設置部件進程狀態由其用戶地址空間的狀態和內核對象的狀態組成。因此檢測 點設置部件分為用戶地址空間狀態的保存,內核對象狀態的保存兩部分。檢測點設置部件首 先利用SuspendThread函數將目標二進位程序的所有應用線程掛起;獲取並保存用戶地址空 間布局以及區域或塊對應的文件名;保存地址空間中可讀寫塊並已提交的數據;保存用戶線 程的上下文及線程局部存儲;保存用戶線程有關內核對象的API跟蹤記錄;保存活動文件的 信息;檢査點線程對所有應用線程分別調用ResumeThread函數恢復其執行,然後進入等待狀 態直到下一次檢査點。執行恢復部件執行恢復部件利用檢測點設置部件記錄的進程用戶地址空間信息,以及 函數攔截^M牛記錄的內核對象操作信息,將目標二進位程序重新設置為對應檢測點位置的狀 態。執行恢復部件一致恢復進程用戶地址空間狀態;以掛起方式創建除主線程之外的其它線 程,恢復所有應用線程的棧內容,線程的上下文,線程局部存儲等。對線程局部存儲恢復的 策略為當線程創建並開始執行時,通過TlsSetValue實現對應線程局部存儲的恢復;根據保 存的API系統調用創建其他內核對象,並通過重新執行API恢復內核對象狀態;對於活動文件 信息,重新打開這些文件並設置指針的位置;檢査點線程對所有應用程式線程分別調用 ResumeThread函數恢復其執行。然後進入等待狀態直到下一次檢査點時刻。為了達到上述目的,本發明還提供了一種軟體運行時執行恢復與重放方法,其特徵在於 該方法包括了下述操作步驟-步驟(l),系統啟動目標二進位程序;步驟(2),代碼注入部件將檢測點設置部件和執行恢復部件注入到目標二進位程序的進程 空間;步驟(3),函數攔截部件監控記錄進程、文件、註冊表、網絡等內核對象的行為; 步驟(4),檢測點設置部件在程序運行過程中安裝檢測點; 步驟(5),得到恢復命令後;步驟(6),執行恢復部件將目標程序的運行狀態恢復到對應檢測點位置的狀態。總之,本發明系統與方法的優點簡述如下結合系統內核,能更好的監控並記錄各類資源的訪問情況,同時能提供高效的運行環境,減少了執行恢復系統的運行開銷,具有良好的實用性。
圖1是本發明軟體運行時執行恢復與重放方法的流程圖。圖2是本發明軟體運行時執行恢復與重放方法的總體結構框圖。
具體實施方式
為使本發明的目的、技術方案和優點更加清楚,下面結合附圖對本發明作進一步的詳細 描述。系統啟動目標二進位程序後,代碼注入部件將檢測點設置部件和執行恢復部件注入到目標二進位程序的進程空間;函數攔截部件監控記錄進程、文件、註冊表、網絡等內核對象行 為;檢測點設置部件在程序運行過程中安裝檢測點;當得到恢復命令後,執行恢復部件將目
標二進位程序的運行狀態恢復到對應檢測點位置的狀態。圖2為軟體運行時執行恢復與重放方法的總體結構框圖。下面將結合附圖2,具體介紹本發明的各個主要部件-用戶地址空間Windows中,每個進程都被賦予自己的虛擬地址空間。Windows給32位進程分配一個4GB 的虛擬地址空間。進程中的線程運行時可以訪問屬於該進程的地址空間,屬於其他進程的地 址空間則是不能被訪問。4GB的虛擬地址空間,地址範圍是0x00000000-OxFFFFFFFF。其中0x80000000-0xFFFFFFFF近2G為作業系統使用空間,稱之為內核空間。該分區存放 作業系統代碼。用於線程調度、內存管理、文件系統支持、網絡支持和所有設備驅動程序的 代碼全部加載在這個分區。進程內核對象的數據結構也存放在該分區。駐留在該分區中的一 切均可被所有進程共享。但在Windows中,這個分區是受系統保護的,用戶線程不能對其進 行直接讀寫訪問。0x00010000-0x7FFFFFFF近2G為進程私有地址空間,稱之為用戶地址空間。 該分區是進程的私有地址空間。 一個進程不能讀取、寫入或者以任何方式訪問另一個進程中 駐留在該分區中的數據。Windows中該分區加載所有可執行模塊或DLL模塊,^映射該進程 可以訪問的所有內存映射文件。屬於本進程的用戶線程可以對其進行直接的讀寫訪問。 用戶地址空間恢復Windows進程用戶地址空間包括數據段、堆、各線程堆棧以及代碼段。為了恢復地址空 間的便利,系統將用戶地址空間的布局,以及可寫並已提交的塊中數據一併保存到檢查點文 件中,這包括各區域和塊的起始地址、保護屬性、存儲屬性、狀態、類型,對於映像區域和 映射區敏還包括它們映射的文件名。保存用戶地址空間狀態時,循環使用函數VirtualQuery 遍歷地址空間。該函數每次返回一個指向MEMORY—BASIC—INFORMATION結構的指針。該結構記 錄了對應區域或塊中的起始地址,大小,存儲屬性,保護屬性和狀態等信息。根據區域或塊 的存儲屬性和狀態可以判別出文件映像區域、映射區域、私有內存區域,這些對應了數據段, 但無法區分出棧區域,堆區域。區分堆區域的方法由函數GetProcessHeaps得到該進程中所有堆的起始位置。遍歷時, 堆起始所在的區域即為堆區域。線程棧所在的區域是由棧區域中的塊擁有的特殊保護屬性標 識的,棧頂的塊擁有獨特GUARD保護屬性,由此可以區分棧區域。也可通過獲取線程上下文 中ESP的^k址,該地址所在的區域即為棧區域。保存地址空間布局後,將可寫並已提交塊的數據進行保存。條件是存儲屬性為 MEM—Private或MEM—Image或MEM—Map,且保護屬性包含有READWRITE的塊。這些塊包括了執 行文件中可改寫的數據段、棧、和堆,但不包括代碼段,因為代碼段映射到地址空間的保護
屬性為只讀。保存棧區域時,獲取該堆棧的ESP,保存從棧底到ESP地址之間的數據,以盡 量減少保存的數據。進程恢復時,用戶地址空間的恢復分為兩步。第一步進行地址空間布局的恢復;第二步 進行地址空間數據的恢復。恢復時重新啟動進程,檢查點線程獲取初始用戶地址空間布局, 並與保存的布局相比較。從低地址空間向高地址空間逐一比較並恢復各區域。在當前地址空 間中釋放保存布局中不存在的區域,並重新創建程序在執行過程中動態分配的數據區域。動 態分配的數據區域具有分配地址不確定性問題,如何使動態數據區域恢復到指定位置是一致 方法中要解決的關鍵問題。調用VirtualAlloc分配數據區域時,可以指定區域起始地址和大 小,容易做到在原對應位置分配新區域。而恢復在程序執行過程中創建的堆區域和棧區域情 況不同,因為利用系統調用創建這兩種區域時,不能指定區域的分配地址。作業系統對於沒 有指定分配位置的系統調用實施這樣的分配原則。低地址空間優先分配,在地址空間中從低 向高查找空閒區域,如果找到能滿足系統調用中要求大小的空閒區域就將其分配。根據作業系統分配原則,恢復地址空間時,從低地址空間向高地址空間逐步恢復。當恢 復到堆區域時,為使新分配^l堆區域與保存對應區域位置一致,在調用HeapCreate恢復堆區 域之前,將低於該地址的空閒區域暫時分配,以保證在低地址空間中沒有合適區域可分配給 堆空間,這樣就保證了作業系統在原對應位置創建了新的堆區域。直到將整個內存布局調整 為與保存布局一致時再將臨時分配的區域釋放。棧區域是系統創建新線程時進行分配的。棧 空間的恢復是通過恢復線程內核對象而恢復的。棧區域的分配位置也有不確定性,因此採用 與恢復堆類似的方法,從低向高恢復地址空間,當恢復到棧的位置時,創建線程內核對象, 使得分配棧的位置與原棧一致。當地址空間布局完全恢復後,再將可讀寫塊中的數據恢復。 進程內核對象系統要創建和操作若干類型的內核對象,如線程對象、文件對象、文件映射對象、進程 對象、互斥對象、管道對象等。內核對象是內核分配的一個內存塊,存放在內核空間中並只 能由內核訪問。該內存塊是一種數據結構,它的成員負責維護該內核對象的各種信息。由於內核對象的數據結構只能被內核訪問,因此應用程式無法在內存中找到這些數據結 構並直接修改它們。Windows提供了一組系統調用對內核對象進行操作和訪問。當調用創建 內核對象的API函數時,該函數返回一個用於標識該對象的句柄;操作和訪問某內核對象時, 用標識該對象的句柄執行相應的系統調用。 進程內核對象恢復
將跟蹤的與內核對象狀態有關的API調用保存到檢查點文件中。恢復時,根據檢查點文件, 重新執行與內核對象有關的系統調用,把內核對象的狀態調整為與保存時一致。進程正常運行時,函數攔截部件截獲應用程式與內核對象相關的系統調用,將調用參數 和執行線程記錄起來,做檢查點時將記錄的信息保存到檢查點文件中。恢復時,由於重新啟 動進程,系統中可能不存在檢査點時刻的內核對象,因此必須重新創建它們。用保存的參數 重新執行系統調用,創建內核對象,由於系統狀態可能與上次執行該系統調用時不一致,引 起系統調用的返回值也可能與原來不一致,這種現象稱為創建內核對象的不確定性問題。這個問題可能對進程的恢復有以下影響。由於用戶地址空間狀態與內核對象狀態存在數 據藕合,恢復後的進程仍然用原句柄調用內核對象,由於對應原句柄的內核對象可能不存在, 進程將恢復出錯。採用虛擬句柄替換真實句柄的方法解決上述問題。創建內核對象時,通過攔截系統調用, 將系統API返回的真實句柄替換為虛擬句柄提交進程。進程利用虛擬句柄操作內核對象時, 攔截函數將用真實句柄替換虛擬句柄進行系統API調用。做檢査點時,將兩者的對應關係保 存在檢査點文件中。進程恢復時,重新創建內核對象,函數攔截部件攔截的函數用同樣的虛 擬句柄替換真實句柄返回給應用程式。這樣應用程式看到的同一內核對象句柄都是"相同" 的句柄。恢復內核對象時,根據記錄的API調用跟蹤信息,重新執行影響內核對象狀態的系 統調用,使內核對象恢復到檢査點時狀態。
權利要求
1、軟體運行時執行恢復與重放方法,其特徵在於包括如下組成部件代碼注入部件檢測點設置部件和執行恢復部件都是以動態連結庫(DLL)的方式存在的,它們的功能獨立於目標二進位程序。為了能將檢測點設置與恢復的功能增加到目標二進位程序,必須通過代碼注入方式將動態連結庫的代碼遠程注入到目標二進位程序中,並按代碼的指令執行相應的功能。函數攔截部件作業系統內核對象的狀態是進程狀態重要的一部分。微軟Windows系統將內核對象的數據結構保存在內核空間中,而內核空間不能由用戶線程直接訪問,如果需對內核對象進行訪問和操作,必須通過系統提供的應用程式接口(API)調用。因此保存系統內核對象狀態的一個可行的方法是截獲對內核對象進行訪問和操作的API。從截獲的API中可以獲知操作內核對象的API調用、參數、返回值等,將他們都保存到檢查點文件中。當程序出現故障進行恢復時,將重新執行保存的有關API調用,創建及操作內核對象來恢復其狀態。函數攔截部件包含對系統進程、文件、註冊表、網絡等API函數的攔截。檢測點設置部件進程狀態由其用戶地址空間的狀態和內核對象的狀態組成。因此檢測點設置部件分為用戶地址空間狀態的保存,內核對象狀態的保存兩部分。執行恢復部件執行恢復部件利用檢測點設置部件記錄的進程用戶地址空間信息,以及函數攔截部件記錄的內核對象操作信息,將目標二進位程序重新設置為對應檢測點位置的狀態。
2、 根據權利要求1所述的軟體運行時執行恢復與重放方法,其特徵在於代碼注入部件利用CreateRemoteThread函數,能夠容易的在另一個進程中創建線程。利用在目標進程中新 創建的線程調用LoadLibrary函數來加載想要插入的DLL。該方法的基本操作步驟使用 VirtualAllocEx函數,在目標進程的地址空間中分配內存;使用WriteProcessMemory函數, 將DLL的路徑拷貝到第一步中分配的內存中;使用GetProcAddress函數,獲取在Kerne132. dll 中的LoadLibraryA或LoadLibraryW函數的實際地址;使用CreateRemoteThread函數,在目 標進程中創建一個線程,它調用正確的LoadLibrair函數,為它傳遞第一步中分配的內存地 址。
3、 根據權利要求l所述的軟體運行時執行恢復與重放方法,其特徵在於檢測點設置部 件首先利用SuspendThread函數將目標二進位程序的所有應用線程掛起;獲取並保存用戶地址 空間布局以及區域或塊對應的文件名;保存地址空間中可讀寫塊並已提交的數據;保存用戶 線程的上下文及線程局部存儲;保存用戶線程有關內核對象的API跟蹤記錄;保存活動文件的 信息;檢査點線程對所有應用線程分別調用ResumeThread函數恢復其執行,然後進入等待狀 態直到下一次檢査點。
4、 根據權利要求l所述的軟體運行時執行恢復與重放方法,其特徵在於執行恢復部件 一致恢復進程用戶地址空間狀態;以掛起方式創建除主線程之外的其它線程,恢復所有應用 線程的棧內容,線程的上下文,線程局部存儲等。對線程局部存儲恢復的策略為當線程創 建並開始執行時,通過TlsSetValue實現對應線程局部存儲的恢復;根據保存的API系統調用 創建其他內核對象,並通過重新執行API恢復內核對象狀態;對於活動文件信息,重新打開這 些文件並設置指針的位置檢查點線程對所有應用程式線程分別調用ResumeThread函數恢復 其執行。然後進入等待狀態直到下一次檢查點時刻。
5、 根據權利要求1所述的軟體運行時執行恢復與重放方法,其特徵在於-步驟(l),系統啟動目標二進位程序;步驟(2),代碼注入部件將檢測點設置部件和執行恢復部件注入到目標二進位程序的進程 空間;步驟(3),函數攔截部件監控記錄進程、文件、註冊表、網絡等內核對象的行為; 步驟(4),檢測點設置部件在程序運行過程中安裝檢測點; 步驟(5),得到恢復命令後;步驟(6),執行恢復部件將目標二進位程序的運行狀態恢復到對應檢測點位置的狀態。
全文摘要
本發明涉及計算機二進位程序運行時的執行恢復與重放方法。該系統由代碼注入部件、函數攔截部件、檢測點設置部件和執行恢復部件組成。該方法是系統啟動目標二進位程序,由代碼注入部件將檢測點設置部件和執行恢復部件注入到目標二進位程序的進程空間,通過函數攔截部件監控記錄進程、文件、註冊表、網絡等內核對象的行為,並由檢測點設置部件在程序運行過程中安裝檢測點,得到恢復命令後,執行恢復部件將目標二進位程序的運行狀態恢復到對應檢測點位置的狀態。本發明適用於對未知二進位程序的分析與容錯,提高分析人員的效率,支持對軟體運行時錯誤的分析和修復。
文檔編號G06F11/36GK101154185SQ20071004985
公開日2008年4月2日 申請日期2007年8月27日 優先權日2007年8月27日
發明者躍 曹, 李曉冬, 李毅超, 曉 梁, 武 肖 申請人:電子科技大學