1. 程式人生 > >手脫UPX殼的幾種方法

手脫UPX殼的幾種方法

最近在研究各個殼的脫殼方法,有些心得,和大家分享一下如何手脫UPX的殼

我們的流程是 PEID查殼

得知殼的形式為 UPX 0.89.6 - 1.02/ 1.05 - 2.90 -> Markus & Laszlo

OD載入,提示為“壓縮程式碼是否繼續分析”,我們選擇否

方法一:單步跟蹤法

程式停在如下圖的地方

F8單步向下執行,注意向上的跳轉

遇到向上的箭頭我們就在下一行 F4(執行到此處),注意,紅色代表跳轉實現,灰色代表沒有實現,我們的目的就是不讓他實現,灰色的我們就不用管,具體的說明一下:

0040E8D6    90              nop

0040E8D7    90              nop

0040E8D8    8A06            mov al,byte ptr ds:[esi]

0040E8DA    46              inc esi

0040E8DB    8807            mov byte ptr ds:[edi],al

0040E8DD    47              inc edi

0040E8DE    01DB            add ebx,ebx

0040E8E0    75 07           jnz short UPX.0040E8E9

0040E8E2    8B1E            mov ebx,dword ptr ds:[esi]

0040E8E4    83EE FC         sub esi,-0x4

0040E8E7    11DB            adc ebx,ebx

0040E8E9  ^ 72 ED           jb short UPX.0040E8D8                   //這裡要往回跳,跳到0040E8D8處

0040E8EB    B8 01000000     mov eax,0x1                               //F4,繼續F8

0040E8F0    01DB            add ebx,ebx

0040E8F2    75 07           jnz short UPX.0040E8FB

我們一路向下執行,發現出現瞭如下的程式碼

兩個向上的跳轉,下面為NOP語句,我的處理辦法是在NOP下一行程式碼 下F4,因為NOP為空,沒有資料。同樣的方法我們繼續F8單步執行。

當然了,程式中有許多類似的向上跳轉,我就不一一敘述,當F8單步執行到一段時間後,你可能就會遇見這樣的情況

重點說明一下:

0040E9F4     F2:AE         repne scas byte ptr es:[edi]
0040E9F6     55            push ebp
0040E9F7     FF96 A4EC0000 call dword ptr ds:[esi+ECA4]
0040E9FD     09C0          or eax,eax
0040E9FF     74 07         je short NOTEPAD.0040EA08
0040EA01     8903          mov dword ptr ds:[ebx],eax
0040EA03     83C3 04       add ebx,4
0040EA06   ^ EB E1         jmp short NOTEPAD.0040E9E9                         //要往回跳了
0040EA08     FF96 A8EC0000 call dword ptr ds:[esi+ECA8]                //關於這個call,不同的程式不一樣,我的跑飛了,再次執行時我直接跳過了
0040EA0E     61            popad                                                                    //這裡F4,繼續F8
0040EA0F   - E9 B826FFFF   jmp NOTEPAD.004010CC                           //在這裡直接跳到了OEP

在脫殼的時候。我們要注意popad這個指令,它的出現標誌著我們的程式可能到達OEP

我們到達OEP了,然後使用OD自帶的脫殼工具進行脫殼

方法二:ESP定律手動脫殼

F8單步執行,發現右邊的暫存器ESP處變紅,說明此處可以進行ESP定律

dd 0012FFA4回車, 斷點--硬體訪問--WORD,F9執行,直接來到這裡


0040EA0F   - E9 B826FFFF   jmp NOTEPAD.004010CC                     //來到這 單步就到了OEP

脫殼步驟和上面一樣

方法三:記憶體映象法

ALT+M開啟記憶體
找到.rsrc,F2下斷,F9執行

ALT+M開啟記憶體

找到UPX0,F2下斷,F9執行

出現如下圖所示

說明一下:

0040EA01     8903          mov dword ptr ds:[ebx],eax                    //來到這,F8繼續

0040EA03     83C3 04       add ebx,4

0040EA06   ^ EB E1         jmp short NOTEPAD.0040E9E9

0040EA08     FF96 A8EC0000 call dword ptr ds:[esi+ECA8]

0040EA0E     61            popad                                                        //即將到達oep

0040EA0F   - E9 B826FFFF   jmp NOTEPAD.004010CC

最後一種辦法:    秒到oep法

直接CTRL+F,輸入popad

0040EA0E     61            popad                                                //F2下斷,F9執行,F2取消斷點,單步F8
0040EA0F   - E9 B826FFFF    jmp NOTEPAD.004010CC

單步向下,最後到達了OEP

最後特別的提醒一下,我們發現jmp是一個很大的跳轉,遇到大的跳轉我們就要留意

可能不只這幾個方法,常用的脫殼方法共計大概7種左右,只是針對UPX的殼目前這幾種最好用,歡迎大家來探討