PE檔案格式詳細解析(四)-- 執行時壓縮及UPX壓縮除錯

有毒發表於2020-03-08

PE檔案格式詳細解析(四)-- 執行時壓縮及UPX壓縮除錯

一、資料壓縮

  1. 無失真壓縮(Lossless Data Compression):經過壓縮的檔案能百分百恢復

    使用經過壓縮的檔案之前,需要點對檔案進行解壓縮(此過程需要保證資料完整性),常見的ZIP、RAR等是具有嗲表性的壓縮檔案格式,使用的壓縮演算法通常為Run-Length、Lepel-ZIV、Huffman等。

  2. 有失真壓縮(Loss Data Compression):經過壓縮的檔案不能恢復原狀

    允許壓縮檔案(資料)時損失一定資訊,以此換取高壓縮率,多媒體檔案多采用有失真壓縮方式,但不會影響人的視覺、聽覺體驗。

二、執行時壓縮器

​ 針對可執行檔案,檔案內部含有解壓縮程式碼,檔案在執行瞬間於記憶體中解壓縮後執行。

  1. 壓縮器(Packer):將普通PE檔案建立成執行時壓縮檔案的應用程式
    • 目的:縮減PE檔案大小;隱藏PE檔案內部程式碼與資源
    • 種類:目的純粹(UPX、ASPack等)、目的不純粹(UPack、PESpin、NSAnti等)
  2. 保護器(Protector):經反逆向技術特別處理的壓縮器
    • 目的:防止破解,隱藏OEP(Original Entry Point);保護程式碼與資源
    • 種類:商用(ASProtect、Themida、SVKP等)、公用(UltraProtect、Morphine等)

三、執行時壓縮測試(notepad.exe)

​ 書上使用的是XP SP3的notepad.exe,此處使用的是win7 x64下的notepad.exe ,因此部分資料會產生不同。

### 1. 壓縮notepad.exe 
  1. 下載UPX,地址http://upx.sourceforge.net,進行解壓,並將notepad.exe拷貝到同級目錄下

  2. 進行壓縮:upx.exe -o notepad_upx.exe notepad.exe

    第一個引數為輸出的檔名,第二個引數為待壓縮檔名(如果不在同級目錄下,需要使用絕對路徑)。

    壓縮結果如下:

    upx1

    可以看到在檔案大小上存在明顯的尺寸減小(193536->151552)。這個壓縮率比ZIP壓縮要低一些,主要是因為PE檔案壓縮後要新增PE頭,還要新增解壓縮程式碼。

2. 比較notepad.exe與 notepad_upx.exe

  1. 下圖(以書上版本為例)從PE檔案視角比較2個檔案,可以反映出UPX壓縮器的特點:

upx2

  1. 細節比較:

    • PE頭大小一致(0~400h)
    • 節區名發生變化(紅框)
    • 第一個節區的RawDataSize = 0(檔案中的大小為0)
    • EP文娛第二個節區,壓縮前位於第一個節區
    • 資源節區(.rsrc)大小几乎無變化
  2. 探討UPX建立的空白節區,也就是RawDataSize=0的節區。使用PEView檢視(此處為本機使用的notepad_upx.exe與書上不同):

    upx3

檢視第一個節區的相關資料,VirtualSize的大小為2C000,但是SizeOfRawData的大小為0。UPX為什麼要建立一個這麼大的空白節區呢?

 

原理是:經過UPX壓縮的PE檔案在執行時將首先將檔案中的壓縮程式碼解壓到記憶體中的第一個節區,也就是說,解壓縮程式碼與壓縮程式碼的原始碼都在第二個節區中,檔案執行時首先執行解壓縮程式碼,把處於壓縮狀態的原始碼解壓到第一個節區中,解壓過程結束後即執行原始檔的EP程式碼

四、總結

這裡開始初步進入除錯階段,需要好好掌握前面的知識,方便後續除錯。下一節將開始od的動態除錯。

相關文章