邱元陽 劉宗凡 陳守家 劉樹明


在上期《亦正亦邪反編譯》中,我們主要討論了反編譯技術(shù),這僅僅是逆向工程的一種。在工程和技術(shù)領(lǐng)域,逆向工程的運用非常普遍,而且大部分都合理合法。
由于逆向工程是一種由結(jié)果來推導(dǎo)出實現(xiàn)方法和原始材料的過程,因而其技術(shù)難度可能更大,當(dāng)我們真正走進(jìn)逆向工程領(lǐng)域,才會發(fā)現(xiàn)它不可低估的技術(shù)含量。
在3D建模中就常用到逆向工程。一般的工業(yè)建模是根據(jù)模型參數(shù)來生產(chǎn)實物,而它的逆向工程可以把其他廠家的或者手工制作的實物還原為模型文件,汽車制造類的廠家不可避免地都要使用。因為很多時候,產(chǎn)品的模型不能憑空在電腦上設(shè)計出來,而是根據(jù)現(xiàn)有的實物經(jīng)過各種變形和實驗測試后確定下來的。要把這些經(jīng)過實踐檢驗認(rèn)為是最好的結(jié)構(gòu)形態(tài)批量生產(chǎn)出來,就需要根據(jù)實物來建立模型,這就需要逆向工程。
在機(jī)械制造領(lǐng)域,CAD、CAM、CAE等必不可少,經(jīng)常要根據(jù)現(xiàn)有物理部件來構(gòu)建3D模型。為此,有時還需要專門的逆向工程軟件來完成這些工作,如Imageware、Geomagic Studio、CopyCAD、RapidForm、UG等。通過結(jié)構(gòu)光源轉(zhuǎn)換、三維坐標(biāo)測量、X射線斷層成像、3D掃描等技術(shù),可以方便地對真實對象進(jìn)行尺寸測量,形成頂點信息,進(jìn)一步生成3D模型。
像雕塑、模具之類的物體,用3D掃描后很快就能批量生產(chǎn),這也給了山寨產(chǎn)品一個可以完美仿效的空間。設(shè)想一下,如果3D掃描和3D打印相結(jié)合,那結(jié)果就不敢想象了。
在電子行業(yè),PCB抄板與IC解密已經(jīng)非常流行。在已經(jīng)有電子產(chǎn)品實物和電路板實物的前提下,利用反向研發(fā)技術(shù)手段對電路板進(jìn)行逆向解析,可以將原有產(chǎn)品的PCB文件、BOM(物料清單)、原理圖等技術(shù)文件以及PCB絲印生產(chǎn)文件進(jìn)行還原,進(jìn)而完成PCD制板、元件焊接、電路調(diào)試,直至生成原電路板樣板,這就是“抄板”。而對于集成塊、智能卡以及單片機(jī),可以層層刮掉用電子顯微鏡拍照,甚至借助設(shè)備直接復(fù)制燒錄在其中的程序文件,或提取關(guān)鍵代碼,完成芯片解密。對于這類逆向工程,法律上的阻止已經(jīng)顯得力不從心。
從機(jī)械工程、電子線路,到美術(shù)雕塑、音樂制作,逆向工程都有用武之地。音樂行業(yè)的“扒帶”(根據(jù)音樂來扒出樂譜),就是一種逆向工程,但一般都是靠人工進(jìn)行,而且需要有敏銳的聽覺,對音樂修養(yǎng)和水平都有較高要求。
劉宗凡:走近逆向工程
逆向工程源于商業(yè)及軍事領(lǐng)域中的硬件分析。其主要目的是,在不能輕易獲得必要的生產(chǎn)信息下,直接從成品的分析,推導(dǎo)出產(chǎn)品的設(shè)計原理。即對一項目標(biāo)產(chǎn)品進(jìn)行逆向分析及研究,從而演繹并得出該產(chǎn)品的處理流程、組織結(jié)構(gòu)、功能性能規(guī)格等設(shè)計要素,以制作出功能相近,但又不完全一樣的產(chǎn)品。
系統(tǒng)工程是通過對事物的排列與組合,提高其整體效益。而逆向工程則是按照與系統(tǒng)組織的相反方向,將其由系統(tǒng)到要素、由大至小一件件地拆卸開,分析各要素、各部件的結(jié)構(gòu)原因、生成原理及成型過程中的成功思路,再結(jié)合自己的實際,對其進(jìn)行必要的調(diào)整和改進(jìn),進(jìn)而形成新的系統(tǒng)。如果說系統(tǒng)工程強(qiáng)調(diào)綜合就是創(chuàng)造,那么逆向工程追求分解也是創(chuàng)造,也可以說是一項對現(xiàn)有成熟技術(shù)進(jìn)行二次開發(fā)和深度加工的再創(chuàng)新工程。運用逆向工程破解難題,就是通過解剖麻雀,把復(fù)雜的結(jié)構(gòu)條理化、系統(tǒng)的工程清晰化,進(jìn)而收到尋根探源、破題求解、復(fù)制創(chuàng)造之效。
逆向工程從應(yīng)用范圍來看,可以分成硬件和軟件兩大部分。硬件的逆向工程主要在機(jī)械制造領(lǐng)域應(yīng)用廣泛,特別是在軍事上的應(yīng)用非常普遍。眾所周知的原因,各國的尖端武器都是絕密資料,通過逆向工程來分析、了解、仿制、改進(jìn),成為發(fā)展中國家趕上先進(jìn)國家的一個常用手段。美軍一架RQ-170隱形無人機(jī)被伊朗截獲,一些美高官憂心忡忡。據(jù)俄羅斯軍事工業(yè)綜合體網(wǎng)站報道,如果中國能夠接觸到伊朗手中的美制RQ-170隱形偵察機(jī),那么就很有可能會通過逆向工程學(xué)的方法獲取美國人的絕密技術(shù),找到對付方法并可能復(fù)制其關(guān)鍵技術(shù),甚至仿制成品。這一新聞事件的反復(fù)炒作,也使逆向工程這個物理學(xué)中的中性詞,一時熱門了起來。
一些國外媒體看到中國花樣翻新的“克隆”或者“山寨”技術(shù),將中國捧為“逆向工程大國”。但有關(guān)中國專家認(rèn)為,逆向工程并不像媒體說的那樣簡單,成本甚至比自己研制還大(但研發(fā)時間可能縮短),隱形飛機(jī)制造工程尤其復(fù)雜,當(dāng)殘片遭到一定程度的物理破壞后,想準(zhǔn)確判斷材料本身都很困難。即便是逆向仿制工作,也不是哪個國家想做就可以隨便做的。沒有自身的技術(shù)創(chuàng)新,沒有一支可靠有效的掌握高新技術(shù)的科研隊伍,即便是逆向仿制也是步履維艱。
在軟件領(lǐng)域,逆向工程也很普遍。例如,公司購買的軟件都是沒有原程序的,如果要在原有基礎(chǔ)上修改、改進(jìn)某些功能,就可以通過逆向工程來實現(xiàn)。軟件的逆向工程可分通過反編譯、反匯編和動態(tài)跟蹤等方法來實現(xiàn)。反編譯不是簡單地實現(xiàn)程序的還原,而且要倒推出設(shè)計思想、數(shù)據(jù)結(jié)構(gòu)、算法等,使得原始程序?qū)崿F(xiàn)可維護(hù)化。在匯編語言中,用助記符(Memoni)代替操作碼,用地址符號(Symbol)或標(biāo)號(Label)代替地址碼。這樣用符號代替機(jī)器語言的二進(jìn)制碼,就把機(jī)器語言變成了匯編語言??梢钥闯鰴C(jī)器語言和匯編語言是可以對應(yīng)起來的,所以反匯編是所有程序都可以實現(xiàn)的。當(dāng)然,匯編語言相對來說閱讀比較困難,要和現(xiàn)在流行的面向?qū)ο蟮某绦驅(qū)?yīng)起來更是非常困難,所以反匯編更加適合于小型的、核心的應(yīng)用。動態(tài)跟蹤技術(shù)最常用于協(xié)議逆向工程,特別適用于設(shè)備驅(qū)動程序的逆向工程。
邱元陽:再談反編譯
軟件的逆向工程最常見的還是反編譯。但反編譯需要有針對性,不可能把隨意的一個EXE文件反編譯成一個SWF或FLA文件,也不可能隨意把一個EXE文件反編譯成某種語言的源程序。當(dāng)然,任意可執(zhí)行文件的反匯編還是可能的。
要防止程序被反編譯,一個思路就是讓別人無法知道它是在什么環(huán)境下編譯的。除了使用不常見的編譯環(huán)境外,程序加殼也會增加反編譯的難度。
另外,有些開發(fā)環(huán)境下編譯的程序目前還沒有相應(yīng)的反編譯工具,如在Director、Authorware下生成的作品要反編譯就非常困難。
文本文檔有時也是要保護(hù)的對象,它們可能會被重新生成各種不同的格式,這也可以看作是一種編譯過程,最常見的是生成PDF格式。這樣,一方面保證了文本文檔不被篡改,另一方面也規(guī)范了文檔的顯示和閱讀方式。然而很多時候,我們還是需要將一些PDF文檔“反編譯”成DOC等原來的格式。
AnyBizSoft PDF Converter是一個專業(yè)的PDF轉(zhuǎn)換器,支持將PDF轉(zhuǎn)換為Word(doc/docx)、PowerPoint(ppt/pptx)、Excel(xls/xlsx)、HTML、TXT等格式,對中文字符的支持性良好,能夠保存原有PDF的頁面布局、圖片、超鏈接等信息,對于加密或密碼保護(hù)的PDF文件也能輕松轉(zhuǎn)換。很多用其他軟件無法轉(zhuǎn)換的PDF文件,用AnyBizSoft PDF Converter卻能搞定(如圖1)。
需要說明的是,有些掃描版的PDF文件,里面的文字其實是圖片格式的,轉(zhuǎn)換后仍然是圖片,無法直接轉(zhuǎn)換成文字。需要將它們也轉(zhuǎn)換成文字時,還需要借助OCR(光電字符識別)工具進(jìn)行,如漢化OCR、CAJView OCR版閱讀器等。
實際上,如果僅僅是要編輯PDF文件,可以使用PDF文件編輯器,如Foxit PDF Editor,就是一個真正的PDF文件編輯軟件,具有所見即所得的編輯功能,并能在PDF和Windows應(yīng)用程序間復(fù)制粘貼文本和圖像。
此外,Word的DOC文檔也逐漸被用來進(jìn)行文檔傳輸,近年來在政府部門下發(fā)紅頭文件的電子文檔時就常用到。只是這些Word文檔采用了IRM(信息權(quán)限管理)機(jī)制進(jìn)行保護(hù),其內(nèi)容是禁止復(fù)制和編輯的,甚至根本無法選中內(nèi)容。對于這些受到編輯權(quán)限保護(hù)的文檔,可以另存為.rtf文件,用寫字板打開,重新保存,再用Word打開,即可編輯修改。
劉樹明:程序逆向分析示例
這里以反編譯難度較大的C++程序為例,說明軟件逆向分析的方法和過程。
1.運行時界面分析
分析目標(biāo):分析和監(jiān)視軟件運行時產(chǎn)生的窗口類型?,F(xiàn)在的各種軟件很少全盤自己編寫相關(guān)代碼,或多或少都使用了一些第三方開源代碼,并且采用這些代碼的時候,很少對其中的封裝類進(jìn)行修改,所以監(jiān)測到相關(guān)界面的類名稱就顯得非常有意義了,因為我們查到它使用了哪些類后,就可以查找相關(guān)的開源代碼,輕松繞過反編譯軟件的難關(guān)。
這項工作可以使用VC自帶的工具spy++進(jìn)行。spy++還能監(jiān)測到軟件的控件句柄、消息傳遞等。我們借助它了解到這些信息后,可以另外寫程序向相關(guān)窗口發(fā)送消息,冒充用戶人工使用軟件,也就是通常我們常說的外掛。針對游戲軟件的外掛程序比較多見,利用外掛,我們可以實現(xiàn)自動玩游戲,如果再向游戲窗口發(fā)送SW_HIDE消息,則還可以隱藏游戲窗口,達(dá)到“后臺掛機(jī)”的目的?,F(xiàn)在網(wǎng)上流行的QQ聊天記錄導(dǎo)出軟件,就是直接向QQ發(fā)送相關(guān)消息,冒充用戶手工操作,在QQ登錄運行的情況下導(dǎo)出其個人的聊天記錄,繞過以前的破解QQ本地聊天記錄加密難題。
2.反匯編跟蹤調(diào)試
通過這個辦法可以了解到軟件的功能和運行流程,再另外編寫高級語言程序?qū)崿F(xiàn)相同功能。
以調(diào)試Google Chrome瀏覽器為例。先運行Chrome瀏覽器,再打開Visual studio C++,選擇“工具→附加到進(jìn)程”,界面如圖2所示。
選擇Chrome進(jìn)程,我們可以看到Chrome為每個窗口生成了一個進(jìn)程,如果打開了多個窗口,則有多個進(jìn)程,如果只打開一個窗口,就只有一個進(jìn)程,我們隨便選擇一個進(jìn)程即可。
附加上去后,可以看到它的反匯編代碼,可在匯編程序的任意位置設(shè)置斷點,程序運行到斷點處會自動激活VC++,進(jìn)程停在斷點處,這時可以按F10和F11進(jìn)行單步調(diào)試跟蹤它,并且可以根據(jù)調(diào)用堆棧來快速定位各個功能模塊,大體繪制出程序的功能模塊構(gòu)成圖,軟件界面如圖3所示。
3.相關(guān)動態(tài)鏈接庫分析
DLL Export Viewer是一個動態(tài)鏈接庫分析軟件,利用它可以查看到DLL文件里面的函數(shù)和接口名稱,美中不足的是還不能確定函數(shù)參數(shù)類型,但我們看到函數(shù)名稱后,基本上都能猜出它的功能,另外我們還可以配合上面介紹的反匯編調(diào)試方法來獲取一些信息。
4.黑盒分析
這一分析是指把軟件完全當(dāng)成一個黑盒,通過控制對軟件的輸入數(shù)據(jù)構(gòu)造,并對輸出數(shù)據(jù)進(jìn)行分析來了解它的算法。黑盒分析在某些情況下也是非常有用的,著名的第三方QQ軟件Lumaqq,就是清華大學(xué)計算機(jī)系的一個學(xué)生用騰訊官方QQ做黑盒分析后寫出來的QQ客戶端軟件,這個軟件在2008年以前不但具備QQ的所有功能,有些功能甚至做得比官方的更好,而且一直跟隨官方升級相關(guān)功能,并且將所有的源碼完全開放!
5.數(shù)據(jù)抓包分析
對于網(wǎng)絡(luò)軟件的逆向工程,數(shù)據(jù)抓包就顯得非常重要了。盡管軟件內(nèi)部結(jié)構(gòu)和邏輯對逆向工作者來說是不可見的,但是它始終是要通過網(wǎng)絡(luò)跟服務(wù)器端交換數(shù)據(jù),我們將這些數(shù)據(jù)攔截下來后進(jìn)行分析,可以了解到非常多的信息,包括它是采用什么網(wǎng)絡(luò)協(xié)議和服務(wù)器端進(jìn)行數(shù)據(jù)交換的?數(shù)據(jù)包是如何進(jìn)行封裝的?發(fā)送給服務(wù)器端的數(shù)據(jù)是否進(jìn)行過預(yù)處理?網(wǎng)絡(luò)接口的地址是什么?相關(guān)的參數(shù)名稱是什么?這些問題都可以通過攔截數(shù)據(jù)包得到答案。常見的網(wǎng)絡(luò)抓包軟件主要有MiniSniffer、WSockExpert等。
劉宗凡:展望逆向工程
逆向工程包括形式反求、工藝反求和材料反求等幾個方面。在機(jī)械領(lǐng)域的實際應(yīng)用中,主要包括以下幾個方面:①對已有零件的復(fù)制,再現(xiàn)原產(chǎn)品的設(shè)計意圖;②當(dāng)原始設(shè)計不可得時,用于對已有產(chǎn)品的改型或仿型設(shè)計;③在設(shè)備維修中對個別損壞或磨損零件的復(fù)制;④在美學(xué)設(shè)計特別重要的領(lǐng)域,通常采用真實比例的木制或泥塑模型來評估設(shè)計的美學(xué)效果,再通過逆向工程進(jìn)行設(shè)計;⑤當(dāng)設(shè)計需要實驗才能定型的工件模型時,通常采用逆向工程的方法。例如,在航天航空領(lǐng)域,為了滿足空氣動力學(xué)等要求,需要進(jìn)行風(fēng)洞實驗的產(chǎn)品模型;⑥數(shù)字化模型的檢測,如檢驗產(chǎn)品的變形分析、焊接質(zhì)量以及零件實物與CAD模型的比較等。
Imageware由美國EDS公司出品,是最著名的逆向工程軟件,正被廣泛應(yīng)用于汽車、航空、航天、消費家電、模具、計算機(jī)零部件等設(shè)計與制造領(lǐng)域。該軟件擁有廣大的用戶群,國外有BMW、Boeing、GM、Chrysler、Ford、raytheon、Toyota等著名國際大公司,國內(nèi)則有上海大眾、上海交大、上海DELPHI、成都飛機(jī)制造公司等大企業(yè)。作為UG NX中提供的逆向工程造型軟件,ImageWare具有強(qiáng)大的測量數(shù)據(jù)處理、曲面造型、誤差檢測功能,可以處理幾萬至幾百萬的點云數(shù)據(jù),根據(jù)這些點云數(shù)據(jù)構(gòu)造的A曲面(CLASS A)具有良好的品質(zhì)和曲面連續(xù)性。ImageWare的模型檢測功能可以方便、直觀地顯示所構(gòu)造的曲面模型與實際測量數(shù)據(jù)之間的誤差以及平面度、真圓度等幾何公差。
隨著科學(xué)技術(shù)的進(jìn)步和消費水平的不斷提高,其他許多行業(yè)也開始紛紛采用逆向工程軟件進(jìn)行產(chǎn)品設(shè)計。以微軟公司生產(chǎn)的鼠標(biāo)器為例,就其功能而言,只需要有三個按鍵就可以滿足使用需要,但是,怎樣才能讓鼠標(biāo)器的手感最好,而且經(jīng)過長時間使用也不易產(chǎn)生疲勞感卻是生產(chǎn)廠商需要認(rèn)真考慮的問題。因此,微軟公司首先根據(jù)人體工程學(xué)制作了幾個模型并交給使用者評估,然后根據(jù)評估意見對模型直接進(jìn)行修改,直至修改到大家都滿意為止,最后再將模型數(shù)據(jù)利用逆向工程軟件Imageware生成CAD數(shù)據(jù)。當(dāng)產(chǎn)品推向市場后,由于外觀新穎、曲線流暢,再加上手感也很好,符合人體工程學(xué)原理,因而迅速獲得用戶的廣泛認(rèn)可,產(chǎn)品的市場占有率大幅度上升。
從制造業(yè)到玩具市場,從航天航空到電子產(chǎn)品,從醫(yī)療器械到動畫制作,各行各業(yè)都已經(jīng)廣泛使用逆向工程技術(shù)為生產(chǎn)和實驗服務(wù)。隨著工廠現(xiàn)代化進(jìn)程的推進(jìn),數(shù)控機(jī)床已經(jīng)普遍使用,復(fù)雜模具和產(chǎn)品的制作變得輕而易舉,這里面同樣有著逆向工程的功勞??梢灶A(yù)見,在未來的工業(yè)生產(chǎn)和數(shù)字產(chǎn)品制作中,逆向工程將會在其中發(fā)揮更大的作用。
陳守家:反思逆向工程
要了解和學(xué)習(xí)一個軟件所包含的思想和原則,必須對軟件的源程序進(jìn)行分析;要獲得某軟件的各種參數(shù),開發(fā)出能與該軟件兼容的軟件也必須獲得軟件的源程序。然而,為了在市場競爭中取得優(yōu)勢,軟件的開發(fā)者一般不會將源程序公開。因此,對軟件進(jìn)行逆向分析就成了軟件開發(fā)技術(shù)人員經(jīng)常采用的方法。
微軟最新的.net Framework由于采用了中間層,實現(xiàn)了跨平臺、跨語言的中間代碼,并在類似虛擬機(jī)的環(huán)境中運行,導(dǎo)致了MSIL(微軟中間語言)反編譯為C#或VB.net等源代碼并非難事。再以Zend Encoder編譯的PHP源程序為例,用Vulcan Logic Disassembler也可以得到PHP執(zhí)行時的操作碼,若是有對PHP非常熟悉的高手,利用操作碼還原PHP源程序也會容易許多。
逆向工程在軟件教學(xué)、科研、開發(fā)等場合都是一種非常重要的手段。在教學(xué)和科研中,為了學(xué)習(xí)國外先進(jìn)的軟件設(shè)計理念,我們經(jīng)常需要把國外一些機(jī)構(gòu)和個人開發(fā)的程序反編譯來進(jìn)行分析和借鑒;早期的漢化愛好者把外文版的軟件進(jìn)行反編譯,找到目標(biāo)菜單的源代碼,然后把漢語寫進(jìn)去替換相要了解和學(xué)習(xí)一個軟件所包含的思想和原則,必須對軟件的源程序進(jìn)行分析;要獲得某軟件的各種參數(shù),開發(fā)出能與該軟件兼容的軟件也必須獲得軟件的源程序。然而,為了在市場競爭中取得優(yōu)勢,軟件的開發(fā)者一般不會將源程序公開。因此,對軟件進(jìn)行逆向分析就成了軟件開發(fā)技術(shù)人員經(jīng)常采用的方法。
微軟最新的.net Framework由于采用了中間層,實現(xiàn)了跨平臺、跨語言的中間代碼,并在類似虛擬機(jī)的環(huán)境中運行,導(dǎo)致了MSIL(微軟中間語言)反編譯為C#或VB.net等源代碼并非難事。再以Zend Encoder編譯的PHP源程序為例,用Vulcan Logic Disassembler也可以得到PHP執(zhí)行時的操作碼,若是有對PHP非常熟悉的高手,利用操作碼還原PHP源程序也會容易許多。
逆向工程在軟件教學(xué)、科研、開發(fā)等場合都是一種非常重要的手段。在教學(xué)和科研中,為了學(xué)習(xí)國外先進(jìn)的軟件設(shè)計理念,我們經(jīng)常需要把國外一些機(jī)構(gòu)和個人開發(fā)的程序反編譯來進(jìn)行分析和借鑒;早期的漢化愛好者把外文版的軟件進(jìn)行反編譯,找到目標(biāo)菜單的源代碼,然后把漢語寫進(jìn)去替換相應(yīng)的外文,填入漢語的長度不得超過原文的長度,不足的可用空格補(bǔ)齊,然后再進(jìn)行編譯,最終完成外文軟件的漢化。
不過反編譯的弊端也顯而易見,這類工具落到一些不尊重其他人勞動成果的“小人”手中,會成為其剽竊的利器,造成侵權(quán)。世界知識產(chǎn)權(quán)組織在《WIPO知識產(chǎn)權(quán)手冊:政策、法律與使用》中認(rèn)定:軟件合法用戶對軟件進(jìn)行反編譯的行為,應(yīng)不利用所獲取的信息開發(fā)相似的軟件,并不會與著作權(quán)所有人正常使用軟件沖突,也不會對著作權(quán)所有人的合法權(quán)益造成不合理的損害。各國政府基本上都使用此原則對侵權(quán)案件進(jìn)行審理,如美國、歐盟、中國的相關(guān)法律部門都認(rèn)為:只要反編譯并非以復(fù)制軟件為目的,在實施反編譯行為的過程中所涉及的復(fù)制只是一種中間過渡性的復(fù)制,反編譯最終所達(dá)到的目的是使公眾可以獲得包含在軟件中不受著作權(quán)保護(hù)的成分,這樣的反編譯并不會被認(rèn)為是侵權(quán)。
技術(shù)從來都是一把雙刃劍,將反編譯合理使用,將有利于打破國外超級軟件企業(yè)對軟件技術(shù)的壟斷,有利于中小軟件企業(yè)開發(fā)出更多具有兼容性的軟件,從而促進(jìn)軟件產(chǎn)業(yè)的健康發(fā)展。對于侵權(quán)的、不合理的反編譯應(yīng)用,除了被計算機(jī)使用者鄙視和抵制外,完善的法律也是解決問題的有效途徑。