手脫UPX殼的幾種方法
阿新 • • 發佈:2019-02-18
最近在研究各個殼的脫殼方法,有些心得,和大家分享一下如何手脫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執行
出現如下圖所示