UPX基本处理+魔改+手动脱壳
UPX (Ultimate Packer for eXecutables) 是一种流行的运行时压缩壳,拥有多平台支持和较高的压缩率但保护强度较低等特点。在逆向工程的题目中算是一个常见的考点。
基础解法
下载upx.exe
加/脱壳工具,将其与目标可执行文件放在同一目录下,在当前目录下打开cmd输入如下指令:
1 | upx -d 要脱壳的程序名.exe |
即可完成脱壳
加壳可使用如下指令
1 | upx -1 要加壳的程序名.exe #更快 |
或
1 | upx -9 要加壳的程序名.exe #更好的压缩率 |
魔改UPX
修改UPX头
标准的UPX头在010Editor中查看内容如下:
会发现里面有UPX0
,UPX1
等特别的字符(注意是大写),若将其修改,就不能直接用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
即可获得脱壳后的程序
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 hanafuda_store's Blog!