方法一
UPX的压缩器的特征之一是,其EP代码被包含在PUSHAD和POPAD之间,并且跳转到OEP的JMP指令会紧接着出现在PUSHAD指令之后,我们只需要找到符合以下两点条件的JMP指令并设置断点就可以顺利找到OEP:
条件一:这条JMP指令上方几条指令内有PUSHAD
条件二:这条JMP指令跳转到主程序空间内,且跟随后第一条指令是push XXX
方法二
方法二也利用了PUSHAD \POPAD。因为PUSHAD将8个寄存器的值压栈保存起来,而POPAD则相反是将这些值弹出送归原处,所以我们在执行第一条指令:PUSHAD后,停下来观察堆栈的情况:
我们看到寄存器值已经压栈了,接下来在数据窗口中,转到栈顶的地址也就是0006FFA4 ,然后打硬件access断点
接着按F9执行,断在POPAD指令之后的lea指令上,‘
我们看到下面就是JMP语句,我们跟进这条JMP指令看看:
这里就是程序的OEP了
相比较两种方法,第二种方法明显要简单粗暴,可行性要好很多,第一种方法在查找时费时又费力,可以找到好几个POPAD但是具体哪个是我们需要查找的,并不是很容易分辨,第二种直接通过硬件断点的方式可以一下子定位,方便快捷。
2015年10月27日