upx 手动脱壳

前言

最近遇到好多UPX类型的题目,大多都是直接使用upx -d进行脱壳的,没有真正去理解如何完成脱壳的一个过程。同时也存在一些题目直接使用upx -d进行脱壳后会出现无法运行的情况,特此写下此文章以供后者学习。

准备部分

我们先准备好upx.exe文件,同时编写一个简单的程序,利用upx.exe对其进行加壳,此处采用一个简单的Hello world来进行练习,代码如下:

1
2
3
4
5
6
#include<iostream>
using namespace std;
int main(){
cout<<"Hello world";
return 0;
}

我们将其进行编译,之后利用upx进行加壳,命令为upx [filename]

可以成功看到我们已经加上了一个UPX壳,拖入PE查看也可以同样看到UPX的特征

至此准备工作已经完成,接下来便是尝试手动脱壳

脱壳

我们想要进行手动脱upx壳不太建议拿ida进行,可以拿od或者是xdbg进行脱壳,此处我们采用xdbg64脱壳(PE文件提示是64位的程序),将程序直接拖入

3.png

可以较为清楚的看到程序就已经进入到调试模式了,接下来我们不断按F8进行跑程序,在这过程中我们需要注意的是当程序有往上跳转的趋势的时候我们需要在下一条语句处点击一下再按F4进行跳过,之后我们会遇到EntryPoint

4.png

对于 64 位程序来说没有像 32 位程序的POPAD指令能对所有寄存器进行压栈保存处理,英雌是依次进行push入栈来进行保存

找到EntryPoint后我们将ESP进行设置硬件断点

5.png

在设置完后我们按F9进行运行同时观察程序跳转的位置

6.png

找到OEP之后我们按F8进行跳转进入,之后便可以进行dump内存来进行脱壳操作

7.png

8.png

如果中间出现了红叉(×),可以右键删除,参考下方IAT处修复的图

处理完毕后我们可以得到一个exe文件,此时我们再拖入PE进行查看壳

9.png

可以成功看到我们已经将壳进行去除了,但是如果我们将程序运行一下,却会发现如下情况:

10.png

此时我们需要修复对应的IAT才能成功的运行程序

IAT修复

我们再次调试到OEP,采用和之前dump一样的方式,此时我们选择下面的fix dumpIAT表进行修复

13.png

同时如果修复完成后出现如下错误,注意关闭一下杀毒软件如:360(罪魁祸首)

14.png

之后程序就可以运行起来啦,至此脱壳也就结束了

15.png


upx 手动脱壳
https://equinox-shame.github.io/2022/07/01/UPX 脱壳练习/
作者
梓曰
发布于
2022年7月1日
许可协议