exe文件脫殼步驟「exe脫殼教程」

這裡整合了一下之前自己學習軟件手工脫殼的一些筆記和脫文,希望能給新學軟件逆向和脫殼的童鞋們一點幫助。

1 一些概念

1.1 加殼

加殼的全稱應該是可執行程序資源壓縮,是保護文件的常用手段。加殼過的程序可以直接運行,但是不能查看源代碼。要經過脫殼才可以查看源代碼。

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

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

1.2 OEP

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

一般加殼程序在使用Ollydbg等動態調試工具時,會停在殼的預處理塊。即處在對於程序原始代碼塊的解壓或解密操作之前,在運行完程序自脫殼模塊後,會停留在程序加殼之前的OEP位置,此時是dump程序的最佳時期。脫殼時在真實OEP處下int3斷點,就可以捕捉到程序代碼段完全恢復的狀態。因此,尋找加殼程序的正確OEP,也成了手動脫殼時的第一要務。

1.3 IAT

IAT:(Import Address Table),導入地址表。由於導入函數就是被程序調用但其執行代碼又不在程序中的函數,這些函數的代碼位於一個或者多個DLL中。當PE文件被裝入內存的時候,Windows裝載器才將DLL 裝入,並將調用導入函數的指令和函數實際所處的地址聯繫起來(動態連接),這操作就需要導入表完成。其中導入地址表就指示函數實際地址。多數加殼軟件在運行時會重建導入地址表,因此獲取加殼程序正確的導入地址表也是手動脫殼操作中的一個關鍵問題。

2 一些脫殼方法

2.1單步跟蹤法

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

2.2 ESP定律法

ESP定律法是脫殼的利器,是應用頻率最高的脫殼方法之一。

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

2.3內存鏡像法(二次斷點法)

內存鏡像法是在加殼程序被加載時,通過OD的ALT+M快捷鍵,進入到程序虛擬內存區段。然後通過加兩次內存一次性斷點,到達程序正確OEP的位置。

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

2.4一步到達OEP

所謂的一步到達OEP的脫殼方法,是根據所脫殼的特徵,尋找其距離OEP最近的一處彙編指令,然後下int3斷點,在程序走到OEP的時候dump程序。如一些壓縮殼往往popad指令距離OEP或者Magic Jump特別近,因此使用Ollydbg的搜索功能,可以搜索殼的特徵彙編代碼,達到一步斷點到達OEP的效果。

2.5最後一次異常法

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

2.6 模擬跟蹤法

模擬跟蹤法的原理就是使用Ollydbg下條件斷點,SFX相當於是一個自解壓段,在自解壓段結束時(eip的值轉到代碼段時),已經距離OEP很近,但是這種跟蹤方法會比較耗時。

2.7 “SFX”法

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

3一些脫殼實踐

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

3.1UPX脫殼筆記

首先進行偵殼:

逆向基礎:軟件手動脫殼技術入門

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

逆向基礎:軟件手動脫殼技術入門

然後這裡嘗試使用ESP定理:即在ESP第一次改變時,對ESP的地址設置硬件字訪問斷點,這樣可以在代碼被UPX算法還原之後,跳轉到程序的正常入口處。

逆向基礎:軟件手動脫殼技術入門

然後F5運行,並沒有直接到跳轉到程序入口處的大跳位置,但是可以看到UPX的大跳就在眼前:

逆向基礎:軟件手動脫殼技術入門

所以被還原後的程序入口點就是0x00445151(通過單步往下走,F4略過往回走的循環語句,也可以看到這個大跳的位置。)接下來走到大跳位置,跳到正常程序入口處:

逆向基礎:軟件手動脫殼技術入門

然後去掉硬件斷點,並使用LoadPE的dump功能dump目標程序:

逆向基礎:軟件手動脫殼技術入門

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

逆向基礎:軟件手動脫殼技術入門

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

逆向基礎:軟件手動脫殼技術入門

然後點擊獲取輸入表得到修正IAT之後的程序函數輸入表,然後再點擊顯示無效函數,愉快地發現沒有無效函數,那麼就可以直接修復轉存文件了。

逆向基礎:軟件手動脫殼技術入門

選擇剛剛第一步dump下來的轉儲文件進行修復,修復完成之後脫殼完成:

逆向基礎:軟件手動脫殼技術入門

這裡對於壓縮殼UPX,直接使用了ESP定律,可以很方便找到OEP並dump程序。

4.2 tElock脫殼筆記

這裡脫的是一個tElock的殼:

逆向基礎:軟件手動脫殼技術入門

1、先使用最簡單的最後一次異常法:首先把程序扔到OllyIce裡面設置OD調試選項中的異常選項,

逆向基礎:軟件手動脫殼技術入門

僅保留內存非法訪問異常,然後使用異常計數器插件,在使用前要清空斷點設置:

逆向基礎:軟件手動脫殼技術入門

等到程序正常運行後,重新加載程序,再選擇第二步,停在最後一次異常之前:

逆向基礎:軟件手動脫殼技術入門

然後用Alt+M轉到內存窗口,對主程序code段下內存斷點,SHIFT+F9執行:

逆向基礎:軟件手動脫殼技術入門

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

逆向基礎:軟件手動脫殼技術入門

再點擊Fix dump,可以修復之前dump下來的程序,脫殼完成:

逆向基礎:軟件手動脫殼技術入門

2、使用二次內存斷點法:首先載入程序,將所有的異常類型忽略,然後在idata段設置內存斷點, 然後SHIFT+F9:

逆向基礎:軟件手動脫殼技術入門

停下來後再次在code段設置內存斷點,再次SHIFT+F9執行,可以直接達到正確的OEP中:

逆向基礎:軟件手動脫殼技術入門

然後LoadPE dump,然後修復IAT。修復方法同方法1。

