專利名稱:反編譯過程中的堆棧跟蹤方法、裝置及反編譯器的制作方法
技術(shù)領(lǐng)域:
本發(fā)明涉及反編譯技術(shù)領(lǐng)域,特別涉及一種反編譯過程中的堆棧跟蹤方法、一種 反編譯過程中的堆棧跟蹤裝置以及一種反編譯器。
背景技術(shù):
反編譯過程是軟件逆向工程中的一個重要組成部分,對于軟件的分析、理解有著 重要的作用,其讀入機器碼,產(chǎn)生與最初源代碼相似的高級語言代碼,該高級語言代碼在功 能上與最初的源代碼一致。執(zhí)行反編譯過程的反編譯器的典型架構(gòu)分為前端、中端和后端, 其中,前端是個依賴于機器的模塊,其讀取機器代碼,進行句法分析和語義分析,生成中間 代碼;中端讀取中間代碼,生成控制流程圖,進行數(shù)據(jù)流分析和控制流分析;后端生成高級 代碼。在上述反編譯過程的各步驟中,除了數(shù)據(jù)流分析之外,其余的各部分在理論和技 術(shù)上均已成熟,數(shù)據(jù)流分析過程是至今都尚未很好解決的難點,其進行的工作主要包括有 死寄存器和條件碼的清除、條件碼和寄存器的拷貝傳播、數(shù)據(jù)類型的識別和傳播、寄存器變 量的識別和清除。其中,寄存器變量可以分為全局變量、局部變量和參數(shù),其中局部變量、參 數(shù)與堆棧有著密切的聯(lián)系,因此,堆棧跟蹤成為進行數(shù)據(jù)流分析的必要條件。圖1是80*86系列的堆棧示意圖,如圖1所示,在80*86系列中,堆棧是一段RAM 區(qū)域,其中,棧底是地址較大的一端,棧頂是地址較小的一端,堆棧指針寄存器ESP始終指 向棧頂,在每個反編譯程序的運行期間,都與一個堆棧相關(guān)聯(lián)著,堆棧是參數(shù)、局部變量和 返回地址的集合。在程序運行期間,堆棧指針寄存器ESP隨時在發(fā)生變化,如何準確地識別 參數(shù)和局部變量成為了一個難題,從而制約了數(shù)據(jù)流分析階段的發(fā)展。
發(fā)明內(nèi)容
針對上述現(xiàn)有技術(shù)中存在的問題,本發(fā)明的目的在于提供一種反編譯過程中的堆 棧跟蹤方法、一種反編譯過程中的堆棧跟蹤裝置以及一種反編譯器,其可以準確地識別出 參數(shù)、局部變量,可以提供更多準確的信息給反編譯過程,進而提高最終反編譯結(jié)果的正確 性和可讀性。為達到上述目的,本發(fā)明采用以下技術(shù)方案一種反編譯過程中的堆棧跟蹤方法,包括步驟順序執(zhí)行指令,根據(jù)每條指令對堆棧指針寄存器ESP的值的影響,對預設(shè)整型變 量進行相應的加減操作,所述預設(shè)整型變量用以表示系統(tǒng)當前ESP寄存器的值與函數(shù)入口 處系統(tǒng)ESP寄存器的值之間的偏移量。一種反編譯過程中的堆棧跟蹤裝置,包括指令執(zhí)行單元,用于順序執(zhí)行指令;堆棧跟蹤單元,用于根據(jù)每條指令對堆棧指針寄存器ESP的值的影響,對預設(shè)整 型變量進行相應的加減操作,所述預設(shè)整型變量用以表示系統(tǒng)當前ESP寄存器的值與函數(shù)入口處系統(tǒng)ESP寄存器的值之間的偏移量。
一種反編譯器,包括如上所述的反編譯過程中的堆棧跟蹤裝置。根據(jù)本發(fā)明方案,其是通過預設(shè)整型變量來模擬堆棧寄存器ESP的行為,根據(jù)在 執(zhí)行指令時各指令對堆棧指針寄存器ESP的值的影響,來對該預設(shè)整型變量執(zhí)行相應的加 減操作,據(jù)此模擬CPU的壓棧入棧等堆棧操作行為,跟蹤所有與堆棧寄存器ESP相關(guān)的操 作,由于預設(shè)整型變量是用于表示系統(tǒng)當前ESP寄存器的值與函數(shù)入口處系統(tǒng)ESP寄存器 的值之間的偏移量,從而可以根據(jù)該預設(shè)整型變量來準確地識別函數(shù)執(zhí)行過程中的參數(shù)、 局部變量,可以給反編譯過程提供更多準確的信息,進而提高了最終反編譯結(jié)果的正確性 和可讀性。
圖1是80*86系列的堆棧示意圖;圖2是本發(fā)明的反編譯過程中的堆棧跟蹤方法實施例的流程示意圖;圖3是依據(jù)本發(fā)明方法的數(shù)組元素結(jié)構(gòu)示意圖;圖4是依據(jù)本發(fā)明方法的堆棧跟蹤示例的示意圖;圖5是本發(fā)明的反編譯過程中的堆棧跟蹤裝置實施例的結(jié)構(gòu)示意圖。
具體實施例方式本發(fā)明方案可以應用于各種語言類型的反編譯過程,在下述各具體實施例的說明 中,以應用于C反編譯器中的C反編譯過程進行說明。參見圖2所示,是本發(fā)明的反編譯過程中的堆棧跟蹤方法實施例的流程示意圖, 如圖所示,本發(fā)明方法包括步驟步驟SlOl 順序執(zhí)行指令,進入步驟S102 ;步驟S102 根據(jù)每條指令對堆棧指針寄存器ESP的值的影響,對預設(shè)整型變量進 行相應的加減操作,其中,這里的預設(shè)整型變量用以表示系統(tǒng)當前ESP寄存器的值與函數(shù) 入口處系統(tǒng)ESP寄存器的值之間的偏移量。根據(jù)本發(fā)明方案,其是通過預設(shè)整型變量來模擬堆棧寄存器ESP的行為,根據(jù)在 執(zhí)行指令時各指令對堆棧指針寄存器ESP的值的影響,來對該預設(shè)整型變量執(zhí)行相應的加 減操作,據(jù)此模擬CPU的壓棧入棧等堆棧操作行為,跟蹤所有與堆棧寄存器ESP相關(guān)的操 作,由于預設(shè)整型變量是用于表示系統(tǒng)當前ESP寄存器的值與函數(shù)入口處系統(tǒng)ESP寄存器 的值之間的偏移量,從而可以根據(jù)該預設(shè)整型變量來準確地識別函數(shù)執(zhí)行過程中的參數(shù)、 局部變量,可以給反編譯過程提供更多準確的信息,進而提高了最終反編譯結(jié)果的正確性 和可讀性。依據(jù)本發(fā)明方案,其主要包括有兩部分其一、采用預設(shè)整型變量來模擬堆棧寄 存器ESP的行為,預設(shè)整型變量的值為系統(tǒng)當前ESP寄存器與在函數(shù)入口處系統(tǒng)ESP寄存 器的值之間的偏移量,在具體應用時,可將該預設(shè)整型變量設(shè)定為int VirtualESP ;其二、 使用自定義數(shù)組結(jié)構(gòu)來保存入棧的數(shù)據(jù)、入棧時VirtualESP的值和其他輔助信息,并使用 VirtualESP的值作為索引,即自定義數(shù)組中的每個元素包含的信息包括有數(shù)據(jù)入棧時的 VirtualESP值、入棧的數(shù)據(jù)、以及其他輔助信息,依據(jù)本發(fā)明方案的數(shù)組元素結(jié)構(gòu)體的示意圖如圖3所示。根據(jù)上述預設(shè)整型變量VirtualESP,可以用來模擬堆棧變化,其可以模擬的堆棧變化的操作可包括有入棧操作、出棧操作、立即數(shù)賦值操作、以及備份恢復操作。其中,這里的立即數(shù)賦值操作,所能夠模擬的實際堆棧的影響和變化包括有用立 即數(shù)對ESP進行賦值操作,使用指令對ESP進行間接操作。而這里的備份恢復操作,具體可以包括有在遇到跳轉(zhuǎn)指令時備份當前的 VirtualESP值,在最后一條指令地址小于跳轉(zhuǎn)地址的返回指令處,恢復VirtualESP值。通過上述自定義數(shù)組結(jié)構(gòu),可以據(jù)此實現(xiàn)的作用可以包括有保存每次被壓入 堆棧的數(shù)據(jù)到數(shù)組內(nèi)對應的某一元素結(jié)構(gòu)體中,并保存當時VirtualESP的值到該結(jié)構(gòu) 體中,以該VirtualESP的值作為索引數(shù)據(jù);在每次出棧操作時,以數(shù)組元素結(jié)構(gòu)體內(nèi)的 VirtualESP的值作為索引,在自定義數(shù)組中找到對應的某一數(shù)組元素結(jié)構(gòu)體,讀取該結(jié)構(gòu) 體內(nèi)存儲的入棧數(shù)據(jù)的內(nèi)容,將該內(nèi)容賦值給pop指令的操作數(shù)。根據(jù)上述本發(fā)明的方法,以下就其中的一個具體實施例中的具體操作過程進行詳 細闡述。在初始狀態(tài)下,輸入的示例函數(shù)代碼可如圖4所示。從圖4中可以發(fā)現(xiàn),該函數(shù)中 含有多條ret返回指令和函數(shù)調(diào)用語句(call語句),這使得對于如何正確跟蹤堆棧狀態(tài)造 成了困難。在函數(shù)運行階段,堆棧指針寄存器ESP隨時在發(fā)生變化,這使得如何準確地識別 參數(shù)和局部變量成為了一個難題,因此,本發(fā)明方案應當能夠處理這個難題。如圖4所示,整型變量int VirtualESP被用來模擬堆棧寄存器ESP的行為, VirtualESP的值為系統(tǒng)當前ESP寄存器的值與在函數(shù)入口處系統(tǒng)ESP寄存器的值(esp_ func)之間的偏移量,在進入函數(shù)前,VirtualESP的值初始化為0x00。隨后可進入詳細的堆棧跟蹤過程,堆棧跟蹤過程具體為順序執(zhí)行各指令,根據(jù)每 條指令是否會影響堆棧指針寄存器ESP的值,即對堆棧指針寄存器ESP的值的影響,對整型 變量VirtualESP進行不同的加減操作,來跟蹤實際堆棧指針寄存器ESP的的值,即跟蹤堆 棧的變化。在進行具體的堆棧跟蹤過程中,具體可以包括有當運行到push指令時,將該push指令壓棧的數(shù)據(jù)保存到數(shù)組結(jié)構(gòu)中的一個空數(shù) 組元素結(jié)構(gòu)體內(nèi),如圖3所示,同時,將該push指令執(zhí)行前的VirtualESP的值也保存到該 元素結(jié)構(gòu)體中,該變量的值將在未來搜索數(shù)組元素時作為匹配元素,即索引;當運行到pop指令時,將該pop指令執(zhí)行后的堆棧寄存器ESP的值作為索引值,對 數(shù)組結(jié)構(gòu)進行檢索查詢,查詢到含有數(shù)值與該pop指令執(zhí)行后的堆棧寄存器ESP的值相匹 配的VirtualESP變量的數(shù)組元素結(jié)構(gòu)體,取出獲得該數(shù)組元素結(jié)構(gòu)體的入棧元素,并將該 入棧元素賦值給pop指令的操作數(shù),隨后可以清空該數(shù)組元素結(jié)構(gòu)體內(nèi)的所有數(shù)據(jù),使之 為空;當運行到系統(tǒng)調(diào)用指令時,根據(jù)調(diào)用約定(如stdcall),對VirtualESP進行相應 的加減操作,如圖4中的指令07所示;當運行到跳轉(zhuǎn)指令時,保存該跳轉(zhuǎn)指令執(zhí)行時堆棧寄存器ESP的值以及該跳轉(zhuǎn) 指令需跳轉(zhuǎn)到的地址值,并在最后一條指令地址小于跳轉(zhuǎn)地址的ret返回指令處恢復 VirtualESP值,然后繼續(xù)執(zhí)行后續(xù)指令并跟蹤堆棧,如圖4中的指令10、13所示。
持續(xù)執(zhí)行上述堆棧跟蹤過程,直到函數(shù)運行到一條指令地址大于所有跳轉(zhuǎn)地址的 返回指令時,該條ret返回指令必是函數(shù)的最后一個出口,堆棧跟蹤結(jié)束。
經(jīng)過實際測試,上述本發(fā)明的堆棧跟蹤方法,通過嚴密的跟蹤堆棧,識別了函數(shù)過 程中所有的參數(shù)和局部變量,并明確了指令操作的是哪個參數(shù)或者哪個局部變量,可以正 確地識別參數(shù)、局部變量以及依靠堆棧來進行的賦值操作,為反編譯過程提供了更多準確 的信息,進而提高了最終反編譯結(jié)果的正確性和可讀性。根據(jù)上述本發(fā)明的堆棧跟蹤方法,本發(fā)明還提供一種反編譯過程中的堆棧跟蹤裝 置,如圖5所示,是該裝置實施例的結(jié)構(gòu)示意圖,其包括有指令執(zhí)行單元201,用于順序執(zhí)行指令;堆棧跟蹤單元202,用于根據(jù)每條指令對堆棧指針寄存器ESP的值的影響,對預設(shè) 整型變量進行相應的加減操作,所述預設(shè)整型變量用以表示系統(tǒng)當前ESP寄存器的值與函 數(shù)入口處系統(tǒng)ESP寄存器的值之間的偏移量。本發(fā)明的堆棧跟蹤裝置的具體的堆棧跟蹤方法可如上述本發(fā)明的堆棧跟蹤方法 所述,在此不予贅述。根據(jù)上述本發(fā)明的堆棧跟蹤裝置,本發(fā)明還提供一種反編譯器,該反編譯器包括 如上所述的本發(fā)明的堆棧跟蹤裝置,在此不予贅述。以上所述的本發(fā)明實施方式,僅僅是對本發(fā)明方案的其中一個具體實施例的說 明,并不構(gòu)成對本發(fā)明保護范圍的限定。任何在本發(fā)明的精神和原則之內(nèi)所作的修改、等同 替換和改進等,均應包含在本發(fā)明的權(quán)利要求保護范圍之內(nèi)。
權(quán)利要求
一種反編譯過程中的堆棧跟蹤方法,其特征在于,包括步驟順序執(zhí)行指令,根據(jù)每條指令對堆棧指針寄存器ESP的值的影響,對預設(shè)整型變量進行相應的加減操作,所述預設(shè)整型變量用以表示系統(tǒng)當前ESP寄存器的值與函數(shù)入口處系統(tǒng)ESP寄存器的值之間的偏移量。
2.根據(jù)權(quán)利要求1所述的反編譯過程中的堆棧跟蹤方法,其特征在于,所述根據(jù)每條 指令對堆棧指針寄存器ESP的值的影響、對預設(shè)整型變量進行相應的加減操作具體包括當運行到push指令時,將該push指令壓棧的數(shù)據(jù)保存到預定數(shù)組結(jié)構(gòu)中的一個空數(shù) 組元素結(jié)構(gòu)體內(nèi),并將該push指令執(zhí)行前的預設(shè)整形變量的值保存到該元素結(jié)構(gòu)體中,以 該預設(shè)整形變量的值作為該數(shù)組元素的索引;當運行到pop指令時,將該pop指令執(zhí)行后的堆棧寄存器ESP的值作為索引值,對所 述預定數(shù)組結(jié)構(gòu)進行檢索查詢,查詢到預設(shè)整形變量值與該pop指令執(zhí)行后的堆棧寄存器 ESP的值相匹配的數(shù)組元素結(jié)構(gòu)體,獲得該數(shù)組元素結(jié)構(gòu)體的入棧元素并賦值給所述pop 指令的操作數(shù);當運行到系統(tǒng)調(diào)用指令時,根據(jù)調(diào)用約定,對預設(shè)整形變量進行相應的加減操作;當運行到跳轉(zhuǎn)指令時,保存該跳轉(zhuǎn)指令執(zhí)行時堆棧寄存器ESP的值以及該跳轉(zhuǎn)指令 需跳轉(zhuǎn)到的地址值,并在最后一條指令地址小于跳轉(zhuǎn)地址的返回指令處恢復預設(shè)整形變量 值,然后繼續(xù)執(zhí)行后續(xù)指令。
3.根據(jù)權(quán)利要求2所述的反編譯過程中的堆棧跟蹤方法,其特征在于,在所述獲得該 數(shù)組元素結(jié)構(gòu)體的入棧元素并賦值給所述pop指令的操作數(shù)后,還包括步驟清空該數(shù)組 元素結(jié)構(gòu)體內(nèi)的所有數(shù)據(jù)。
4.根據(jù)權(quán)利要求1至3任意一項所述的反編譯過程中的堆棧跟蹤方法,其特征在于,還 包括步驟當運行到一條指令地址大于所有跳轉(zhuǎn)地址的返回指令時,結(jié)束堆棧跟蹤操作。
5.根據(jù)權(quán)利要求1至3任意一項所述的反編譯過程中的堆棧跟蹤方法,其特征在于 所述反編譯過程為C反編譯器中的C反編譯過程
6.一種反編譯過程中的堆棧跟蹤裝置,其特征在于,包括指令執(zhí)行單元,用于順序執(zhí)行指令;堆棧跟蹤單元,用于根據(jù)每條指令對堆棧指針寄存器ESP的值的影響,對預設(shè)整型變 量進行相應的加減操作,所述預設(shè)整型變量用以表示系統(tǒng)當前ESP寄存器的值與函數(shù)入口 處系統(tǒng)ESP寄存器的值之間的偏移量。
7.根據(jù)權(quán)利要求6所述的反編譯過程中的堆棧跟蹤裝置,其特征在于,所述堆棧跟蹤 單元根據(jù)每條指令對堆棧指針寄存器ESP的值的影響、對預設(shè)整型變量進行相應的加減操 作具體包括在遇到push指令時,將push指令壓棧的數(shù)據(jù)保存到預定數(shù)組結(jié)構(gòu)中的一個空數(shù)組元 素結(jié)構(gòu)體內(nèi),并將該push指令執(zhí)行前的預設(shè)整形變量保存到該元素結(jié)構(gòu)體中,以該預設(shè)整 形變量作為該數(shù)組元素的索引;在遇到pop指令時,將該pop指令執(zhí)行后的堆棧寄存器ESP的值作為索引值,對所述預 定數(shù)組結(jié)構(gòu)進行檢索,查詢到預設(shè)整形變量與該pop指令執(zhí)行后的堆棧寄存器ESP的值相 匹配的數(shù)組元素結(jié)構(gòu)體,獲得該數(shù)組元素結(jié)構(gòu)體的入棧元素并賦值給所述pop指令的操作 數(shù);在遇到系統(tǒng)調(diào)用指令時,根據(jù)調(diào)用約定,對預設(shè)整形變量進行相應的加減操作; 在遇到跳轉(zhuǎn)指令時,保存該跳轉(zhuǎn)指令執(zhí)行時堆棧寄存器ESP的值以及該跳轉(zhuǎn)指令需跳 轉(zhuǎn)到的地址值,并在最后一條指令地址小于跳轉(zhuǎn)地址的返回指令處恢復預設(shè)整形變量值, 然后繼續(xù)執(zhí)行后續(xù)指令。
8.根據(jù)權(quán)利要求7所述的反編譯過程中的堆棧跟蹤裝置,其特征在于,所述堆棧跟蹤 單元在所述獲得該數(shù)組元素結(jié)構(gòu)體的入棧元素并賦值給所述pop指令的操作數(shù)后,還用于 清空該數(shù)組元素結(jié)構(gòu)體內(nèi)的所有數(shù)據(jù)。
9.根據(jù)權(quán)利要求6至8任意一項所述的反編譯過程中的堆棧跟蹤裝置,其特征在于 所述堆棧跟蹤單元,還用于在運行到一條指令地址大于所有跳轉(zhuǎn)地址的返回指令時,結(jié)束堆棧跟蹤操作; 和/或所述反編譯器為C反編譯器。
10.一種反編譯器,其特征在于,其包括如上述權(quán)利要求6至9任意一項所述的反編譯 過程中的堆棧跟蹤裝置。
全文摘要
一種反編譯過程中的堆棧跟蹤方法、裝置及反編譯器,該方法包括步驟順序執(zhí)行指令,根據(jù)每條指令對堆棧指針寄存器ESP的值的影響,對預設(shè)整型變量進行相應的加減操作,所述預設(shè)整型變量用以表示系統(tǒng)當前ESP寄存器的值與函數(shù)入口處系統(tǒng)ESP寄存器的值之間的偏移量。本發(fā)明方案通過預設(shè)整型變量來模擬堆棧寄存器ESP的行為,根據(jù)在執(zhí)行指令時各指令對堆棧指針寄存器ESP的值的影響,來對該預設(shè)整型變量執(zhí)行相應的加減操作,據(jù)此模擬CPU的壓棧入棧等堆棧操作行為,從而可以根據(jù)該預設(shè)整型變量來準確地識別函數(shù)執(zhí)行過程中的參數(shù)、局部變量,可以給反編譯過程提供更多準確的信息,進而提高了最終反編譯結(jié)果的正確性和可讀性。
文檔編號G06F9/45GK101976187SQ201010545429
公開日2011年2月16日 申請日期2010年11月16日 優(yōu)先權(quán)日2010年11月16日
發(fā)明者林毓雙, 陳耿標 申請人:廣州迪慶電子科技有限公司