成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

逆向基礎(chǔ):軟件手動脫殼技術(shù)入門

安全 數(shù)據(jù)安全
這里整合了一下之前自己學(xué)習(xí)軟件手工脫殼的一些筆記和脫文,希望能給新學(xué)軟件逆向和脫殼的童鞋們一點(diǎn)幫助。

 這里整合了一下之前自己學(xué)習(xí)軟件手工脫殼的一些筆記和脫文,希望能給新學(xué)軟件逆向和脫殼的童鞋們一點(diǎn)幫助。

1 一些概念

1.1 加殼

加殼的全稱應(yīng)該是可執(zhí)行程序資源壓縮,是保護(hù)文件的常用手段。加殼過的程序可以直接運(yùn)行,但是不能查看源代碼。要經(jīng)過脫殼才可以查看源代碼。

加殼是利用特殊的算法,對EXE、DLL文件里的資源進(jìn)行壓縮、加密。類似WINZIP 的效果,只不過這個(gè)壓縮之后的文件,可以獨(dú)立運(yùn)行,解壓過程完全隱蔽,都在內(nèi)存中完成。它們附加在原程序上通過Windows加載器載入內(nèi)存后,先于原始程序執(zhí)行,得到控制權(quán),執(zhí)行過程中對原始程序進(jìn)行解密、還原,還原完成后再把控制權(quán)交還給原始程序,執(zhí)行原來的代碼部分。加上外殼后,原始程序代碼在磁盤文件中一般是以加密后的形式存在的,只在執(zhí)行時(shí)在內(nèi)存中還原,這樣就可以比較有效地防止破解者對程序文件的非法修改,同時(shí)也可以防止程序被靜態(tài)反編譯。

殼的類型通常分為壓縮殼和加密殼兩類。壓縮殼的特點(diǎn)是減小軟件體積大小,加密保護(hù)不是重點(diǎn)。加密殼種類比較多,不同的殼側(cè)重點(diǎn)不同,一些殼單純保護(hù)程序,另一些殼提供額外的功能,如提供注冊機(jī)制、使用次數(shù)、時(shí)間限制等。

1.2 OEP

OEP:(Original Entry Point),程序的入口點(diǎn)。軟件加殼一般隱藏了程序真實(shí)的OEP(或者用了假的OEP), 我們需要尋找程序真正的OEP,才可以完成脫殼。

一般加殼程序在使用Ollydbg等動態(tài)調(diào)試工具時(shí),會停在殼的預(yù)處理塊。即處在對于程序原始代碼塊的解壓或解密操作之前,在運(yùn)行完程序自脫殼模塊后,會停留在程序加殼之前的OEP位置,此時(shí)是dump程序的***時(shí)期。脫殼時(shí)在真實(shí)OEP處下int3斷點(diǎn),就可以捕捉到程序代碼段完全恢復(fù)的狀態(tài)。因此,尋找加殼程序的正確OEP,也成了手動脫殼時(shí)的***要?jiǎng)?wù)。

1.3 IAT

IAT:(Import Address Table),導(dǎo)入地址表。由于導(dǎo)入函數(shù)就是被程序調(diào)用但其執(zhí)行代碼又不在程序中的函數(shù),這些函數(shù)的代碼位于一個(gè)或者多個(gè)DLL中。當(dāng)PE文件被裝入內(nèi)存的時(shí)候,Windows裝載器才將DLL 裝入,并將調(diào)用導(dǎo)入函數(shù)的指令和函數(shù)實(shí)際所處的地址聯(lián)系起來(動態(tài)連接),這操作就需要導(dǎo)入表完成。其中導(dǎo)入地址表就指示函數(shù)實(shí)際地址。 多數(shù)加殼軟件在運(yùn)行時(shí)會重建導(dǎo)入地址表,因此獲取加殼程序正確的導(dǎo)入地址表也是手動脫殼操作中的一個(gè)關(guān)鍵問題。

2 一些脫殼方法

2.1單步跟蹤法

