最近在研究各个壳的脱壳方法,有些心得,和大家分享一下如何手脱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
我们一路向下运行,发现出现了如下的代码![](https://img-blog.csdn.net/20160520180340343)
两个向上的跳转,下面为NOP语句,我的处理办法是在NOP下一行代码 下F4,因为NOP为空,没有数据。同样的方法我们继续F8单步运行。
当然了,程序中有许多类似的向上跳转,我就不一一叙述,当F8单步运行到一段时间后,你可能就会遇见这样的情况![](https://img-blog.csdn.net/20160520181357206)
重点说明一下:
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运行,直接来到这里![](https://img-blog.csdn.net/20160520182838536)
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的壳目前这几种最好用,欢迎大家来探讨