脫殼第三講,UPX壓縮殼,以及補充殼知識
一丶什么是壓縮殼.以及殼的原理
在理解什么是壓縮殼的時候,我們先了解一下什么是殼
1.什么是殼
殼可以簡單理解為就是在自己的PE文件中包含了代碼.而有不影響我們的PE文件的執行.
2.什么是壓縮殼
壓縮殼指的是讓我們的PE文件變小.
3.壓縮殼原理
首先可以看到,我們的PE文件
一個PE頭,兩個節數據,其中節和節之間還有對齊值.而上圖是我們的一個正常殼映射到內存中的示意圖.
4.壓縮殼的思路
從上圖可以看出, 我們的PE文件,壓縮一下變成了一個新的PE文件,其中我們的PE文件,壓縮的數據是節里面的數據
也就是說,壓縮殼的原理就是壓縮PE文件中節的數據.然后產生新的PE,這個新的PE我們成為帶殼的PE
而我們運行帶殼PE的時候,這時候殼中的解壓縮代碼開始執行,從而把我們以前壓縮數據的節重新映射到內存.
5.壓縮殼方法1(PE的生成)
此時觀察方法1我們會發現,我們新的PE, 解壓縮的代碼在壓縮數據(節)的上面,那么這個時候則會面臨一個問題
如果我們解壓縮的時候,那么壓縮數據的地址應該在我們解壓縮代碼的哪里,那么此時我們一邊解壓縮,一邊壓縮數據會覆蓋解壓縮代碼,此時我們不知道是先解壓完成,還是先覆蓋完成
解決方法:
首先我們知道原PE的節的個數以及大小,那么此時我們生成的新的帶殼PE,則會獲得大小.然后在其帶殼PE的下面申請怎么大小的節用來占位置即可.
那么此時我們解壓的數據,則會寫到我們占位置的地方.
如果不懂可以看下圖理解
此時Shell(中文翻譯為殼)代表的就是解壓縮的代碼
這個圖是映射到內存中的帶殼PE分布圖.
很簡單,解壓縮代碼執行,然后解壓的代碼正好在我們占地方的位置.
二丶脫殼步驟,以及手脫UPX殼
首先我們知道壓縮殼了,壓縮殼就是縮小PE文件
那么在殼的世界 還有加密殼. 原理是一樣的,只不過
壓縮殼: 用來壓縮數據,減小PE體積
加密殼:用來防住你們我們他們等等逆向人員的 ^_^
1.脫殼步驟:
1.查找OEP(入口點 )
方法: 經驗,這個主要看經驗
不過這個經驗也好分辨.
2.脫殼手法
2.1 ESP 定律
2.2 API
2.3 單步跟蹤(步過循環,只向下跳轉)
3. 經過上面步驟開始脫殼
手工DMP內存(把內存拷貝下來)
然后修復PE (一般加密殼匯編PE中的導入表給抹掉)
首先ESP定律,在殼的第一講已經講解過了
這里我們說下怎么查看入口點,以及脫殼手法的API 跟蹤,和單步跟蹤.
2.識別入口點
如果要識別入口點,這里只簡單說下,因為比如 VC++6.0 VSXXX VB...等等入口點都是不一樣的
這里直說一下VC和VS入口點的識別方法.
首先隨便打開一個沒有加殼的程序(VC++6.0的)OD打開查看.
1.VC6.0的識別
往下拖動一下
可以看出,VC6.0的入口點會固定的調用這三個API
只需要記住即可.看下VS的識別方法
2.VS系列識別方法
不知道還是電腦原因還是編譯器原因,編譯的程序不能在XP下使用OD打開,所以只能用IDA說下了
如果OD能打開,那么則是一個Call 然后下方緊接着跟着一個JMP跳轉
那么它的入口點特征則是調用以上的API
3.使用API定位脫殼
因為ESP定律已經說過了,這里使用API進行脫殼.
思路:
因為我們知道入口點的特征,比如VC6.0的,它會調用API,那么我們API下段點即可.肯定會過去的.
首先我們脫一個VC6.0的upx壓縮殼.
首先我們知道入口點會調用的API
那么我們下斷點即可.
(注意,這里使用UPX隨便壓縮了一個VC的程序,UPX可以官網下載,VC程序也可以自己編寫一個)
F9以下,看看能不能斷下來.
斷下來了,只不過是斷在里面了,然后我們執行到返回 CTRL + F9 即可看到我們的熟悉的特征
確實使我們的入口點位置
那么此時移動匯編代碼到入口點,也就是一開始的地方,(因為此時程序已經執行的API可能數據已經破壞了,所以我們在入口點位置下段點,重新運行則可以斷在入口點)
此時重新運行程序,當我們的EIP 位置是4014EC的地方我們則可以DMP內存了.
保存一份即可.
3.使用單步方法定位入口點.
這個就比較簡單了,我們遇到循環,不看直接往下單步走,直到走到一個遠跳即可.
比如我模擬一下OD
地址: 匯編代碼
1 add eax,eax
2 mov eax,eax
3 jnz 1 EIP = 3
4 mov edx,edx
5 jmp 00401000
此時EIP = 3,那么會跳轉到1,那么這個時候我們在4地址下段點即可,不看它的循環,一直到5地址,有個遠跳,即可.
關於DMP內存和上面一樣,不說了.