單步跟蹤法的原理就是通過Ollydbg的單步(F8)、單步進(jìn)入(F7)和運(yùn)行到(F4)功能,完整走過程序的自脫殼過程,跳過一些循環(huán)恢復(fù)代碼的片段,并用單步進(jìn)入確保程序不會略過OEP。這樣可以在軟件自動脫殼模塊運(yùn)行完畢后,到達(dá)OEP,并dump程序。

2.2 ESP定律法

ESP定律法是脫殼的利器,是應(yīng)用頻率***的脫殼方法之一。

ESP定律的原理在于程序中堆棧平衡的合理利用。由于在程序自解密或者自解壓過程中,不少殼會先將當(dāng)前寄存器內(nèi)容壓棧,如使用pushad,在解壓結(jié)束后,會將之前的寄存器值出棧,如使用popad。因此在寄存器出棧時(shí),往往程序代碼被自動恢復(fù),此時(shí)硬件斷點(diǎn)觸發(fā)。然后在程序當(dāng)前位置,只需要少許單步跟蹤,就很容易到達(dá)正確的OEP位置。

2.3內(nèi)存鏡像法(二次斷點(diǎn)法)

內(nèi)存鏡像法是在加殼程序被加載時(shí),通過OD的ALT+M快捷鍵,進(jìn)入到程序虛擬內(nèi)存區(qū)段。然后通過加兩次內(nèi)存一次性斷點(diǎn),到達(dá)程序正確OEP的位置。

內(nèi)存鏡像法的原理在于對于程序資源段和代碼段下斷點(diǎn),一般程序自解壓或者自解密時(shí),會首先訪問資源段獲取所需資源,然后在自動脫殼完成后,轉(zhuǎn)回程序代碼段。這時(shí)候下內(nèi)存一次性斷點(diǎn),程序就會停在OEP處。

2.4一步到達(dá)OEP

所謂的一步到達(dá)OEP的脫殼方法,是根據(jù)所脫殼的特征,尋找其距離OEP最近的一處匯編指令,然后下int3斷點(diǎn),在程序走到OEP的時(shí)候dump程序。 如一些壓縮殼往往popad指令距離OEP或者M(jìn)agic Jump特別近,因此使用Ollydbg的搜索功能,可以搜索殼的特征匯編代碼,達(dá)到一步斷點(diǎn)到達(dá)OEP的效果。

2.5***一次異常法

***一次異常法的原理是,程序在自解壓或自解密過程中,可能會觸發(fā)無數(shù)次的異常。如果能定位到***一次程序異常的位置,可能就會很接近自動脫殼完成位置。現(xiàn)在***一次異常法脫殼可以利用Ollydbg的異常計(jì)數(shù)器插件,先記錄異常數(shù)目,然后重新載入,自動停在***一次異常處。

2.6 模擬跟蹤法

模擬跟蹤法的原理就是使用Ollydbg下條件斷點(diǎn),SFX相當(dāng)于是一個(gè)自解壓段,在自解壓段結(jié)束時(shí)(eip的值轉(zhuǎn)到代碼段時(shí)),已經(jīng)距離OEP很近,但是這種跟蹤方法會比較耗時(shí)。

2.7 “SFX”法

“SFX”法利用了Ollydbg自帶的OEP尋找功能,可以選擇直接讓程序停在OD找到的OEP處,此時(shí)自解壓已經(jīng)完成,可以直接dump程序。#p#

3一些脫殼實(shí)踐

下面給出整理的使用以上方法,自己嘗試手動脫這幾種常用殼的脫殼筆記。

3.1UPX脫殼筆記

首先進(jìn)行偵殼:

 

enter image description here

 

首先把程序扔到OllyIce里面可以看到:

 

enter image description here

 

然后這里嘗試使用ESP定理:即在ESP***次改變時(shí),對ESP的地址設(shè)置硬件字訪問斷點(diǎn),這樣可以在代碼被UPX算法還原之后,跳轉(zhuǎn)到程序的正常入口處。

 

enter image description here

 

然后F5運(yùn)行,并沒有直接到跳轉(zhuǎn)到程序入口處的大跳位置,但是可以看到UPX的大跳就在眼前:

 

enter image description here

 

所以被還原后的程序入口點(diǎn)就是0x00445151(通過單步往下走,F(xiàn)4略過往回走的循環(huán)語句,也可以看到這個(gè)大跳的位置。)接下來走到大跳位置,跳到正常程序入口處:

 