3、尋找magic jump以及修複函數表完成後dump程序:前兩步還是加內存斷點(idata、code),然後定位到程序的正確OEP處

逆向基礎:軟件手動脫殼技術入門

然後如果這時使用LoadPE dump後修復,就和前兩種一樣了。這裡先是使用ImportREC獲取函數輸入表第一個位置的指針地址。

逆向基礎:軟件手動脫殼技術入門

然後得到函數指針偏移地址在0x005512C,加上基地址後為0x045512C,這時在該位置下硬件訪問雙字斷點。再重新SHIFT+F9忽略異常執行後,由於下了斷點,會觸發tElock的CRC校驗錯誤:

逆向基礎:軟件手動脫殼技術入門

所以這裡要先繞過CRC校驗,才能成功執行到硬件斷點位置,所以首先暫停程序,然後使用Alt+F9返回用戶代碼。點擊確定按鈕後,程序暫停在調用ExitProcess的位置:

逆向基礎:軟件手動脫殼技術入門

現在要向上找一找能跳過這個退出的跳轉(CRC判斷跳轉),然後進行修改並跳過:

逆向基礎:軟件手動脫殼技術入門

找到了應該修改的位置,但是如果修改之後重新運行是會被恢復的,所以先記下來這個跳轉的地址,0x00469622。重新運行之後,在idata斷設置內存斷點,SHIFT+F9停下後,再Ctrl+G找到修改點再修改。修改完之後再設置之前的硬件斷點,這樣不會觸發CRC校驗錯誤了。

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

逆向基礎:軟件手動脫殼技術入門

然後此時F8單步,找magic jump……看小生大大的視屏是通過分析疑似CRC跳轉得到magic jump的位置:

逆向基礎:軟件手動脫殼技術入門

這裡記下來magic jump的地址是0x0046973B,然後清空udd文件,刪除硬件斷點,再次重新運行程序,然後在idata下內存斷點停住,然後Ctrl+G找到magic jump位置處,修改跳轉:

逆向基礎:軟件手動脫殼技術入門

然後在code段下內存斷點:

逆向基礎:軟件手動脫殼技術入門

然後SHIFT+F9執行,停下來就到了OEP的位置:

逆向基礎:軟件手動脫殼技術入門

這時候再dump程序,IAT表已經被修復,可以直接獲得脫殼版程序:

逆向基礎:軟件手動脫殼技術入門

這裡嘗試使用了另外兩種脫殼方法,並且通過預先找OEP的方式,修復了CRC校驗後,直接dump到了IAT被修復了的程序。

3.3 PEncrypt脫殼筆記

逆向基礎:軟件手動脫殼技術入門

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

逆向基礎:軟件手動脫殼技術入門

好吧,重新加載程序,嘗試使用最後一次異常法,不忽略所有異常,然後使用異常計數器插件,程序停在最後一次異常處:

逆向基礎:軟件手動脫殼技術入門

如果此時F8單步下去,程序會觸發異常處理,然後又到不了OEP了。這時需要看一下堆棧數據情況:

逆向基礎:軟件手動脫殼技術入門

這時需要在0040CCD7處F2下斷點,然後SHIFT+F9執行,可以跳過這個坑:

逆向基礎:軟件手動脫殼技術入門

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

逆向基礎:軟件手動脫殼技術入門

用LoadPE脫殼,然後用ImportREC修復後,雖然沒有無效指針,但是還是不能運行:

逆向基礎:軟件手動脫殼技術入門

這時候用LoadPE的重建PE功能:

逆向基礎:軟件手動脫殼技術入門
逆向基礎:軟件手動脫殼技術入門

然後就可以正常運行了:

逆向基礎:軟件手動脫殼技術入門

這個殼使用了單步跟蹤的脫殼方法,一路跳過程序“陷阱”,最後達到OEP。並且使用了LoadPE的重建PE功能,對程序進行了重建,最終完成了這個加密殼的脫殼全過程。

3.4 FSG變形殼脫殼筆記

首先進行偵殼:

逆向基礎:軟件手動脫殼技術入門

使用ESP定律,首先把程序扔到OllyIce裡面,F8單步走,觀察ESP變化,在ESP第一次發生變化時,對ESP對應的地址處設置內存硬件訪問WORD斷點,然後SHIFT+F9運行,在程序停下來之後,取消硬件斷點,進行F8單步:

逆向基礎:軟件手動脫殼技術入門

用F4略過向後的跳轉(循環),然後繼續往下找,一直到這裡:

逆向基礎:軟件手動脫殼技術入門

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

逆向基礎:軟件手動脫殼技術入門

如果是FSG1.33,直接使用LoadPE dump文件,然後使用ImportREC修復,就可以正常脫殼了。但是這裡在使用ImportREC修復時,會出現一個無效指針:

逆向基礎:軟件手動脫殼技術入門

這裡直接剪掉(或者刪掉)這個指針,然後修復轉存文件,發現無法正常打開:

![在這裡插入圖片描述](https://img-blog.csdnimg.cn/6b2cb9beb0804eb4a47bcb665cebf62f.png?x-oss- process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5Luj56CB54as5aSc5pWy,size_12,color_FFFFFF,t_70,g_se,x_16)

然後再把修復後的程序,丟到OllyIce中F9直接運行:

逆向基礎:軟件手動脫殼技術入門

這裡是變形殼添加的一個暗樁,會導致程序出現異常退出,這裡直接nop掉或者把之前的jle(校驗)改成jmp,然後保存修改另存文件。然後就可以運行了

原創文章,作者:投稿專員,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/250445.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
投稿專員的頭像投稿專員
上一篇 2024-12-13 13:32
下一篇 2024-12-13 13:32

相關推薦

發表回復

登錄後才能評論