本發(fā)明涉及程序逆向執(zhí)行,尤其涉及一種結(jié)合全量型檢查點與增量型重做的目標程序逆向執(zhí)行實現(xiàn)方法。
背景技術(shù):
傳統(tǒng)的軟件調(diào)試方法已經(jīng)逐漸不能滿足用戶的需求了,基于模擬器的負載程序逆向執(zhí)行、調(diào)試越來越得到工程師與研究人員的關(guān)注。負載逆向執(zhí)行功能能夠幫助開發(fā)者調(diào)試程序,當開發(fā)者需要讓程序回退時,不必從頭開始執(zhí)行,而是可以讓程序從當前位置進行回退,從而減少了程序調(diào)試的時間。
傳統(tǒng)的軟件逆向執(zhí)行方法,通常是通過保存全量型檢查點的方法來保存系統(tǒng)狀態(tài),然后通過恢復到保存時間較早的檢查點將系統(tǒng)恢復到時間較早的狀態(tài),以達到程序回退的功能。但是由于一個全量型檢查點需要占用較大的磁盤空間,導致對全量型檢查點的個數(shù)有限,所以這種軟件回退的方法是一種粗粒度的回退。當對軟件回退的精度要求很高時,比如逆向單步,那么這種方法顯然就滿足不了要求。為了應(yīng)對這種場景,一種可行的方法是采取逆操作的方法,然而這種方法在代碼上不易實現(xiàn)、維護困難,給工程帶來了具大的挑戰(zhàn)。
技術(shù)實現(xiàn)要素:
本發(fā)明的目的是克服現(xiàn)有技術(shù)的不足,提供一種新的負載逆向執(zhí)行功能的實現(xiàn)。
本發(fā)明的目的是通過以下技術(shù)方案來實現(xiàn)的:一種結(jié)合全量型檢查點與增量型重做的目標程序逆向執(zhí)行功能實現(xiàn)方法,具體包括如下步驟:
(1)加載目標程序到模擬器。
(2)生成第一個全量型檢查點,全量型檢查點記錄的內(nèi)容包括cpu狀態(tài)、內(nèi)存狀態(tài)和系統(tǒng)時鐘,將第一個全量型檢查點記錄的內(nèi)容作為模擬器的初始狀態(tài)。
(3)開始執(zhí)行目標程序,每次向前迭代一個時鐘,且每隔一定的系統(tǒng)時鐘數(shù)生成一個全量型檢查點,保存相應(yīng)時刻的全量型檢查點,將這些全量型檢查點作為模擬器的對應(yīng)時刻的狀態(tài)。
(4)在執(zhí)行過程中,遇到斷點時目標程序暫停執(zhí)行,用戶可選擇逆向單步執(zhí)行,首先,下一次目標程序暫停時的時鐘數(shù)為當前時鐘數(shù)減一,其次,模擬器恢復到最近的一個已保存狀態(tài),即從最近生成的一個全量型檢查點中,恢復cpu狀態(tài)、內(nèi)存狀態(tài)和系統(tǒng)時鐘;然后,模擬器從恢復的狀態(tài)開始繼續(xù)正向執(zhí)行程序,并且判斷當前的系統(tǒng)時鐘數(shù)是否與下一次目標程序暫停的時鐘數(shù)一致,若一致則表示逆向單步執(zhí)行完畢,否則目標程序繼續(xù)正向執(zhí)行。
本發(fā)明的有益效果是,在正確實現(xiàn)功能的基礎(chǔ)上,使得檢查點記錄的量與系統(tǒng)恢復速度之間有一個較好的平衡,即在時間效率與空間效率上取得一個較好的平衡:
(1)定期保存全量型檢查點,可使模擬器迅速恢復到某個時刻的狀態(tài)。在正向執(zhí)行的過程中,模擬器每隔一定的時鐘數(shù)就記錄一個全量型檢查點,保存整個系統(tǒng)的狀態(tài),并將這些檢查點持久化到磁盤中,可供未來恢復系統(tǒng)狀時使用。兩個檢查點之間間隔的時鐘數(shù)越少,則整個系統(tǒng)記錄的檢查點個數(shù)就越多,在恢復系統(tǒng)狀態(tài)時,可供選擇的系統(tǒng)狀態(tài)就越多,但占用的磁盤空間也越大。所以,兩次檢查點之間間隔的時鐘數(shù)需要根據(jù)具體的系統(tǒng),在實踐中獲得。檢查點保存的內(nèi)容也需根據(jù)具體的系統(tǒng)來確定,但一些必不可少的要素有:內(nèi)存的狀態(tài),cpu的態(tài),全局變量的狀態(tài)等。其中內(nèi)存不必保存整個內(nèi)存空間的狀態(tài),只需要保存被使用過的內(nèi)存頁即可,cpu的狀主要包括一些通過寄存器和控制、狀態(tài)寄存器等。全局變量主要包括虛擬化系統(tǒng)在實現(xiàn)時用到的一些全局變量,比如延遲槽的狀態(tài),日志文件的當前讀寫位置等。
(2)通過增量型重做,可使模擬器迅速恢復到兩個檢查點之間任何一個時刻的狀態(tài)。全量型的檢查點只能讓模擬器恢復到某個時鐘的狀態(tài),比如第0個時鐘的狀態(tài),第n個時鐘的狀態(tài),第n*2個時鐘的狀態(tài),第n*3個時鐘的狀態(tài)等等,并不能讓我們隨意恢復到任意一個時鐘比如第n+9個時鐘時的狀態(tài)。通過增量型的重做技術(shù),就可以讓模擬器的狀態(tài)恢復到兩個檢查點之間的任意一個時鐘的狀態(tài)。比如系統(tǒng)處在第n個時鐘,要恢復到第n+9個時鐘的狀,只需要重新執(zhí)行一次n+1、n+2、n+2、n+4、n+5、n+6、n+7、n+8個時鐘時指令即可。
(3)結(jié)合全量型檢查點與增量型重做,可使模擬器迅速恢復到之前任何一個時鐘的狀態(tài),從而達到軟件逆向執(zhí)行的功能。無論當前模擬器處于任何一個時鐘,都可以迅速恢復到這之前的任何一個時鐘的狀,其方法是:選擇要恢復到的那個時鐘之前的一個離它最近的全量型檢查點,恢復該檢查點的系統(tǒng)狀態(tài),然后從該點開始正向執(zhí)行,直到系統(tǒng)時鐘數(shù)與我們要恢復的時鐘數(shù)相等為止。
附圖說明
圖1表示了逆向單步的方法流程圖;
圖2是整個模擬器中全量型檢查點示意圖;
圖3是兩個相鄰的全量型檢查點示意圖;
圖4是逆向單步功能的方法示意圖。
具體實施方式
下面結(jié)合附圖對本發(fā)明做進一步的說明。
如圖1所示,一種結(jié)合全量型檢查點與增量型重做的目標程序逆向執(zhí)行實現(xiàn)方法,具體包括如下步驟:
(1)加載目標程序,解析該目標文件,得到程序代碼段,以及程序的入口點。記錄下該入口點,其為程序運行的第一條指令。
(2)生成第一個全量型檢查點,全量型檢查點記錄的內(nèi)容包括cpu狀態(tài)、內(nèi)存狀態(tài)和系統(tǒng)時鐘,將全量型檢查點記錄的內(nèi)容作為模擬器的初始狀態(tài),初始狀態(tài)下cpu的pc寄存器為步驟(1)得到的程序入口點,其余寄存器清零,內(nèi)存清零,初始時鐘數(shù)清零。
(3)開始執(zhí)行目標程序,每次向前迭代一個時鐘,且每隔一定的系統(tǒng)時鐘數(shù),比如n個時鐘,生成一個全量型檢查點,保存相應(yīng)時刻的全量型檢查點,將這些全量型檢查點作為模擬器的對應(yīng)時刻的狀態(tài)。如圖2所示,模擬器將在第0個時鐘、第n個時鐘、第2*n個時鐘等處各生成一個全量型檢查點,保存相應(yīng)時刻的模擬器狀態(tài)。檢查點通過寫二進制文件將其持久化到磁盤中。由于整個內(nèi)存空間較大,而實際使用到的內(nèi)存只占很小的一部分,所以在保存內(nèi)存狀態(tài)時只需要保存被使用過的內(nèi)存頁即可,其余未使用到的內(nèi)存單元視其值為零。
(4)如圖3、4所示,目標程序在執(zhí)行過程中,在t時鐘處遇到斷點,此時目標程序暫停執(zhí)行,用戶可選擇逆向單步執(zhí)行,首先,下一次目標程序暫停時的時鐘數(shù)為當前時鐘數(shù)減一,即t-1,其次,模擬器恢復到最近的一個已保存狀態(tài),即從最近生成的一個全量型檢查點n中,恢復cpu狀態(tài)、內(nèi)存狀態(tài)和系統(tǒng)時鐘;然后,模擬器從恢復的狀態(tài)開始繼續(xù)正向執(zhí)行程序,并且判斷當前的系統(tǒng)時鐘數(shù)是否與下一次目標程序暫停的時鐘數(shù)t-1一致,若一致則表示逆向單步執(zhí)行完畢,否則目標程序繼續(xù)正向執(zhí)行。