高菁
(天津機電職業技術學院,天津 300350)
軟件逆向工程是軟件開發技術與方法的一大子課題,這一課題所強調的是通過密切結合可運行的程序,來歸納出集成化、系統化的開發模型及軟件支撐媒介的內部集成模式,從而在更高層次上來有效解決軟件面向的實際應用問題。
逆向工程涉及以下兩大操作步驟。第一步是對目標系統、標識系統的對象以及標識系統對象之間的關系進行分析。第二步是創建不同形式或者是抽象層次更高的系統。
國外學者Scott R.Tilley又對抽取和抽象進一步提煉,將其擴展成了建模、抽取與抽象這三大步驟。第一步建模具體指的是采用建模技術構成相關應用程序的領域模型。第二步抽取具體指的是借助于恰當的抽取機制,然后基于目標系統來對原始數據進行收集。第三步抽象指的是將具體的目標系統抽象化,同時輔助以系統的理解,并允許進行信息瀏覽、信息分析和得出抽象的結果并加以表示。
軟件逆向工程所遵循的基本原理具體如下:其將軟件系統中的關鍵內容抽取并提煉出來,同時對軟件系統中的細節加以隱藏,然后借助于所抽取出來的實體,將其關鍵內容在更高層級系統上描述出來。通常意義上,人們將軟件工程當作一種開發的新系統存在。事實上,軟件工程還可分為很多更細的項目,即軟件正向工程、軟件逆向工程、軟件系統重構、再工程以及軟件的設計恢復等。其中軟件正向工程指的是一種傳統意義上的過程,即基于軟件系統的高層抽象與邏輯層面獨立出來的,從實現設計到系統的物理設計過程。具體而言,就是基于用戶的實際需求到高層設計然后再回歸到底層設計,最終實現的過程。軟件逆向工程是通過對系統的分析來確定系統組件以及系統組件間的相互作用,然后借助于其他形式來表示這一系統,或者是在更高層次上來對系統過程進行闡釋和說明。需要額外注意的是,針對某一系統進行逆向工程時,系統本身不發生任何變化,也不會在這一系統上建立新的系統。軟件系統重構就是在保持系統的功能和語義不變的前提下,在統一的抽象層次上改變表現形式。再工程是一種在對軟件逆向工程、軟件系統重構以及軟件正向系統進行審查改造后重組的新形式。軟件的設計恢復具體指的是密切結合領域知識、目標系統以及外部信息而認定的更高一層次的抽象。上述幾大概念間的關系如圖1所示。

