逆向工程
逆向工程,又稱逆向技術,是一種產品設計技術再現過程,即對一專案標產品進行逆向分析及研究,從而演繹並得出該產品的處理流程、組織結構、功能特性及技術規格等設計要素,以製作出功能相近,但又不完全一樣的產品。逆向工程源於商業及軍事領域中的硬體分析。其主要目的是在不能輕易獲得必要的生產資訊的情況下,直接從成品分析,推匯出產品的設計原理。
而軟體逆向工程,隨著計算機技術在各個領域的廣泛應用,特別是軟體開發技術的迅猛發展,基於某個軟體,以反彙編閱讀原始碼的方式去推斷其資料結構、體系結構和程式設計資訊成為軟體逆向工程技術關注的主要物件。軟體逆向技術的目的是用來研究和學習先進的技術,特別是當手裡沒有合適的文件資料,而你又很需要實現某個軟體的功能的時候。也正因為這樣,很多軟體為了壟斷技術,在軟體安裝之前,要求使用者同意不去逆向研究。
而,這是重點:逆向工程的實施過程是多領域、多學科的協同過程。
我們拿它來講解
首先,我宣告一點,本文一切僅為技術探討,並不包含任何攻擊性、負面性侵犯。我酷愛俄羅斯方塊,而其中火拼俄羅斯更為火爆。記得當年不日不夜的練習俄羅斯方塊,試圖在 3V3 競技中一展宏圖。卻沒有料到高手甚多,秒我乃拈花摘葉,隨手即來。
此刻,如何是好?
假如,我有一個,傳說中的神兵,是不是可以逆轉這樣狼狽的局面呢?嗯,有趣,甚是有趣。那麼,我們就開始造兵器——打造一款,傳說中火拼俄羅斯方塊輔助如何?
首先,要打造一個輔助,你必須介入程式,怎麼介入?
遠端注入 DLL!
DLL 的遠端注入技術是目前 Win32 病毒廣泛使用的一種技術。使用這種技術的病毒體通常位於一個 DLL 中,在系統啟動的時候,一個 EXE 程式會將這個 DLL 載入至某些系統程式(如 Explorer.exe)中執行。
這樣一來,普通的程式管理器就很難發現這種病毒了,而且即使發現了也很難清除,因為只要病毒寄生的程式不終止執行,那麼這個 DLL 就不會在記憶體中解除安裝。
使用者也就無法在資源管理器中刪除這個 DLL 檔案,真可謂一箭雙鵰哉。記得 2003年QQ 尾巴病毒肆虐的時候,就已經有些尾巴病毒的變種在使用這種技術了。你需要了解以下幾個 API 函式:
- OpenProcess - 用於開啟要寄生的目標程式。
- VirtualAllocEx/VirtualFreeEx - 用於在目標程式中分配 / 釋放記憶體空間
- WriteProcessMemory - 用於在目標程式中寫入要載入的 DLL 名稱。
- CreateRemoteThread - 遠端載入 DLL 的核心內容,用於控制目標程式呼叫 API 函式。
- LoadLibrary - 目標程式透過呼叫此函式來載入病毒 DLL。
在此我只給出了簡要的函式說明,關於函式的詳細功能和介紹請參閱 MSDN。還有,至於程式碼,本文不貼程式碼,只講技術,有興趣可以自行谷歌。
如此以來,就可以將自己寫的 DLL,注入到火拼俄羅斯方塊這個程式裡,並且讓他執行起來。
DLL 裡實現什麼?
DLL 裡需要實現的就是一套基於人工智慧的玩火拼俄羅斯的機器人。我們假設已經有一款超高智慧的 LIB 已經被我們引入。那麼,DLL 還需要就是實現模擬控制的一些方法。還需要什麼?還需要當前方塊的樣子,下一個方塊的樣子,當前自己擺放的樣子,甚至還可能需要知道對手擺放的樣子,自己獲得了哪些道具。
這些資料,怎麼來?
影像識別,將當前視窗截圖,然後開始根據 X Y 的座標進行分析,透過影像識別的方法,獲得當前方塊樣子,自己擺放的樣子,對手的樣子。
這樣做好麼?
這是比較直觀的方案,但是每次都要掃描,進行影像比較,然後獲得資料,你會直觀的覺得,那會快麼?效率高麼?假定有了這些資料,你還要做什麼?當然就是操作了,移動方塊,變形方塊,下落方塊和使用道具了。這又如何做呢?簡單,模擬滑鼠鍵盤按鍵,然後操作就好了。
聽起來,這一套,似乎是不錯的方案,不是麼?NO,這樣做出來,頂多算一個兵器,要稱之為神兵,估計還是有一點點距離的!那麼,神兵的話,我們該如何打造?
分析記憶體,從內從中找到當前方塊,自己擺放的樣子,對手的樣子。分析程式,獲得開發者實現操作函式,並且呼叫這些函式。於是?聽起來很深奧的樣子,能辦到麼?
逆向工具
在這裡,我只為大家普及工具,就不一一演示,我只做簡單的介紹和說明。
靜態分析工具 IDA,互動式反彙編器專業版(Interactive Disassembler Professional),人們常稱其為 IDA Pro,或簡稱為 IDA,是總部位於比利時列日市(Liège)的 Hex-Rayd 公司的一款產品。開發 IDA 的是一位程式設計天才,名叫 Ilfak Guilfanov。十年前誕生時,IDA 還是一個基於控制檯的 MS-DOS 應用程式,這一點很重要,因為它有助於我們理解 IDA 使用者介面的本質。除其他內容外,IDA 的非 Windows 和非 GUI 版本仍然繼續採用源於最初 DOS 版本的控制檯形式的介面。
動態除錯工具有 OD(OllyDBG)和 windbg。 除錯應用層程式兩個偵錯程式都可以,OD 因為主要面向逆向,視窗布局更為合理直觀且外掛眾多,所以一般情況下都首選 OD,windbg 沒那麼方便,大部分操作透過命令來進行,但它也有它的優勢,各種命令(內建命令、元命令和擴充套件命令)提供了強大的控制和分析能力,所以 windbg 有時也會用到。如果要除錯核心程式或模組那 OD 就無能為力了,windbg 可以說是唯一的選擇,以前還有個 softice,但 softice 已經停止更新和支援,現在已經沒什麼了用了。
偵殼工具 PEid,但實際結果還是工具加上自己的分析。脫殼,儘量手動。二進位制編輯工具 UltraEdit、Hex Workshop 以及 WinHex,比較工具 Beyond Compare。網路包抓包分析工具 Wireshark 和 Iris。檔案和登錄檔監視工具 Process Monitor。最後,虛擬機器,VM 不二。
開始逆向
有了工具,我們就可以開始對火拼俄羅斯進行逆向分析了,逆向是一個複雜而繁瑣的過程。會經歷無數的嘗試,程式碼分析,邏輯分析。如果是分析遊戲,如果您是遊戲開發者,或許思路更為廣泛,可以明白一些開發者的正常思維。
那麼,這個遊戲,我們入手點在那?
用 OD 附加俄羅斯方塊,找到一個關鍵點,這個關鍵點就是,遊戲初始化。
從正常的開發角度來想,在初始化的時候,一般都會清空資料。無論是從網路還是本地,都會分配方塊的樣式。然後從這裡入手,我就很快的找到了幾個記憶體地址。從這些地址中,可以得到當前方塊的樣式,並且可以預知下一個方塊的樣式,並且得到了當前擺放的遊戲池中的樣式。然後,緊接著,就找尋控制移動的地方。很快,就從按鍵得到一些資訊,找到了。
其中,所有下落後的方塊,我們可以在 OD 中看到他的記憶體樣式,其中表示紅色的,就是被改變的資料。什麼資料被改變呢?就是確定下落後的方塊,數字代表了方塊的顏色,也可以說是方塊的樣式。記憶體中的分佈如圖可見。
然後,透過注入 DLL 到程式,做出了一個外掛。圖片中演示了外掛工作的樣式。
其中,已經預知了下幾個方塊的樣式,並且得到了遊戲棋盤的資料,AUTO 就是自動開始遊戲。測試了效果還不錯。
結束了嗎?
其實逆向的還有很多很多高深的奧秘。我也只是一個初級者。現在大多數的程式,都加入了一些反調。並且為自己的程式加入了一些殼。簡單說說,世界比較知名的高強度殼就是 VMProtect,Themida ,SE (Safengine) 等等。其中,TW(Themida Winlicense)當時搞得我頭大,他的反調很是有趣。而,對於遊戲來說,很多遊戲都加入了驅動級的保護,比如騰訊的 TP(TenProtect),韓國公司的 HS(HackShield),還有 NEXON 的 NGS (Nexon Game Security) ,完美的 PP 等等等。
現在安全越來越被大家重視,而公司安全逆向組一般都會做一些病毒樣本分析,也會做一些公司產品的防護。而這是一個博大精深的世界,裡面非常的有趣,也富有挑戰。所以,一文的簡單介紹,希望能把你吸引進入,這個神奇的界域。
本文作者:Garfield,一個逆向領域的初學者,現任職於點融技術 Social 團隊。
本文首發於點融黑幫(微信號:DianrongMafia),這是一個網際網路技術類微訊號,彙集了各路創業大牛。
原創文章,作者:點融黑幫,如若轉載,請註明出處:http://36kr.com/p/5041770.html