UPX (Ultimate Packer for eXecutables) 是一种流行的运行时压缩壳,拥有多平台支持和较高的压缩率但保护强度较低等特点。在逆向工程的题目中算是一个常见的考点。

基础解法

下载upx.exe加/脱壳工具,将其与目标可执行文件放在同一目录下,在当前目录下打开cmd输入如下指令:

1
upx -d 要脱壳的程序名.exe

即可完成脱壳

加壳可使用如下指令

1
upx -1 要加壳的程序名.exe       #更快

1
upx -9 要加壳的程序名.exe       #更好的压缩率

魔改UPX

修改UPX头

标准的UPX头在010Editor中查看内容如下:

会发现里面有UPX0UPX1等特别的字符(注意是大写),若将其修改,就不能直接用upx.exe脱壳了

拖入Die或ExeinfoPE中,仍能检查出UPX壳并指出可能错误的地方。(本题用小写的“upx”进行混淆

自行在二进制编辑器中进行修改即可恢复

修改入口点

用x64dbg打开加壳程序,将入口点处的4个push指令全部nop掉并保存

然后其也不能直接用upx.exe脱壳了,需要自行修复

手动脱UPX壳

32bit:用x32dbg调试加壳程序,运行到程序入口断点发现是一个pushad指令

该指令将所有寄存器的值压栈,而在UPX的执行流程里,这一步之后会加载UPX的解压代码用于将原始程序解压。所以我们只要跟踪到这部分栈被弹出,就意味着解压完成。之后的代码就是原始代码。

步进/步过这条pushad指令,然后在右下角的栈顶处设置硬件断点

F9运行到断点,往前翻一步找到popad指令,说明此时UPX的解压过程已经结束,现在在进行一些清理工作(将缺失的栈段空间补齐)

下面的jmp指令就会跳转到解压后的程序入口点

此时就可以用Scylla插件进行dump:

直接使用IAT Autosearch功能,若提示使用IAT Search Advanced,选“是”继续。然后Get Imports,最后直接Dump即可获得脱壳后的程序