upx 手动脱壳
前言
最近遇到好多UPX
类型的题目,大多都是直接使用upx -d
进行脱壳的,没有真正去理解如何完成脱壳的一个过程。同时也存在一些题目直接使用upx -d
进行脱壳后会出现无法运行的情况,特此写下此文章以供后者学习。
准备部分
我们先准备好upx.exe
文件,同时编写一个简单的程序,利用upx.exe
对其进行加壳,此处采用一个简单的Hello world
来进行练习,代码如下:
1 |
|
我们将其进行编译,之后利用upx
进行加壳,命令为upx [filename]
可以成功看到我们已经加上了一个UPX
壳,拖入PE
查看也可以同样看到UPX
的特征
至此准备工作已经完成,接下来便是尝试手动脱壳
脱壳
我们想要进行手动脱upx
壳不太建议拿ida
进行,可以拿od
或者是xdbg
进行脱壳,此处我们采用xdbg64
脱壳(PE文件提示是64位的程序),将程序直接拖入
可以较为清楚的看到程序就已经进入到调试模式了,接下来我们不断按F8
进行跑程序,在这过程中我们需要注意的是当程序有往上跳转的趋势的时候我们需要在下一条语句处点击一下再按F4
进行跳过,之后我们会遇到EntryPoint
对于 64 位程序来说没有像 32 位程序的
POPAD
指令能对所有寄存器进行压栈保存处理,英雌是依次进行push
入栈来进行保存
找到EntryPoint
后我们将ESP
进行设置硬件断点
在设置完后我们按F9
进行运行同时观察程序跳转的位置
找到OEP
之后我们按F8
进行跳转进入,之后便可以进行dump
内存来进行脱壳操作
如果中间出现了红叉(×),可以右键删除,参考下方
IAT
处修复的图
处理完毕后我们可以得到一个exe
文件,此时我们再拖入PE
进行查看壳
可以成功看到我们已经将壳进行去除了,但是如果我们将程序运行一下,却会发现如下情况:
此时我们需要修复对应的IAT
才能成功的运行程序
IAT修复
我们再次调试到OEP
,采用和之前dump
一样的方式,此时我们选择下面的fix dump
对IAT
表进行修复
同时如果修复完成后出现如下错误,注意关闭一下杀毒软件如:360(罪魁祸首)
之后程序就可以运行起来啦,至此脱壳也就结束了