圖1
結合對逆向工程及軟件逆向工程的內涵的分析,就得出了軟件逆向工程的具體任務。主要涉及以下方面。其一,達成分析系統的任務。這項任務具體是指對系統結構以及系統的運行過程進行分析,但是,無論目標系統所面向的是哪一種應用領域,其分析系統大體上都是一致的,基本上都可分為系統的動態信息及系統的靜態信息。目標系統所面向的通常都是不同的應用領域,要想更好地達成抽象目標系統的具體任務,通常需要具備相關領域的知識和豐富的專家經驗。其二是達成抽象系統的任務。其三是達成展現系統的任務。展現系統的最佳實現方式是使展現系統可視化。通過實現這幾項任務來實現幫助用戶更好地理解系統這一目的。
(1)程序切片法。程序切片技術具體指的是將程序進一步簡化為同某一特殊計算具有相關性的語句技術。這一軟件逆向工程分析方法源于數據流分析法。程序切片技術法在實際使用的過程中通常將程序進行進一步分解,將其分解成更小的切片代碼段,進而使其關注點縮放到一個更小范圍內,而不需要關注整個程序。某一程序切片是由程序中的判定表達式和部分語句組成的集合。這些判定表達式和語句甚至會給程序中的某一位置,如常用的行號標識上所界定或使用的變量值產生相應的影響。程序切片技術能夠幫助我們更深入地理解程序。
(2)詞法分析和語法分析。這一軟件逆向工程分析法主要是針對程序源代碼進行分析,進而得到程序信息的多種類型的有用表示。其中,使用頻率最高的是交叉引用列表。借助于對語法的分析能夠得到分析樹和抽象語法樹AST這兩大類型的表示方法。其中,抽象語法樹AST涉及很多同程序實際內容相關的細節,其能夠為理解更加復雜的程序奠定基礎。
(3)動態分析法。動態分析法大多是在程序實際運行的過程中進行的,這一方法最基本的操作是植入程序。具體來說,植入程序其實是在某一全局范圍之內對源代碼進行更改或者添加一些額外操作的具體過程。動態分析法所采取的基本原理是依托代碼的結構信息,同時按照固定的規則給原有的程序代碼添加軟件觸發器。
在實際運用軟件工程分析技術的過程中,程序理解是最重要且最消耗資源的活動,要想更好地理解程序,必須從程序設計這一方面著手進行。在實際操作過程中,要想更好地對某一軟件進行維護并不容易,經常會遇到缺失代碼的情況。下面假設缺乏某一軟件的源代碼,然后探討如何借助軟件逆向工程分析技術進行軟件維護。
第一步:結合對這一軟件的作用、性能以及性質設計這些因素,來設計出相應的驗證假設內容列表,然后結合相關內容一邊進行驗證,一邊更好地理解這一軟件,在理解軟件代碼期間一步步假設內容列表進行修正,進而深化對這一軟件系統程序的認知和理解。第二步:對軟件執行過程中的二進制碼進行分析可得知,這一二進制碼是由多個函數組成的,具體分析步驟如下。首先,借助于IDA反匯編工具來分析出函數集合,具體如下所示。
{(f1、f2、f3、f3、......fn)}
然后繪制函數調用圖,圖中的一個節點代表的是一個fj,節點間的連接線所代表的是函數的調用關系,fp是被調用函數,fq是調用函數,fp是fq的子函數,這一函數調用圖能夠較好地對整個軟件執行過程中的函數關系進行描述。其中一個節點代表的是一個函數,并且每一節點都可以用函數控制圖表示出來。
第三步:進一步細化函數,將其細化為基本塊來分析。同時還可借助于控制流圖來對二進制文件中的函數進行描述。每一函數又可被分解成若干個不同的基本塊。基本塊具體指的是程序遵照相應的順序執行的語句序列,其中,僅有一個入口和一個出口。第一個語句是入口,最后一個語句是出口。對一個基本塊本身來說,在具體執行時僅能從入口進入,從出口退出。基本塊具備的顯著特點具體如下:一旦基本塊中的第一條指令被執行之后,相應地,后續基本塊中的所有執行都會按照順序執行,且僅執行一次。控制流的結點也是由基本塊組成的,主要是用來表示運算、節點和節點間的有向邊代表控制流向。一個函數的控制流入口僅有一個,但是卻可以有很多出口。圖2是函數的控制流圖。

圖2 函數的控制流圖
通過分析該圖可知,這一函數包含五個基本塊,六條有向邊。如果想生成控制流圖和函數調用關系圖就應進行如下操作。第一步應對二進制代碼的反匯編進行深入分析,借助于IDE Pro SDK開發包有利于更好地對反匯編進行分析,依托所得出的分析結果得到信息建立的控制流圖和函數調用關系圖。接著,以這兩大流程圖為基礎進行相應的斷點跟蹤,之所以要設置斷點主要是為了在執行程序時對程序有更深入地理解。在設置斷點之后,程序到達了斷點將暫停程序。然后可將寄存器內的數據和執行路徑記錄下來,以方便更好地對斷點處的上下文環境和具體執行情況進行分析,借助于設計不同的斷點能夠使分析人員更好地明確程序的執行方式,并理解程序的結構,進而能夠更好地將之前的函數調用關系同程序的實際運用信息有機結合起來,這樣一來,就能清楚地把握整個程序的脈絡。通過對程序中的數據流信息和控制流程進行分析,能夠推導出數據并建立文檔。上述幾大步驟可密切配合起來并反復使用,這樣能更好地推導出整個軟件的脈絡,并建立其開發文檔。
綜上,在軟件維護中采用軟件逆向工程技術能節約軟件維護的資金和精力投入,程序員掌握這一技術不僅利于其更好地發揮軟件維護的實力,同時還能借助這一技術學習同行的先進的理念和技術。
[1]鄧銳,吳俊超,黃堅.逆向工程技術及其在模具設計制造中的應用初探[J].山東工業技術, 2017,(21):136-138.
[2]劉曉東.在軟件維護中逆向工程的應用探究[J].數字技術與應用,2015,(12):123-123.
[3]杜丹.逆向工程在軟件維護方面的應用研究[J].軟件導刊,2014,(5):47-48.
[4]杜華,余小東.逆向工程在軟件維護方面的應用研究[J].電子技術與軟件工程, 2015,(11):136-138.
[5]周小東.基于逆向工程技術與有限元分析的集成設計方法研究[D].廣東工業大學,2016,38-40.
[6]潘立業.快速逆向工程技術及其在產品開發中的應用分析[J].科技風, 2017,(9):103-104.