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

其特點是加殼後除了資源的節,其他節區都不見了,轉換成了UPX0和UPX1兩個節區。并且UPX0節的磁盤檔案大小變成了0。
實際上,UPX壓縮器将這些節區壓縮後放置于UPX1中,并且将壓縮和解壓代碼也放到裡面去。一旦該程式被加載運作,位于UPX1節的解壓縮代碼會釋放原資料到UPX0中并且讓PE正常運作。
0X01 硬體斷點快速脫殼
首先利用UPX壓縮器的壓縮解壓過程将其置于PUSHAD和POPAD之間,可以利用硬體斷點進行快速脫殼。
首先看一下EP代碼:
可以直接看到PUSHAD指令,直接執行。轉到堆棧視窗:
找到壓入堆棧的8個通用寄存器後,尋找其中任意一個位置的位址設定硬體斷點。這裡我選了eax即位址為0x000DFF64。在資料視窗追蹤到它的位置并設定硬體斷點。
接下去直接F9運作後,CPU會自動在POPAD指令之後停下。
下面的那條jmp就是跳到OEP的位置。
直接就進入了OEP。
0x02手工脫殼
進入EP後一直單步過不久就會到一個循環,初始ECX是0x36B,其是把ds:[01001000]的内容放入ds:[01001001],很奇怪的是這不是沒有什麼差別嗎?
由于UPX0節區的磁盤大小為0,實際上UPX0與UPX1的位置相重了,是以這段代碼僅僅隻是為了把壓縮好的代碼放回UPX0節區中。
到這裡為止還沒有進入解壓縮的過程,當這個循環結束後又會進入一個更大的循環,并且進入解壓縮。來看一下:
紅色框框圈出來的就是第一次釋放代碼至UPX0的過程而下面那個jmp會跳到程式初始位置并且進入第二次循環,在路過第一次循環時(注意上圖在斷點處)jbe就會直接跳過。
其中經過一系列的算法後完成第二次循環。再過不久就進入了第三輪解壓過程。作用是恢複JMP/CALL的位址
第四輪解壓也是最後一輪再下去就是popad和jmp回OEP的代碼了。
完成這一輪後,一直F8下去就能看到熟悉的那條jmp并跳轉回OEP
(完)