脫殼第三講,UPX壓縮殼,以及補充殼知識


           脫殼第三講,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內存和上面一樣,不說了.

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM