天天看點

[脫殼]手脫UPX殼0x00 簡介0X01 硬體斷點快速脫殼0x02手工脫殼

0x00 簡介

UPX殼是一種壓縮器。經其加殼後的程式的PE結構如下:

[脫殼]手脫UPX殼0x00 簡介0X01 硬體斷點快速脫殼0x02手工脫殼

其特點是加殼後除了資源的節,其他節區都不見了,轉換成了UPX0和UPX1兩個節區。并且UPX0節的磁盤檔案大小變成了0。

實際上,UPX壓縮器将這些節區壓縮後放置于UPX1中,并且将壓縮和解壓代碼也放到裡面去。一旦該程式被加載運作,位于UPX1節的解壓縮代碼會釋放原資料到UPX0中并且讓PE正常運作。

0X01 硬體斷點快速脫殼

首先利用UPX壓縮器的壓縮解壓過程将其置于PUSHAD和POPAD之間,可以利用硬體斷點進行快速脫殼。

首先看一下EP代碼:

[脫殼]手脫UPX殼0x00 簡介0X01 硬體斷點快速脫殼0x02手工脫殼

可以直接看到PUSHAD指令,直接執行。轉到堆棧視窗:

[脫殼]手脫UPX殼0x00 簡介0X01 硬體斷點快速脫殼0x02手工脫殼

找到壓入堆棧的8個通用寄存器後,尋找其中任意一個位置的位址設定硬體斷點。這裡我選了eax即位址為0x000DFF64。在資料視窗追蹤到它的位置并設定硬體斷點。

[脫殼]手脫UPX殼0x00 簡介0X01 硬體斷點快速脫殼0x02手工脫殼

接下去直接F9運作後,CPU會自動在POPAD指令之後停下。

[脫殼]手脫UPX殼0x00 簡介0X01 硬體斷點快速脫殼0x02手工脫殼

下面的那條jmp就是跳到OEP的位置。

[脫殼]手脫UPX殼0x00 簡介0X01 硬體斷點快速脫殼0x02手工脫殼

直接就進入了OEP。

0x02手工脫殼

進入EP後一直單步過不久就會到一個循環,初始ECX是0x36B,其是把ds:[01001000]的内容放入ds:[01001001],很奇怪的是這不是沒有什麼差別嗎?

[脫殼]手脫UPX殼0x00 簡介0X01 硬體斷點快速脫殼0x02手工脫殼

由于UPX0節區的磁盤大小為0,實際上UPX0與UPX1的位置相重了,是以這段代碼僅僅隻是為了把壓縮好的代碼放回UPX0節區中。

[脫殼]手脫UPX殼0x00 簡介0X01 硬體斷點快速脫殼0x02手工脫殼

到這裡為止還沒有進入解壓縮的過程,當這個循環結束後又會進入一個更大的循環,并且進入解壓縮。來看一下:

[脫殼]手脫UPX殼0x00 簡介0X01 硬體斷點快速脫殼0x02手工脫殼

紅色框框圈出來的就是第一次釋放代碼至UPX0的過程而下面那個jmp會跳到程式初始位置并且進入第二次循環,在路過第一次循環時(注意上圖在斷點處)jbe就會直接跳過。

[脫殼]手脫UPX殼0x00 簡介0X01 硬體斷點快速脫殼0x02手工脫殼

其中經過一系列的算法後完成第二次循環。再過不久就進入了第三輪解壓過程。作用是恢複JMP/CALL的位址

[脫殼]手脫UPX殼0x00 簡介0X01 硬體斷點快速脫殼0x02手工脫殼

第四輪解壓也是最後一輪再下去就是popad和jmp回OEP的代碼了。

[脫殼]手脫UPX殼0x00 簡介0X01 硬體斷點快速脫殼0x02手工脫殼

完成這一輪後,一直F8下去就能看到熟悉的那條jmp并跳轉回OEP

[脫殼]手脫UPX殼0x00 簡介0X01 硬體斷點快速脫殼0x02手工脫殼

(完)

繼續閱讀