手脱UPX壳--x64dbg为例

原理

upx壳压缩过程:

1.在程序的开头或者其他合适的地方插入一段代码

2.将程序的其他地方压缩,顺带起到混淆作用

解压缩过程:

upx壳在程序执行时实时解压,原理如下

1
2
3
4
5
6
7
8
9
10
11
参考:https://blog.csdn.net/zacklin/article/details/7419001
1==>2==>3==>4==>5==>6
假设1是upx插入的代码,2,3,4是压缩后的代码。5,6是随便的什么东西。
程序从1开始执行。而1的功能是将2,3,4解压缩为7,8,9。7,8,9就是2,3,4在压缩之前的形式。
1==>7==>8==>9==>5==>6

连起来就是:

最初代码的形式就应该是:7==>8==>9==>5==>6
用upx压缩之后形式为:1==>2==>3==>4==>5==>6
执行时的形式变为:1==>7==>8==>9==>5==>6

实操

1
2
3
4
5
6
#include<stdio.h>
int main()
{
printf("hello_world");
puts("a test for decompresing");
}

一个简单样例加个壳: upx 1.exe

x64dbg进入

可以看到系统断点,f9运行至断点处

f7步进完压栈内容至lea指令处,找到rsp对应位置下硬件断点

字节影响不大

然后f9可以看到pop和1.exe程序对应的函数调用,中间的jne循环用于补齐缺失的栈段空间

下断点运行至该处然后步进

可以看到进入源程序内部了,使用自带插件Scylla dump(丢弃;脱壳 )

1.IAT自动搜索/IAT Autosearch; 2. 获取导入/Get Imports; 3.删除红叉所在行; 4.转储/Dump;

5.修复转储/Fix Dump 选择dump的文件即可

总结

push过程的栈内容用于解压代码,下断点跟踪栈内容至pop指令下方找到程序函数调用确定程序入口点再插件记录脱壳即可


手脱UPX壳--x64dbg为例
https://alenirving.github.io/2025/07/05/手脱UPX壳--x64dbg为例/
作者
Ma5k
发布于
2025年7月5日
许可协议