唐劍飛++任彩霞
摘 要:隨著計(jì)算機(jī)的普及,軟件產(chǎn)品的層出不窮,逆向與反逆向技術(shù)的對(duì)抗就從未停止過(guò),反匯編出的代碼雖然生澀難懂但是還具有程序的邏輯性,但是經(jīng)過(guò)了二次加密之后再次展現(xiàn)的代碼毫無(wú)邏輯性可言,而且結(jié)構(gòu)混亂,有些反調(diào)試機(jī)制加大了逆向工程師的調(diào)試難度,本文立足于一段編譯好的具有二次加密的程序,通過(guò)OllDbg工具進(jìn)行分析,最后總結(jié)自解密程序的破解流程和編寫思路。
關(guān)鍵詞:信息安全 加密解密 逆向工程 反調(diào)試
中圖分類號(hào):TP393.09 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1672-3791(2017)11(b)-0058-02
逆向分析技術(shù)是信息安全的重要組成部分,在惡意代碼分析,軟件破解方面起到至關(guān)重要的作用,在對(duì)軟件進(jìn)行逆向破解的過(guò)程中,程序的編寫者會(huì)采用一些技術(shù)手段對(duì)程序的源代碼進(jìn)行二次處理,從而對(duì)軟件逆向工作增加了不小的難度,對(duì)于反匯編代碼的定位更是無(wú)從下手,程序自解密手段的使用更使得逆向的難度提高。如今我們從自解密程序的特點(diǎn)出發(fā),介紹幾種常見(jiàn)的針對(duì)自解密程序的破解方法。
本文從一個(gè)自解密的一個(gè)小程序出發(fā),簡(jiǎn)要的介紹一下基于OllyDbg的自解密破解方法的運(yùn)用。
1 自解密程序特點(diǎn)
通常逆向過(guò)程中,我們會(huì)發(fā)現(xiàn)某一塊代碼區(qū)域內(nèi)出現(xiàn)亂碼情況,一般情況下程序走到這里基本上是終止,或者跳轉(zhuǎn)到某個(gè)dll中繼續(xù)執(zhí)行,然后代碼就意外終止。一般解密程序和亂碼是放在一起的,這一點(diǎn)是無(wú)法避免的因?yàn)樽鳛槌绦虻木帉懻?,為了考慮到程序的正常運(yùn)行,需要程序在執(zhí)行到亂碼區(qū)域,很快就能夠找到解碼方式,然后轉(zhuǎn)變成正常的代碼繼續(xù)執(zhí)行。所以,在繞過(guò)相關(guān)的反調(diào)試技術(shù)之后,下一步就可能會(huì)為我們提供解密算法的位置。
2 需要自解密代碼的出現(xiàn)位置
為了方便讀者直觀的閱讀,我們可以使用交互式反匯編器專業(yè)版(Interactive Disassembler Professional),人們常稱其為IDA Pro,下文簡(jiǎn)稱IDA打開(kāi)我們的目標(biāo)程序。
如圖1所示,在.text的區(qū)域中,可以注意到起始的地址401160,結(jié)束的地址是4011E0的區(qū)域中無(wú)法正常反編譯成正常的的機(jī)器語(yǔ)言,顯示的以一堆亂碼的情況。
如圖2所示,我們又在OllyDbg工具中,下文簡(jiǎn)稱OD打開(kāi)目標(biāo)程序。
在OD中我們通過(guò)繞過(guò)相關(guān)檢測(cè)API,形如(IsDebugPresent)的函數(shù)和花指令后,尋找到看到程序中的這樣一行,在圖片中可以看到指令(cmp edx,38bf1686.004011E0),也就是前面用IDA打開(kāi)的結(jié)束地址:4011E0。
原理分析:在這里我們看到先是把地址為00401160位置裝載進(jìn)入edx,然后開(kāi)始進(jìn)行對(duì)每個(gè)地址單元進(jìn)行0x88的異或運(yùn)算,為止條件為地址碼為4011E0,正好是我們?cè)贗DA中看到的開(kāi)始到結(jié)束的那一段亂碼。
3 方法一:INT3斷點(diǎn)法
3.1 方法介紹
在圖3中,我們針對(duì)目標(biāo)程序自解密的核心代碼部分設(shè)置INT3斷點(diǎn),在圖3所示處按下F2,這樣我們就打下一個(gè)軟件斷點(diǎn)。
進(jìn)行軟件斷點(diǎn)的設(shè)置之后,可以一直按F8,你會(huì)經(jīng)過(guò)這個(gè)jnz,然后直到在OD寄存器展示欄中遇到下圖所示的情況,圖4中顯示edx=004011E0。
然后按F8動(dòng)態(tài)的跟蹤程序,如圖5所示。
F2下斷點(diǎn),就行了,然后F7跟進(jìn)去。
圖6所展示的就是自解密程序段的解碼后的結(jié)果,通過(guò)在Windows PE頭中中存儲(chǔ)的解密代碼,通過(guò)軟件斷點(diǎn)的方式,在OD中循環(huán)調(diào)用,最終把起始的地址為401160到結(jié)束的地址為4011E0的部分恢復(fù)成程序未加密之前的初始情況。
3.2 原理分析
INT3斷點(diǎn)的執(zhí)行流程,如圖7所示。
軟件斷點(diǎn)是通過(guò)監(jiān)測(cè)特定的指令來(lái)觸發(fā)斷點(diǎn)的。在某個(gè)地址設(shè)置軟件斷點(diǎn)的時(shí)候,仿真器會(huì)將這個(gè)地址的數(shù)據(jù)/指令替換成一個(gè)特殊格式的指令。斷點(diǎn)單元通過(guò)監(jiān)測(cè)這個(gè)特殊格式的指令來(lái)觸發(fā)斷點(diǎn)。
調(diào)試器在我們下斷點(diǎn)的位置,寫入xCC,然后把下斷點(diǎn)的之前的值保存在斷點(diǎn)列表之中。
因?yàn)槲覀儺?dāng)時(shí)存進(jìn)去的位置是亂碼的位置,所以O(shè)D會(huì)出現(xiàn)斷點(diǎn)損壞的提示,如圖8所示。
在之前如果不打斷點(diǎn),我們就直接越過(guò)了,而直接越過(guò)原因就是程序訪問(wèn)了沒(méi)有邏輯的區(qū)域,程序沒(méi)有完成自解密的過(guò)程,從而跳轉(zhuǎn)到了未知區(qū)域,斷點(diǎn)的目的就告訴程序回到所存儲(chǔ)斷點(diǎn)的位置,讓程序不會(huì)跑偏。
4 方法二:文件寫入法
先把程序文件用二進(jìn)制格式打開(kāi),把00401160到004011E0之間這塊位置的內(nèi)容從IDA中提取出來(lái),然后直接用python寫腳本一個(gè)個(gè)異或0x88就可以了,這種方式是通過(guò)分析程序流程得到。不過(guò)這種方法只能針對(duì)于是片區(qū)的大塊數(shù)據(jù)域運(yùn)算,還要保證程序的正確性。由于操作較為復(fù)雜,這里不再贅述。
5 結(jié)語(yǔ)
通過(guò)對(duì)自解密程序的研究,我們了解到找到關(guān)鍵的加密算法就變得尤為關(guān)鍵,自解密程序中也不是所有的代碼都進(jìn)行了加密,在已經(jīng)找到的關(guān)鍵解密代碼的部分我們可以采用INT3 斷點(diǎn)調(diào)試法,和文件手動(dòng)寫入的方法,進(jìn)行原始代碼的恢復(fù)工作,尤其是在相關(guān)PE結(jié)構(gòu)的空白區(qū)域,可能就提供了相關(guān)解密算法的內(nèi)容。
參考文獻(xiàn)
[1] 吉?jiǎng)佘?基于OllyDbg的軟件漏洞技術(shù)分析[J].科技資訊,2010(17):19.
[2] 趙北庚.軟件逆向分析過(guò)程中基于OllyDbg的三種匯編代碼定位方法[J].網(wǎng)絡(luò)安全技術(shù)與應(yīng)用,2015(2):50,52.
[3] ]趙北庚.基于OllyDbg的函數(shù)棧幀逆向分析研究[J].網(wǎng)絡(luò)安全技術(shù)與應(yīng)用,2015(1):24,26.endprint