enter image description here

 

然后去掉硬件斷點(diǎn),并使用LoadPE的dump功能dump目標(biāo)程序:

 

enter image description here

 

先修正映像大小,然后再選擇完整脫殼,這樣可以得到***步dump的程序,然后再使用ImportREC修復(fù)dump程序的OEP,OEP的信息通過OD自帶的dump功能查詢或者直接填45151:

 

enter image description here

 

將正確的入口地址填入ImportREC中,然后自動搜索IAT信息:

 

enter image description here

 

然后點(diǎn)擊獲取輸入表得到修正IAT之后的程序函數(shù)輸入表,然后再點(diǎn)擊顯示無效函數(shù),愉快地發(fā)現(xiàn)沒有無效函數(shù),那么就可以直接修復(fù)轉(zhuǎn)存文件了。

 

enter image description here

 

選擇剛剛***步dump下來的轉(zhuǎn)儲文件進(jìn)行修復(fù),修復(fù)完成之后脫殼完成:

 

enter image description here

 

這里對于壓縮殼UPX,直接使用了ESP定律,可以很方便找到OEP并dump程序。#p#

4.2 tElock脫殼筆記

這里脫的是一個(gè)tElock的殼:

 

enter image description here

 

1、先使用最簡單的***一次異常法: 首先把程序扔到OllyIce里面設(shè)置OD調(diào)試選項(xiàng)中的異常選項(xiàng),

 

enter image description here

 

僅保留內(nèi)存非法訪問異常,然后使用異常計(jì)數(shù)器插件,在使用前要清空斷點(diǎn)設(shè)置:

 

enter image description here

 

等到程序正常運(yùn)行后,重新加載程序,再選擇第二步,停在***一次異常之前:

 

enter image description here

 

然后用Alt+M轉(zhuǎn)到內(nèi)存窗口,對主程序code段下內(nèi)存斷點(diǎn),SHIFT+F9執(zhí)行:

 

enter image description here

 

這樣程序就中斷在了正確的OEP處,可以選擇從模塊中刪除分析以顯示正常分析的匯編代碼。然后使用LoadPE dump程序,并修正程序映像大小。但是在使用ImportREC v1.6F Fix版,輸入正確的OEP,獲取函數(shù)輸入表信息時(shí),會發(fā)現(xiàn)無效的指針。使用方法一修復(fù)后,再使用方法三可以完全修復(fù):

 

enter image description here

 

再點(diǎn)擊Fix dump,可以修復(fù)之前dump下來的程序,脫殼完成:

 

enter image description here

 

2、使用二次內(nèi)存斷點(diǎn)法: 首先載入程序,將所有的異常類型忽略,然后在idata段設(shè)置內(nèi)存斷點(diǎn), 然后SHIFT+F9:

 

enter image description here

 

 

enter image description here

 

停下來后再次在code段設(shè)置內(nèi)存斷點(diǎn),再次SHIFT+F9執(zhí)行,可以直接達(dá)到正確的OEP中:

 

enter image description here

 

然后LoadPE dump,然后修復(fù)IAT。修復(fù)方法同方法1。

3、尋找magic jump以及修復(fù)函數(shù)表完成后dump程序: 前兩步還是加內(nèi)存斷點(diǎn)(idata、code),然后定位到程序的正確OEP處

 

enter image description here

 

然后如果這時(shí)使用LoadPE dump后修復(fù),就和前兩種一樣了。這里先是使用ImportREC獲取函數(shù)輸入表***個(gè)位置的指針地址。

 

enter image description here

 

然后得到函數(shù)指針偏移地址在0x005512C,加上基地址后為0x045512C,這時(shí)在該位置下硬件訪問雙字?jǐn)帱c(diǎn)。再重新SHIFT+F9忽略異常執(zhí)行后,由于下了斷點(diǎn),會觸發(fā)tElock的CRC校驗(yàn)錯(cuò)誤:

 

enter image description here

 

所以這里要先繞過CRC校驗(yàn),才能成功執(zhí)行到硬件斷點(diǎn)位置,所以首先暫停程序,然后使用Alt+F9返回用戶代碼。點(diǎn)擊確定按鈕后,程序暫停在調(diào)用ExitProcess的位置:

 

