实验步骤
1. PE文件基本信息分析

用Exeinfo对程序进行分析,发现是UPX加壳,版本在0.50到0.72之间
点击scan/t,看到详细版本为0.7:

同时可以看到OEP为0007C037H,这实际上是UPX加壳后的软件的一个节的名称,不是真实的OEP
2. 手动脱壳基本原理
函数调用规范约定:cdelc,stdcall,fastcall
函数栈调用原理视频:
这里使用ESP定律法
3. ESP定律脱壳实验步骤
加载程序
x32dbg打开后,默认显示系统库函数调用的代码,不是程序中的代码,按alt+F9快速跳转到用户代码

我们推测call diskprobe.47C03D是壳的自释放代码入口
按F7执行一条指令

使得EIP指向call diskprobe.47C03D
根据ESP定律,call完之后,必定再次访问ESP地址0019FF54
添加断点
可以直接右键设置硬件访问断点

也可以输入指令

然后按F9执行代码到中断位置,注意第一次中断是进入函数前,第二次才是执行完毕
之前便执行了一次,只需按一次F9

这里发现jmp指令是一个跨节的长跳转
说明前面在执行加壳指令代码,这里要跳转到解密后的节了
这里是通过查询节表来看出跨节的长跳转的

基址是00400000,如下

导出脱壳后程序
从刚刚的断点单步执行以下(F7)

我们已经判断0044716A是OEP,要将内存中从OEP开始的内存中数据DUMP到文件中即可脱壳
DUMP是,需按照PE格式要求修复各项数据,手工太麻烦
x32dbg中可以使用scylla插件自动完成
