摘要:探討了軟件逆向工程的基本原理,基于OnTrac平臺設計了一個針對 Python源代碼的逆向分析系統,并簡要介紹ReverseUML系統以及核心模塊。
關鍵詞:逆向工程;Python;UML;類圖;序列圖
中圖分類號:TP391文獻標識碼:A文章編號:1009-3044(2008)23-969-02
Design of Reverse Analysis System Based on OnTrac Platform
WANG Qi
(Software Department , Southeast University, Nanjing 210096, China)
Abstract: This essay has introduced the basic principle of software reverse engineering, and designed a Reverse UML system based on OnTrac system. Then we describe the system, and key modules.
Key words: reverse engineering; Python; UML; class diagram; sequence diagram
逆向工程本質上是一個知識恢復、知識發現的過程。對于軟件這種復雜系統來說,逆向工程首先是發現原有系統所表達的一些信息,其次是挖掘原有系統表面下隱藏的、存在于設計人員腦中的設計知識。而源代碼逆向工程分析的對象是代碼。代碼是軟件設計最后一個階段的產物,是唯一的逆向工程工作的輸入,也是所有逆向工程的基礎,因此源代碼逆向工程顯得格外重要[1]。因此如何對現有的源代碼進行分析,以及如何以清晰、標準的方式展現原有的設計知識,是本課題研究的主要問題。
為了達到方便分析 Python 源代碼的目的,本課題在 SIEMENS 公司的 OnTrac 平臺上設計了一套管理分析Python源代碼的系統ReverseUML。通過 ReverseUML 系統,用戶可以方便的獲得服務器上 Python 源代碼的類圖以及序列圖。
1 Reverse UML系統結構
為了實現上述功能,ReverseUML系統主要分為OnTrac服務器、ReverseUML 插件、代碼跟蹤服務器,程序跟蹤執行模塊。系統結構框圖如圖1所示:
ReverseUML 系統物理結構圖
用戶可以通過兼容 IE6.0 的瀏覽器登錄 OnTrac 服務器,然后通過 OnTrac 中的 ReverseUML 插件對源代碼進行管理分析。
ReverseUML系統的物理結構如圖2所示,用戶分析代碼的服務器,OnTrac服務器和Trace服務器是通過網絡連接起來,用戶可以在任何可以訪問OnTrac服務器的地方分析Python源代碼,這種結構也符合了目前軟件網絡服務化的趨勢。
2 ReverseUML插件分析設計
通過對 ReverseUML 系統的介紹,系統需要提供基于Web頁面的分析管理模塊,分析模塊還需要和跟蹤模塊交互通訊,來達到在網絡上分析源代碼的目的,而跟蹤模塊需要可以在受控制的情況下執行源代碼[2]。因此本插件設計的模塊圖以及和外圍模塊的通信,如圖3所示。
ReverseUML 插件依賴于 OnTrac 系統對用戶的請求進行預處理。OnTrac系統會把對ReverseUML的請求分配給ReverseUML插件,然后插件對請求進行相應的處理,并將處理的結果以頁面的形式返回給客戶端。
當插件在處理用戶動態跟蹤腳本的時候,插件首先會通過OnTrac的ResquestDispatch 得到腳本的文本,然后通過工程配置里的用戶名與密碼和服務器進行連接。隨后將命令腳本逐條發給TraceServer,并返回由TraceServer的SSH Server執行后的結果。
當插件被初始化的時候會在OnTrac服務器上開啟一個新的監聽服務,隨時監聽并添加從Trace Daemon發來的動態跟蹤數據記錄。
ReverseUML插件主要分為頁面顯示模塊、分析模塊、對Trace Server進行shell命令控制的PySSH模塊以及從Trace Server獲得消息的 PyListener模塊。
用戶獲得類圖的過程需要有兩個步驟,一個得到當前系統中存在什么類,二是選擇需要由哪些類組成類圖,因此插件需要處理用戶的兩次查詢,一次是點擊 ClassGraph 鏈接的頁面請求,查詢當前系統中的所有類名,第二次是選擇相應的類與類圖深度之后,點擊ViewClassGraph 的請求,獲得類圖圖形。處理的流程如圖4所示。
首先ReverseUML插件在初始化的時候會在OnTrac系統的Dispatch消息轉發器中注冊相應的頁面請求消息。當用戶進入ReverseUML工程頁面后所有的頁面上的鏈接被定向為由ReverseUML插件來處理。
當用戶點擊ClassGraph鏈接時,OnTrac的Dispatch將ClassGraph消息轉給已經注冊關聯上的處理函數。處理函數從數據庫里獲得當前存在的所有類,逐一填充到頁面模板上,最后由OnTrac的頁面Render解釋頁面模板生成標準的 HTML頁面,并發送回客戶的瀏覽器。處理用戶的 ViewClassGraph點擊事件的總體流程與ClassGraph類似,細節上有所不同,瀏覽器發送來的消息有用戶選擇類的列表、類圖的深度需要通過 OnTrac提供的標準API獲得,類圖生成模塊根據輸入進行計算生成類圖,類圖以 JPEG 的方式存在服務器臨時目錄中,最后將圖片的鏈接地址填充在類圖模板相應的位置里。
3 跟蹤執行模塊分析設計
跟蹤執行模塊的作用為了獲得實際跟蹤時的數據并將數據發送到OnTrac服務器。實際跟蹤時會有多個Python執行的進程同時向一臺OnTrac 服務器發送數據,如果采用簡單的連接發送的方式會因為網絡擁塞造成被跟蹤的程序等待網絡傳輸而執行非常緩慢,因此本課題采用了一個統一的數據收集轉發服務來對跟蹤數據進行有效的發送。
由于需要通過在程序執行時動態地獲取數據,因此需要對Python的解釋器進行擴展,讓Python解釋器在執行程序時將數據傳給Trace Daemon 模塊。下面將分別敘述這兩個模塊的設計。
3.1 Trace Daemon模塊設計
Trace Daemon 是在程序執行的時候運行在后臺的監控進程,用來將跟蹤數據發給OnTrac Server。Trace Daemon 的工作流程設計如圖5所示。
如圖5所示,Trace Daemon由Trace Server的shell啟動,并且傳入OnTrac Server的地址、和臨時存放數據所在目錄,程序啟動后每隔1秒從數據所在的目錄中讀取數據文件,判斷數據是否已經被填充完畢,或者記錄數據文件的線程已經結束,如果已經記錄完畢則發送給OnTrac Server,最后刪除已經發送完的數據文件。發送數據部分則由Twisted實現了一個簡單的傳輸協議。
用戶可以通過 ReverseUML 系統方便地察看源代碼以及它們的類圖和序列圖、建立分析工程來管理逆向工程的配置,添加被分析的代碼,設定目標代碼執行的環境。
3.2 代碼跟蹤腳本設置
本文提出的生成類圖與序列圖算法的核心是對動靜態分析數據的
綜合,為了獲得其中的動態數據,必須要通過一種方式讓程序運行起來。本課題的設計的方法是,通過在跟蹤服務器上運行事先編寫好的腳本,使被跟蹤的代碼運行起來,然后系統將服務器中跟蹤記錄下的數據發回。因此ReverseUML系統提供了編寫,管理這些腳本的功能模塊。
如果當用戶需要通過ReverseUML插件獲得類圖時,登錄OnTrac系統,進入ReverseUML插件,打開相關工程后單擊ClassGraph鏈接,系統會顯示當前系統中含有的類名列表。然后選擇若干需要顯示的類圖的類名稱、類圖的關系深度,最后點擊 View Class Graph按鈕,系統會返回所選擇的幾個類的類圖。
用戶可以通過ReverseUML系統獲得所需的序列圖。用戶進入相關工程后單擊SequenceGraph鏈接,系統會顯示當前系統中含有的函數入口列表。然后用戶選擇序列圖的一個入口,制定序列圖的嵌套層次以及涉及類的模塊數,系統會返回此入口在數據庫里的若干次調用。隨后用戶選擇其中某一次調用所在的時間戳,點擊View Sequence Graph鏈接,系統將返回相應的序列圖。
4 結束語
本課題首先介紹了逆向工程的一些基本原理,而逆向工程則是對遺留軟件工程進行知識恢復的一個很重要,也很可行的方法。而本課題在SIEMENS公司OnTrac系統的基礎上,設計開發了ReverseUML系統,通過該系統可以對Python語言設計的軟件進行逆向分析,可以通過UML類圖與序列圖清晰地展現面向對象軟件底層的設計思想。
參考文獻:
[1] Rumbaugh J. 面向對象建模與設[M].影印版.北京:中國電力出版社,2003.
[2] Hondt k.Aproach to Architectural Recovery in Evolving Object-Oriented Systems[D]. Brussel:Ph Dthesis of Vrije Universiteit Brussel,1998.