enter image description here

 

現(xiàn)在要向上找一找能跳過這個(gè)退出的跳轉(zhuǎn)(CRC判斷跳轉(zhuǎn)),然后進(jìn)行修改并跳過:

 

enter image description here

 

找到了應(yīng)該修改的位置,但是如果修改之后重新運(yùn)行是會被恢復(fù)的,所以先記下來這個(gè)跳轉(zhuǎn)的地址,0x00469622。重新運(yùn)行之后,在idata斷設(shè)置內(nèi)存斷點(diǎn),SHIFT+F9停下后,再Ctrl+G找到修改點(diǎn)再修改。修改完之后再設(shè)置之前的硬件斷點(diǎn),這樣不會觸發(fā)CRC校驗(yàn)錯(cuò)誤了。

無數(shù)次的SHIFT+F9之后,在寄存器窗口可以看到指針以及能夠正常顯示: 

enter image description here

 

然后此時(shí)F8單步,找magic jump……看小生大大的視屏是通過分析疑似CRC跳轉(zhuǎn)得到magic jump的位置: 

enter image description here 

這里記下來magic jump的地址是0x0046973B,然后清空udd文件,刪除硬件斷點(diǎn),再次重新運(yùn)行程序,然后在idata下內(nèi)存斷點(diǎn)停住,然后Ctrl+G找到magic jump位置處,修改跳轉(zhuǎn): 

enter image description here 

然后在code段下內(nèi)存斷點(diǎn): 

enter image description here 

然后SHIFT+F9執(zhí)行,停下來就到了OEP的位置: 

enter image description here 

這時(shí)候再dump程序,IAT表已經(jīng)被修復(fù),可以直接獲得脫殼版程序: 

enter image description here 

這里嘗試使用了另外兩種脫殼方法,并且通過預(yù)先找OEP的方式,修復(fù)了CRC校驗(yàn)后,直接dump到了IAT被修復(fù)了的程序。#p#

3.3 PEncrypt脫殼筆記

首先進(jìn)行偵殼: 

enter image description here 

先把程序扔到OllyIce里面,然后程序停在這里,看起來蠻怪的: 

enter image description here  
enter image description here

好吧,重新加載程序,嘗試使用***一次異常法,不忽略所有異常,然后使用異常計(jì)數(shù)器插件,程序停在***一次異常處: 

enter image description here 

如果此時(shí)F8單步下去,程序會觸發(fā)異常處理,然后又到不了OEP了。這時(shí)需要看一下堆棧數(shù)據(jù)情況: 

enter image description here

 這時(shí)需要在0040CCD7處F2下斷點(diǎn),然后SHIFT+F9執(zhí)行,可以跳過這個(gè)坑: 

enter image description here 

然后接下來就是F8+F4的操作,一路直到OEP:

enter image description here 
enter image description here 

用LoadPE脫殼,然后用ImportREC修復(fù)后,雖然沒有無效指針,但是還是不能運(yùn)行: 

enter image description here 

這時(shí)候用LoadPE的重建PE功能: 

enter image description here 
enter image description here

 然后就可以正常運(yùn)行了: 

enter image description here 

這個(gè)殼使用了單步跟蹤的脫殼方法,一路跳過程序“陷阱”,***達(dá)到OEP。并且使用了LoadPE的重建PE功能,對程序進(jìn)行了重建,最終完成了這個(gè)加密殼的脫殼全過程。#p#

3.4 FSG變形殼脫殼筆記

首先進(jìn)行偵殼: 

enter image description here 

使用ESP定律,首先把程序扔到OllyIce里面,F(xiàn)8單步走,觀察ESP變化,在ESP***次發(fā)生變化時(shí),對ESP對應(yīng)的地址處設(shè)置內(nèi)存硬件訪問WORD斷點(diǎn),然后SHIFT+F9運(yùn)行,在程序停下來之后,取消硬件斷點(diǎn),進(jìn)行F8單步: 

enter image description here 

用F4略過向后的跳轉(zhuǎn)(循環(huán)),然后繼續(xù)往下找,一直到這里: 

