手脱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的壳目前这几种最好用,欢迎大家来探讨


















  • 5
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值