upx手動脫殼

youngseaz發表於2020-10-26

工具

  • upx:upx是一個開源的壓縮殼工具,可以到github下載upx
  • Study_PE工具,可以到看雪論壇下載

upx簡單的用法

upx src.exe命令將src.exe加殼
upx src.exe -o dst.exe命令將src.exe加殼並另存為dst.exe

upx手動脫殼

脫殼原理

平衡堆疊法(又稱ESP定律,技巧法)

一般加殼程式在執行時,會先執行殼程式碼,然後在記憶體中恢復還原原程式,再跳轉回原始OEP,執行原程式的程式碼,我們可以把殼程式碼理解為一個大的函式,既然是函式,那麼進入函式和退出函式時,堆疊應該就是平衡的,基於這樣的一種特性,我們可以在殼程式碼操作了堆疊之後,對堆疊設定訪問斷點,然後讓程式跑起來,當程式暫停的時候,就是殼程式碼即將執行完的時候,然後在其附近單步跟蹤,就可以找到原始OEP了。這種方法比較適用於upx這種只對程式碼和資料壓縮了的殼,如果還對程式碼加密了,那麼就不是太好找了。加密的話就需要結合單步跟蹤法。

開始實驗

首先寫一個demo程式,用upx加殼,操作如下:
在這裡插入圖片描述
沒有加殼之前,程式的入口地址為:``ImageBase + AddressOfEntryPoint = 0x004014C0```
在這裡插入圖片描述
OD載入之後也可以看到程式載入記憶體之後的入口地址:
在這裡插入圖片描述

節區如下,一共有7個節區
在這裡插入圖片描述

加殼之後

入口地址發生了變化
在這裡插入圖片描述

節區的變化,之前有7個節區,現在只有3個節區
在這裡插入圖片描述
通過Study_PE也檢測出了殼程式位UPX
在這裡插入圖片描述

加殼程式分析

使用OD載入程式,可以看到OD也提示程式已經被加密或者壓縮,殼程式正是對原有程式做壓縮或者加密,以達到保護程式,減少程式大小的目的。
在這裡插入圖片描述

OD載入程式之後,可以看到第一條指令為pushad指令。對於殼程式,先pushad,首先將EAX, ECX, EDX, EBX, ESP, EBP, ESI, and EDI暫存器的值壓棧,它的作用的儲存暫存器的狀態,執行殼程式解壓(解密)原程式,最後popad恢復暫存器狀態,跳到OEP執行原程式

在這裡插入圖片描述
執行pushad指令之後,在ESP記憶體下硬體訪問斷點,再次訪問到ESP的時候說明殼程式執行結束。按下F9,執行到斷點處。

在這裡插入圖片描述
可以看到上一條指令是popad,執行與pushad相反的操作,恢復暫存器狀態。

在這裡插入圖片描述
在不遠處看到一個大的跳轉,jmp demo_upx.004014C0,這裡是跳到程式的OEP。

實際上在分析時,我們是先單步到jmp跳轉到的程式碼進行觀察之後得出是否是原始OEP的結論的,這個部分需要我們對未加殼程式的OEP要有所瞭解,比如VC6.0的程式一般OEP最開始的一個API呼叫是GetVersion,看OEP見到GetVersion就如見到了vc6.0程式。

我們單步到跳轉之後的程式碼處,0x004014C0這個地方就是原始OEP,而後我們要做的就是在這個地方進行dump。

在這裡插入圖片描述
在這裡插入圖片描述

至此,我們已經將upx殼脫掉,並將脫殼的程式命名為dump.exe。但是脫殼之後的程式是無法執行的,這時需要修復匯入地址表IAT。

IAT修復

pass…

參考

https://zhuanlan.zhihu.com/p/34263050

相關文章