enter image description here 

在這個(gè)jmp下面F4,程序會跑飛。說明程序代碼在這個(gè)循環(huán)中就已經(jīng)釋放完畢,所以向上找找這個(gè)循環(huán)中有沒有帶條件的大跳。這樣很容易找到magic jump的位置,然后我們Enter或者Ctrl+G到00402666的位置,發(fā)現(xiàn)果然是OEP,重新分析,然后F2下斷點(diǎn),讓程序走到OEP: 

enter image description here 

如果是FSG1.33,直接使用LoadPE dump文件,然后使用ImportREC修復(fù),就可以正常脫殼了。但是這里在使用ImportREC修復(fù)時(shí),會出現(xiàn)一個(gè)無效指針: 

enter image description here 

這里直接剪掉(或者刪掉)這個(gè)指針,然后修復(fù)轉(zhuǎn)存文件,發(fā)現(xiàn)無法正常打開: 

enter image description here 

然后再把修復(fù)后的程序,丟到OllyIce中F9直接運(yùn)行: 

enter image description here 

這里是變形殼添加的一個(gè)暗樁,會導(dǎo)致程序出現(xiàn)異常退出,這里直接nop掉或者把之前的jle(校驗(yàn))改成jmp,然后保存修改另存文件。然后就可以運(yùn)行了 

enter image description here 

4 參考

【百度百科(各種概念)、自己之前的脫文……】 另附一篇脫殼步驟匯總:http://www.52pojie.cn/thread-259984-1-1.html

 

責(zé)任編輯:藍(lán)雨淚 來源: 烏云知識庫
相關(guān)推薦

2012-12-03 11:59:31

2021-04-01 10:40:22

網(wǎng)絡(luò)安全軟件

2012-12-03 13:17:04

脫殼DUMP

2012-12-03 13:30:19

脫殼OEP

2013-05-30 13:06:26

交換技術(shù)高級交換技術(shù)

2020-09-28 10:47:41

Shellcode技術(shù)

2010-03-15 14:29:04

2011-02-24 11:10:33

Konqueror

2010-08-19 12:00:27

2021-09-07 20:23:08

基礎(chǔ)軟件操作系統(tǒng)自主創(chuàng)新

2010-09-30 09:40:45

2017-05-24 22:11:46

脫殼工具PIN安全工具

2022-02-22 19:04:01

Perl編程語言

2009-07-02 10:27:20

JSP技術(shù)JSP入門

2018-05-03 10:00:23

HBase運(yùn)維數(shù)據(jù)

2009-03-13 12:07:27

2010-01-14 10:55:34

CentOS auth

2021-03-24 09:46:46

網(wǎng)絡(luò)安全軟件反匯編

2011-08-10 17:04:43

JavaScript

2011-01-10 14:36:00

新手linux基礎(chǔ)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 亚洲综合婷婷 | 欧美黑人巨大videos精品 | 九九热在线视频观看这里只有精品 | 国产一区二区在线91 | 一区二区三区四区在线 | 久久综合狠狠综合久久 | 欧美影院 | 欧美一区二区三区在线观看视频 | 国产精品福利久久久 | 亚洲国产成人av | 亚洲精品一区二区另类图片 | 欧美久久精品一级c片 | 久久久久久国产精品mv | 亚洲国产精品网站 | 奇米影视在线 | 亚洲成年人免费网站 | 国产一区二区三区四区在线观看 | 亚洲综合天堂 | 久久1区| 国产精品视频在线免费观看 | 久久久精品网站 | 欧美日韩理论 | 国产精品欧美一区二区三区不卡 | 国产99久久精品一区二区300 | 香蕉视频久久久 | 一二三四在线视频观看社区 | 日韩中文字幕一区二区 | 国产99久久久久 | 日本在线观看视频 | 国产精品久久久久久一区二区三区 | 超碰综合 | 亚洲色图图片 | 九九色九九 | 91在线视频在线观看 | 成人午夜在线 | 成人综合在线视频 | 久久精品二区亚洲w码 | 色男人的天堂 | 国产精品久久久久久久久久久免费看 | 欧美日韩国产一区二区三区不卡 | 免费亚洲成人 |