upx 脫殼的簡單記錄

UPX是一種免費,可移植,可擴展,高性能的可執行文件打包程序,適用於多種可執行格式。

官網地址:https://upx.github.io/

殼的分類

部分內容參考至《加密與解密》第四版(脫殼篇)

1 壓縮殼UPX、ASPack

壓縮殼的特點是減小軟件體積大小,主要目的起對軟件的壓縮,加密保護不是重點。

2 加密殼ASProtect、armadillo(穿山甲)、EXECryptor、Themida

3 虛擬機保護軟件VMProtect

脫殼

以UPX這款經典的壓縮殼進行實踐,首先需要了解一些殼的共性。

殼的加載過程

1 保存入口參數

2 獲取可本身需要使用的API地址

3 解密源程序各個區塊的數據

4 IAT的初始化

5 重定位項的處理

6 HOOK API

7 跳轉到程序原入口點(OEP)

脫殼的方式

脫殼機脫殼

手動脫殼

下面記錄一下手動脫殼需要的步驟

第一步尋找OEP,也就是真正的程序入口點。

1 根據跨段指令尋找OEP(也稱爲單步執行法)

書中給出的例子是一個加殼後的程序,只是在原來程序的區塊基礎上增加了一個新的區塊,實際接觸UPX加殼後的程序遇到的情況是隻有殼的區塊UPX0、UPX1與.rsrc,不好使用跨段指令判斷是否跳轉到OEP。

2 用內存訪問斷點尋找OEP(兩次內存斷點法)

內存訪問斷點是什麼?

內存斷點的實現方式是將你欲下斷地址所在的內存頁增加一個名爲PAGE_NOACCESS的屬性,這個屬性會把當前內存頁設爲禁止任何形式的訪問,如果進行訪問會觸發一個內存訪問異常。在這同時,OD開始捕獲目標程序中出現的這個異常,並判斷觸發這個異常的位置是否跟你下斷的地址相同,如果相同則內存斷點觸發,暫停被調試程序的運行,否則放行。

補充:

1.內存斷點很消耗資源,因爲PAGE_NOACCESS屬性一設置就是一整個內存頁無法訪問,那麼當程序訪問該內存頁中非斷點地址的內容同樣會觸發異常,這時OD收到異常後需要進行特殊處理,臨時放行,非常消耗資源,甚至這使得內存斷點在調試很多大型程序時慢到近乎不可用。

2.雖然內存斷點的效率經常很不理想,但是因爲僅僅是修改了一個內存屬性,所以內存斷點可以下數量非常多、單斷點範圍非常大。這是它的優勢。

3.只在寫入時斷下的內存斷點通常是將內存屬性設爲PAGE_EXECUTE_READ,也就是不可寫來實現的。對這種屬性的內存進行寫操作將會觸發異常。

既然解殼的過程中會對某些內存區塊進行訪問,我們就可以在這些區塊下內存訪問斷點,減少單補執行法的步驟。

ollydbg中打開內存模塊,快捷鍵 Alt+M,也可以直接點擊工具欄m字符按鈕。

找到需要的內存區塊後按下F2設置內存訪問斷點,此時設置的內存訪問斷點是一次性的,中斷髮生了會立即刪除此斷點。

上面設置的內存斷點有一定的技巧,如果前期能確定代碼段的位置,那麼就得在殼對代碼段數據解壓完畢後,再設置內存斷點,不然在前期運行過程中殼會多次去訪問代碼段,造成多次中斷。所以可以先在非代碼段等區塊設置內存訪問斷點。待解壓完畢後,再在代碼段設置內存訪問斷點。

實際對UPX進行脫殼時,只有三個段。無法確定程序代碼處於哪個段內。也可以先找到程序段的第一個.rsrc,設下斷點後F9執行。
在這裏插入圖片描述
再在內存段中的0x00401000處設下斷點,再執行。
在這裏插入圖片描述
第二次中斷完成後,單步執行法往下走就能看到popad指令,後面還有jmp指令,而jmp後接的地址與當前的VA(虛擬地址)相差很大,也能根據跨段指令判定此處爲OEP地址。
在這裏插入圖片描述
完整流程如下:

使用最新的upx壓縮,ollydbg打開後如圖:
在這裏插入圖片描述
Alt+M打開內存窗口,在數據,輸入表下斷(F2)
在這裏插入圖片描述
直接F9運行,Alt+M打開內存窗口,在代碼段下斷(F2)這裏代碼段是00401000。
在這裏插入圖片描述
繼續F9跑起來,中斷在這裏。
在這裏插入圖片描述
雖然沒到我們想要的OEP,但是注意到popad沒?在popad下面的jmp upx.00401071下斷,重新載入程序,F9運行
到了這裏。
在這裏插入圖片描述
單步F8,直接到達OPE。
在這裏插入圖片描述
需要注意的地方:

在使用二次內存斷點法脫殼時,先選擇了.rsrc段下了斷點,接着運行後中斷了,接着選擇UPX0下斷點,但是F9運行後斷下來,
上下翻動彙編指令沒有發現任何popad指令,說明在UPX0下斷沒有起效果,只能使用UPX1下斷點,最後使用UPX1下斷點後
獲取了先前的效果,找到了popad指令。

3 棧平衡尋找OEP(ESP定律法)

利用壓縮前後ESP不變的定律,脫殼時單步執行pushad後,對ESP寄存器設硬件斷點,接着F9運行後就會中斷下來,不遠處就會發現popad,
也就能找到OEP了。
在這裏插入圖片描述
右鍵選擇【數據窗口中跟隨】
在這裏插入圖片描述
在數據窗口中設置硬件斷點
在這裏插入圖片描述
然後F9執行後,會中斷下來,不遠處就會發現popad。

來到OEP處,右鍵選擇OllyDump脫殼調試進程,獲取EIP作爲OEP,之後dump即可。
在這裏插入圖片描述
在這裏插入圖片描述
此處如果在64位系統下進行脫殼可能會出現問題,脫殼環境請選擇32位系統環境。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章