逆向分析,計(jì)算機(jī)世界中的九陰真經(jīng)
逆向工程,又稱(chēng)逆向技術(shù),是一種產(chǎn)品設(shè)計(jì)技術(shù)再現(xiàn)過(guò)程,即對(duì)一項(xiàng)目標(biāo)產(chǎn)品進(jìn)行逆向分析及研究,從而演繹并得出該產(chǎn)品的處理流程、組織結(jié)構(gòu)、功能特性及技術(shù)規(guī)格等設(shè)計(jì)要素,...
逆向工程
你玩游戲么?單機(jī)游戲,你是否使用過(guò)游戲補(bǔ)丁、修改器?
逆向工程,又稱(chēng)逆向技術(shù),是一種產(chǎn)品設(shè)計(jì)技術(shù)再現(xiàn)過(guò)程,即對(duì)一項(xiàng)目標(biāo)產(chǎn)品進(jìn)行逆向分析及研究,從而演繹并得出該產(chǎn)品的處理流程、組織結(jié)構(gòu)、功能特性及技術(shù)規(guī)格等設(shè)計(jì)要素,以制作出功能相近,但又不完全一樣的產(chǎn)品。逆向工程源于商業(yè)及軍事領(lǐng)域中的硬件分析。其主要目的是在不能輕易獲得必要的生產(chǎn)信息的情況下,直接從成品分析,推導(dǎo)出產(chǎn)品的設(shè)計(jì)原理。
而軟件逆向工程,隨著計(jì)算機(jī)技術(shù)在各個(gè)領(lǐng)域的廣泛應(yīng)用,特別是軟件開(kāi)發(fā)技術(shù)的迅猛發(fā)展,基于某個(gè)軟件,以反匯編閱讀源碼的方式去推斷其數(shù)據(jù)結(jié)構(gòu)、體系結(jié)構(gòu)和程序設(shè)計(jì)信息成為軟件逆向工程技術(shù)關(guān)注的主要對(duì)象。軟件逆向技術(shù)的目的是用來(lái)研究和學(xué)習(xí)先進(jìn)的技術(shù),特別是當(dāng)手里沒(méi)有合適的文檔資料,而你又很需要實(shí)現(xiàn)某個(gè)軟件的功能的時(shí)候。也正因?yàn)檫@樣,很多軟件為了壟斷技術(shù),在軟件安裝之前,要求用戶(hù)同意不去逆向研究。
而,這是重點(diǎn):逆向工程的實(shí)施過(guò)程是多領(lǐng)域、多學(xué)科的協(xié)同過(guò)程。
我們拿它來(lái)講解
首先,我聲明一點(diǎn),本文一切僅為技術(shù)探討,并不包含任何攻擊性、負(fù)面性侵犯。我酷愛(ài)俄羅斯方塊,而其中火拼俄羅斯更為火爆。記得當(dāng)年不日不夜的練習(xí)俄羅斯方塊,試圖在 3V3 競(jìng)技中一展宏圖。卻沒(méi)有料到高手甚多,秒我乃拈花摘葉,隨手即來(lái)。
此刻,如何是好?
假如,我有一個(gè),傳說(shuō)中的神兵,是不是可以逆轉(zhuǎn)這樣狼狽的局面呢?嗯,有趣,甚是有趣。那么,我們就開(kāi)始造兵器——打造一款,傳說(shuō)中火拼俄羅斯方塊輔助如何?
首先,要打造一個(gè)輔助,你必須介入程序,怎么介入?
遠(yuǎn)程注入 DLL!
DLL 的遠(yuǎn)程注入技術(shù)是目前 Win32 病毒廣泛使用的一種技術(shù)。使用這種技術(shù)的病毒體通常位于一個(gè) DLL 中,在系統(tǒng)啟動(dòng)的時(shí)候,一個(gè) EXE 程序會(huì)將這個(gè) DLL 加載至某些系統(tǒng)進(jìn)程(如 Explorer.exe)中運(yùn)行。
這樣一來(lái),普通的進(jìn)程管理器就很難發(fā)現(xiàn)這種病毒了,而且即使發(fā)現(xiàn)了也很難清除,因?yàn)橹灰《炯纳倪M(jìn)程不終止運(yùn)行,那么這個(gè) DLL 就不會(huì)在內(nèi)存中卸載。
用戶(hù)也就無(wú)法在資源管理器中刪除這個(gè) DLL 文件,真可謂一箭雙雕哉。記得 2003年QQ 尾巴病毒肆虐的時(shí)候,就已經(jīng)有些尾巴病毒的變種在使用這種技術(shù)了。你需要了解以下幾個(gè) API 函數(shù):
- OpenProcess - 用于打開(kāi)要寄生的目標(biāo)進(jìn)程。
- VirtualAllocEx/VirtualFreeEx - 用于在目標(biāo)進(jìn)程中分配 / 釋放內(nèi)存空間
- WriteProcessMemory - 用于在目標(biāo)進(jìn)程中寫(xiě)入要加載的 DLL 名稱(chēng)。
- CreateRemoteThread - 遠(yuǎn)程加載 DLL 的核心內(nèi)容,用于控制目標(biāo)進(jìn)程調(diào)用 API 函數(shù)。
- LoadLibrary - 目標(biāo)進(jìn)程通過(guò)調(diào)用此函數(shù)來(lái)加載病毒 DLL。
在此我只給出了簡(jiǎn)要的函數(shù)說(shuō)明,關(guān)于函數(shù)的詳細(xì)功能和介紹請(qǐng)參閱 MSDN。還有,至于代碼,本文不貼代碼,只講技術(shù),有興趣可以自行谷歌。
如此以來(lái),就可以將自己寫(xiě)的 DLL,注入到火拼俄羅斯方塊這個(gè)程序里,并且讓他運(yùn)行起來(lái)。
DLL 里實(shí)現(xiàn)什么?
DLL 里需要實(shí)現(xiàn)的就是一套基于人工智能的玩火拼俄羅斯的機(jī)器人。我們假設(shè)已經(jīng)有一款超高智能的 LIB 已經(jīng)被我們引入。那么,DLL 還需要就是實(shí)現(xiàn)模擬控制的一些方法。還需要什么?還需要當(dāng)前方塊的樣子,下一個(gè)方塊的樣子,當(dāng)前自己擺放的樣子,甚至還可能需要知道對(duì)手?jǐn)[放的樣子,自己獲得了哪些道具。
這些數(shù)據(jù),怎么來(lái)?
圖像識(shí)別,將當(dāng)前窗口截圖,然后開(kāi)始根據(jù) X Y 的坐標(biāo)進(jìn)行分析,通過(guò)圖像識(shí)別的方法,獲得當(dāng)前方塊樣子,自己擺放的樣子,對(duì)手的樣子。
這樣做好么?
這是比較直觀的方案,但是每次都要掃描,進(jìn)行圖像比較,然后獲得數(shù)據(jù),你會(huì)直觀的覺(jué)得,那會(huì)快么?效率高么?假定有了這些數(shù)據(jù),你還要做什么?當(dāng)然就是操作了,移動(dòng)方塊,變形方塊,下落方塊和使用道具了。這又如何做呢?簡(jiǎn)單,模擬鼠標(biāo)鍵盤(pán)按鍵,然后操作就好了。
聽(tīng)起來(lái),這一套,似乎是不錯(cuò)的方案,不是么?NO,這樣做出來(lái),頂多算一個(gè)兵器,要稱(chēng)之為神兵,估計(jì)還是有一點(diǎn)點(diǎn)距離的!那么,神兵的話(huà),我們?cè)撊绾未蛟欤?/p>
分析內(nèi)存,從內(nèi)從中找到當(dāng)前方塊,自己擺放的樣子,對(duì)手的樣子。分析程序,獲得開(kāi)發(fā)者實(shí)現(xiàn)操作函數(shù),并且調(diào)用這些函數(shù)。于是?聽(tīng)起來(lái)很深?yuàn)W的樣子,能辦到么?
逆向工具
在這里,我只為大家普及工具,就不一一演示,我只做簡(jiǎn)單的介紹和說(shuō)明。
靜態(tài)分析工具 IDA,交互式反匯編器專(zhuān)業(yè)版(Interactive Disassembler Professional),人們常稱(chēng)其為 IDA Pro,或簡(jiǎn)稱(chēng)為 IDA,是總部位于比利時(shí)列日市(Liège)的 Hex-Rayd 公司的一款產(chǎn)品。開(kāi)發(fā) IDA 的是一位編程天才,名叫 Ilfak Guilfanov。十年前誕生時(shí),IDA 還是一個(gè)基于控制臺(tái)的 MS-DOS 應(yīng)用程序,這一點(diǎn)很重要,因?yàn)樗兄谖覀兝斫?IDA 用戶(hù)界面的本質(zhì)。除其他內(nèi)容外,IDA 的非 Windows 和非 GUI 版本仍然繼續(xù)采用源于最初 DOS 版本的控制臺(tái)形式的界面。
動(dòng)態(tài)調(diào)試工具有 OD(OllyDBG)和 windbg。 調(diào)試應(yīng)用層程序兩個(gè)調(diào)試器都可以,OD 因?yàn)橹饕嫦蚰嫦颍翱诓季指鼮楹侠碇庇^且插件眾多,所以一般情況下都首選 OD,windbg 沒(méi)那么方便,大部分操作通過(guò)命令來(lái)進(jìn)行,但它也有它的優(yōu)勢(shì),各種命令(內(nèi)置命令、元命令和擴(kuò)展命令)提供了強(qiáng)大的控制和分析能力,所以 windbg 有時(shí)也會(huì)用到。如果要調(diào)試內(nèi)核程序或模塊那 OD 就無(wú)能為力了,windbg 可以說(shuō)是唯一的選擇,以前還有個(gè) softice,但 softice 已經(jīng)停止更新和支持,現(xiàn)在已經(jīng)沒(méi)什么了用了。
偵殼工具 PEid,但實(shí)際結(jié)果還是工具加上自己的分析。脫殼,盡量手動(dòng)。二進(jìn)制編輯工具 UltraEdit、Hex Workshop 以及 WinHex,比較工具 Beyond Compare。網(wǎng)絡(luò)包抓包分析工具 Wireshark 和 Iris。文件和注冊(cè)表監(jiān)視工具 Process Monitor。最后,虛擬機(jī),VM 不二。
開(kāi)始逆向
有了工具,我們就可以開(kāi)始對(duì)火拼俄羅斯進(jìn)行逆向分析了,逆向是一個(gè)復(fù)雜而繁瑣的過(guò)程。會(huì)經(jīng)歷無(wú)數(shù)的嘗試,代碼分析,邏輯分析。如果是分析游戲,如果您是游戲開(kāi)發(fā)者,或許思路更為廣泛,可以明白一些開(kāi)發(fā)者的正常思維。
那么,這個(gè)游戲,我們?nèi)胧贮c(diǎn)在那?
用 OD 附加俄羅斯方塊,找到一個(gè)關(guān)鍵點(diǎn),這個(gè)關(guān)鍵點(diǎn)就是,游戲初始化。
從正常的開(kāi)發(fā)角度來(lái)想,在初始化的時(shí)候,一般都會(huì)清空數(shù)據(jù)。無(wú)論是從網(wǎng)絡(luò)還是本地,都會(huì)分配方塊的樣式。然后從這里入手,我就很快的找到了幾個(gè)內(nèi)存地址。從這些地址中,可以得到當(dāng)前方塊的樣式,并且可以預(yù)知下一個(gè)方塊的樣式,并且得到了當(dāng)前擺放的游戲池中的樣式。然后,緊接著,就找尋控制移動(dòng)的地方。很快,就從按鍵得到一些信息,找到了。
其中,所有下落后的方塊,我們可以在 OD 中看到他的內(nèi)存樣式,其中表示紅色的,就是被改變的數(shù)據(jù)。什么數(shù)據(jù)被改變呢?就是確定下落后的方塊,數(shù)字代表了方塊的顏色,也可以說(shuō)是方塊的樣式。內(nèi)存中的分布如圖可見(jiàn)。
然后,通過(guò)注入 DLL 到進(jìn)程,做出了一個(gè)插件。圖片中演示了插件工作的樣式。
其中,已經(jīng)預(yù)知了下幾個(gè)方塊的樣式,并且得到了游戲棋盤(pán)的數(shù)據(jù),AUTO 就是自動(dòng)開(kāi)始游戲。測(cè)試了效果還不錯(cuò)。
結(jié)束了嗎?
其實(shí)逆向的還有很多很多高深的奧秘。我也只是一個(gè)初級(jí)者。現(xiàn)在大多數(shù)的程序,都加入了一些反調(diào)。并且為自己的程序加入了一些殼。簡(jiǎn)單說(shuō)說(shuō),世界比較知名的高強(qiáng)度殼就是 VMProtect,Themida ,SE (Safengine) 等等。其中,TW(Themida Winlicense)當(dāng)時(shí)搞得我頭大,他的反調(diào)很是有趣。而,對(duì)于游戲來(lái)說(shuō),很多游戲都加入了驅(qū)動(dòng)級(jí)的保護(hù),比如騰訊的 TP(TenProtect),韓國(guó)公司的 HS(HackShield),還有 NEXON 的 NGS (Nexon Game Security) ,完美的 PP 等等等。
現(xiàn)在安全越來(lái)越被大家重視,而公司安全逆向組一般都會(huì)做一些病毒樣本分析,也會(huì)做一些公司產(chǎn)品的防護(hù)。而這是一個(gè)博大精深的世界,里面非常的有趣,也富有挑戰(zhàn)。所以,一文的簡(jiǎn)單介紹,希望能把你吸引進(jìn)入,這個(gè)神奇的界域。
本文作者:Garfield,一個(gè)逆向領(lǐng)域的初學(xué)者,現(xiàn)任職于點(diǎn)融技術(shù) Social 團(tuán)隊(duì)。
本文首發(fā)于點(diǎn)融黑幫(微信號(hào):DianrongMafia),這是一個(gè)互聯(lián)網(wǎng)技術(shù)類(lèi)微信號(hào),匯集了各路創(chuàng)業(yè)大牛。
原創(chuàng)文章,作者:點(diǎn)融黑幫,如若轉(zhuǎn)載,請(qǐng)注明出處:http://36kr.com/p/5041770.html