• 
    

    
    

      99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看

      ?

      基于逆向工程的擴展OpenC++靜態(tài)分析方法研究

      2010-10-17 08:42:12湯發(fā)俊
      關(guān)鍵詞:編譯器逆向靜態(tài)

      湯發(fā)俊

      (無錫商業(yè)職業(yè)技術(shù)學(xué)院,江蘇 無錫 214063)

      基于逆向工程的擴展OpenC++靜態(tài)分析方法研究

      湯發(fā)俊

      (無錫商業(yè)職業(yè)技術(shù)學(xué)院,江蘇 無錫 214063)

      文章提出了一種基于逆向工程項目的擴展OpenC++靜態(tài)分析方法。探討了抽取靜態(tài)信息的OpenC++擴展策略,容錯解析技術(shù)和嵌套定義類、結(jié)構(gòu)體的識別與處理等方面的問題,介紹了采用 XML文件進行靜態(tài)信息的存儲方法。

      逆向工程;開放編譯器;靜態(tài)分析

      一、引言

      靜態(tài)信息是生成靜態(tài)模型和獲取動態(tài)信息的依據(jù),從某種程度上看是進行逆向工程的基礎(chǔ),在逆向工程中占據(jù)著非常重要的地位。靜態(tài)信息主要是通過對目標(biāo)系統(tǒng)源碼直接進行靜態(tài)分析來提取的,實現(xiàn)方法主要有兩種:

      1.直接進行詞法和語法分析。通過詞法分析可以得到程序信息的多種有用表示,通過語法分析可以得到兩類表示:分析樹 (parse tree)和抽象語法樹 AST(abstract syntax tree)。其中,分析樹只是指導(dǎo)分析過程,是比較原始的結(jié)果。分析樹顯示了程序語句的分解過程,包含和程序的實際含義無關(guān)的信息。去除分析樹的無關(guān)信息后得到AST,AST只包含和程序?qū)嶋H內(nèi)容相關(guān)的細節(jié),是更復(fù)雜的程序分析工具的基礎(chǔ)。

      2.基于開放編譯器進行分析。借助于開放編譯器提供的便利,使用相應(yīng)的接口獲取靜態(tài)信息。這種方法的優(yōu)點在于:由于開放編譯器通過元對象協(xié)議 (MOP)把編譯過程對用戶開放,用戶可以通過元對象協(xié)議提供的接口,有選擇性的獲取所需的靜態(tài)信息,而不必在如何進行語法分析、如何構(gòu)造語法樹這樣的細節(jié)上花費太多的精力。但這種方案所能獲取的靜態(tài)信息量要小于前一方案。雖然元對象協(xié)議向用戶提供了可干預(yù)編譯過程的接口,但它同時也限制了用戶對底層的分析樹或語法樹可執(zhí)行的操作范圍。另外,一個元對象協(xié)議所提供接口的完備與否也會影程序員響對底層分析樹或語法樹的操縱力度。

      在本逆向工程項目中,靜態(tài)分析的職能主要有以下幾點:一是獲取生成靜態(tài)模型 (如類圖)所需信息;二是輔助確定軟件觸發(fā)器的植入位置,為動態(tài)信息的獲取提供支持;三是為部分模型 (如狀態(tài)圖、類圖等)的高層抽象提供支持。為此本文主要闡述基于逆向工程的擴展 OpenC++靜態(tài)分析方法。

      一、抽取靜態(tài)信息的OpenC++擴展策略

      OpenC++提供了靜態(tài)分析支持,但是通過MOP接口獲取靜態(tài)信息有諸多的限制,獲取的信息不全面,而且 OpenC++沒有提供保存信息的MOP。為了抽取和保存比較全面的信息,需要對OpenC++進行一些擴展。

      OpenC++在對源代碼進行分析之后會生成分析樹,從分析樹可以獲取全面的靜態(tài)信息,所以對 OpenC++的擴展主要是在分析樹 Translate過程中添加獲取和保存靜態(tài)信息的功能。主要實現(xiàn)方法是:為 OpenC++的 Class類中添加三個新的成員方 法 SaveStaticInfo () 、SaveStaticInfoO fMethod () 、SaveStaticInfoOfAttribute()。其中 SaveStaticInfo()方法用于獲取和保存目標(biāo)系統(tǒng)源代碼中的靜態(tài)信息,它在 Class::TranslateClass()中被調(diào)用。TranslateClass()主要負責(zé)類定義的轉(zhuǎn)換,面向?qū)ο蟪绦蛑械拿總€類都會通過調(diào)用它進行轉(zhuǎn)換。在 SaveStaticInfo()中會調(diào)用 SaveStaticInfoO fMethod ()、SaveStaticInfoOfAttribute()獲取類的成員方法和數(shù)據(jù)成員,然后通過調(diào)用 CXMLParser類操縱 XML解析器完成靜態(tài)信息的永久保存。

      圖 1示的是抽取靜態(tài)信息的 OpenC++分析流程,其中的虛線框中為擴展的功能。

      獲取函數(shù)返回值的類型。OpenC++提供了 TypeInfo元對象,用于表示類型。利用 TypeInfo元對象構(gòu)造一個變量定義表達式,然后刪除表達式中的變量名,就可以得到準確的類型。

      類型識別方法。OpenC++的 Parser類成員方法 rClassSpec (…)會在解析過程中能夠識別當(dāng)前分析的是結(jié)構(gòu)、聯(lián)合、類或模板,通過在這里設(shè)一個全局 int類型變量保存當(dāng)前解析的類型,用于后續(xù)的靜態(tài)分析。

      圖1 抽取靜態(tài)信息的OpenC++分析流程

      二、容錯解析技術(shù)

      OpenC++是按標(biāo)準編譯器進行詞法分析和語法分析,所以對于含有完整的類、函數(shù)、變量、宏等定義的目標(biāo)程序, OpenC++可以準確的完成處理和分析,但如果缺少部分定義,那么在解析過程中可能會出現(xiàn)丟失信息,或?qū)е滦畔㈠e誤,或異常退出等情況。

      為了減少干擾性信息、避免海量信息的產(chǎn)生,會在預(yù)處理時隔離一些系統(tǒng)類、系統(tǒng)函數(shù)、系統(tǒng)變量、系統(tǒng)宏等的定義頭文件,OpenC++在解析這類程序時將會出現(xiàn)語法錯誤,其默認處理方法是當(dāng)錯誤達到預(yù)定義數(shù)量時中斷退出,未達到這一數(shù)量時會記住本次出錯位置,然后繼續(xù)分析,在分析完后退出整個編譯過程,不進行后續(xù)處理,分析的最終結(jié)果是失敗。這種處理策略對于編譯器而言是合理的,但對于程序靜態(tài)分析工具而言則并不合理,其根本的原因在于,編譯器解析程序的前提是不知目標(biāo)系統(tǒng)的語法是否正確,在解析的過程中才進行檢查,而靜態(tài)分析工具則假定分析的目標(biāo)系統(tǒng)在語法上是正確的。

      目前國際上有幾種解決解析過程中出現(xiàn)無法識別信息或語法錯誤等情況的技術(shù),如Fuzzy Parsing[1],Island Grammars[2],Skeleton Grammars,Error Recovery等。圖 2顯示了上述幾種技術(shù)對程序源碼的解析深度。

      圖2 幾種技術(shù)對程序源碼的解析深度

      通過對上述相關(guān)技術(shù)的研究,針對程序靜態(tài)分析的需要,本文提出了兩種可行的實現(xiàn)方法:一是當(dāng)遇到無法識別的元素時,跳出解析的程序段,將這個程序段的信息忽略,例如對于函數(shù)而言,如果函數(shù)中含有無法識別的信息時,直接跳到函數(shù)定義結(jié)束符“}”處;二是當(dāng)遇到解析錯誤時忽略出錯語句,從后續(xù)語句繼續(xù)解析,對于C++而言是指跳到“;”處繼續(xù)解析。這兩種方法各有利弊,第一種方法在遇到無法識別的代碼時會將相關(guān)信息整段丟失,會損失較多的信息;第二種方法丟失信息較前一種少,但它提高了解析的復(fù)雜度。在本文提出的靜態(tài)解析方法中,根據(jù)獲取信息的粒度,結(jié)合使用了上述兩種方法。

      三、嵌套定義類、結(jié)構(gòu)體的識別與處理

      前文提到,類型信息是在 OpenC++的 Parser::rClassSpec ()方法獲取,并保存到一個全局變量中,在 SaveStaticInfo()保存靜態(tài)信息時,將其一并保存,以備后續(xù)靜態(tài)模型抽象和軟件觸發(fā)器植入之用。這種處理方法存在一些不足。出現(xiàn)這種問題的原因可以從 OpenC++分析的過程看出:OpenC++在解析代碼時首先用 Parse類的 rProgram()方法讀取一個代碼段,然后對代碼段進行分析,并在分析過程中生成分析樹。如果在代碼段的分析過程中遇到內(nèi)部定義的類、結(jié)構(gòu)體、聯(lián)合體等的定義時會將其做為一個子段進行分析,分析過程是一個深度優(yōu)先的過程。分析完此程序段后,OpenC++會對此段代碼生成的分析樹進行 Translate()操作。Translate()操作的調(diào)用是對樹的一個后序遍歷過程,也就是說,最后生成的類、結(jié)構(gòu)體或聯(lián)合體的子樹會首先進行 Translate。如果使用一個 int變量記錄類型,則只能記錄最后分析的一個定義體類型。那么可不可以使用一個 int數(shù)組進行記錄呢?其實也是不行的,因為記錄的類型和定義體無法對應(yīng)。圖 3展示了使用一個全局變量記錄類型的錯誤示例。

      圖3 使用一個全局變量記錄類型的錯誤

      結(jié)合前面的敘述,本文提出一種方法彌補了上述缺陷。該方法如下:

      (1)使用 STL的map進行類名、結(jié)構(gòu)名和其類型 ID的成對保存,定義如下:

      std::map<std::string,int>g_map;其中 string類型用于保存類名或結(jié)構(gòu)名,int類型用于保存 string對應(yīng)的類型 ID。

      (2)在 Parser類的 rClassSpec(…)成員方法中識別類型,當(dāng)遇到一個解析段時,保存 <類或結(jié)構(gòu)名,類型 ID>數(shù)據(jù)對。

      (3)在進行 TranslateClass()時通過查詢類名、結(jié)構(gòu)名獲取其對應(yīng)的類型 ID。

      (4)OpenC++分析完一個 C++源碼后清空 map,準備對下一個源碼進行分析。

      這種方法的好處是:類或結(jié)構(gòu)體的嵌套定義層數(shù)和數(shù)量沒有限制;可以準確、高效的進行類型保存和查詢。

      四、靜態(tài)信息的存儲

      本逆向工程項目的目標(biāo)系統(tǒng)以面向?qū)ο笙到y(tǒng)為主,獲取的靜態(tài)信息主要用于系統(tǒng)的靜態(tài)模型抽象,并為動態(tài)信息的獲取和過濾提供依據(jù)。這就決定了獲取的靜態(tài)信息主要以類為主,包括類、結(jié)構(gòu)、聯(lián)合、全局函數(shù)、系統(tǒng)API以及為獲取系統(tǒng)的動態(tài)信息提供支持的一些其它信息,例如函數(shù)的調(diào)用、類的實例化、對類成員的操作 (如成員方法的調(diào)用、成員變量的修改)等。對于類、結(jié)構(gòu)體、全局函數(shù)等靜態(tài)信息,主要用于靜態(tài)模型抽取,這類信息需要物理保存,以備后續(xù)模塊抽象之用。而系統(tǒng)API以及其它一些信息則主要用于軟件觸發(fā)器的植入定位,不做他用,所以這些信息只需在系統(tǒng)靜態(tài)分析和軟件觸發(fā)器植入時臨時存儲。

      圖4 靜態(tài)信息文件的XML Schema

      靜態(tài)信息的存儲需要滿足以下幾點:有利于信息的格式化;應(yīng)具有跨平臺性,因為本逆向工程項目的目標(biāo)系統(tǒng)基于W indows、Unix/Linux等多種平臺,這樣方便目標(biāo)系統(tǒng)的平臺間傳遞;具有快速可靠的信息提取技術(shù);能夠存儲大量的信息。

      從可靠性、效率和易用性等各方面考慮,本文采用 XML文件進行靜態(tài)信息的存儲。存儲方法是:為 OpenC++添加 XML解析器的操縱類 CXMLParser,通過操作 XML解析器將獲取的靜態(tài)信息進行組織并保存到 XML文件中。圖 4為本逆向工程項目設(shè)計的靜態(tài)信息文件的 XML Schema。

      五、結(jié)束語

      靜態(tài)分析是獲取目標(biāo)系統(tǒng)的結(jié)構(gòu)信息、調(diào)用流信息和數(shù)據(jù)流信息的主要手段,是逆向工程中靜態(tài)模型生成的主要支持技術(shù)。靜態(tài)分析可以通過編寫詞法分析和語法分析程序完成,也可利用開放編譯器輔助完成。本文闡述了利用擴展后的OpenC++進行程序的靜態(tài)分析,并將獲取的靜態(tài)信息存入靜態(tài)信息 XML文件。這種處理方法不但提高了靜態(tài)分析模塊的開發(fā)速度,同時又方便了后續(xù)動態(tài)信息的收集。

      [1]Rainer Koppler.A systematic approach to fuzzy parsing.Practice and Experience,Vol.27,No.6,pp.637-649,1997.

      [2]Steven Klusener,Ralf Lammel.Deriving tolerant grammars from a base-line grammar.ICS M 2003:pp 179.

      Studies of an Extended OpenC++Static Analysis Methods in Reverse Engineering

      TANG Fa-jun
      (Wuxi Institute of Commerce,Wuxi 214063,Jiangsu)

      This paper presents an extended OpenC++static analysis methods in reverse engineering.Presents the extraction of static information OpenC++expansion strategy,in fault-tolerant parsing technology and nested definitions of classes,the structure of recognition and treatment and other aspects of the handling skills,describes the use of XML files for static information storage method.

      reverse engineering;open compilers;static analysis

      TB2

      A

      1671-5004(2010)06-0011-02

      2010-12-11

      湯發(fā)俊 (1977-),男,江蘇建湖人,碩士,無錫商業(yè)職業(yè)技術(shù)學(xué)院講師,主要研究方向:計算機應(yīng)用、電子商務(wù)。

      猜你喜歡
      編譯器逆向靜態(tài)
      逆向而行
      靜態(tài)隨機存儲器在軌自檢算法
      基于相異編譯器的安全計算機平臺交叉編譯環(huán)境設(shè)計
      逆向解答
      機床靜態(tài)及動態(tài)分析
      機電信息(2015年9期)2015-02-27 15:55:56
      具7μA靜態(tài)電流的2A、70V SEPIC/升壓型DC/DC轉(zhuǎn)換器
      通用NC代碼編譯器的設(shè)計與實現(xiàn)
      逆向工程技術(shù)及應(yīng)用
      50t轉(zhuǎn)爐靜態(tài)控制模型開發(fā)及生產(chǎn)實踐
      上海金屬(2013年6期)2013-12-20 07:57:59
      編譯器無關(guān)性編碼在微控制器中的優(yōu)勢
      溧水县| 习水县| 桂东县| 吉水县| 绍兴县| 铜陵市| 绥滨县| 隆尧县| 宜章县| 三都| 万宁市| 潮安县| 玉环县| 博白县| 中宁县| 苍梧县| 应城市| 乐平市| 南川市| 错那县| 南康市| 兰州市| 沾益县| 宁德市| 德令哈市| 枝江市| 梅河口市| 宁南县| 行唐县| 兴仁县| 屯门区| 宁远县| 广宁县| 镇远县| 乐昌市| 临安市| 五常市| 尚志市| 子洲县| 合水县| 资源县|