ESP 定律法¶
ESP定律法是脱壳的利器, 是应用频率最高的脱壳方法之一.
要点¶
ESP定律的原理在于利用程序中堆栈平衡来快速找到OEP.
由于在程序自解密或者自解压过程中, 不少壳会先将当前寄存器状态压栈, 如使用pushad
, 在解压结束后, 会将之前的寄存器值出栈, 如使用popad
. 因此在寄存器出栈时, 往往程序代码被恢复, 此时硬件断点触发. 然后在程序当前位置, 只需要少许单步操作, 就很容易到达正确的OEP位置.
- 程序刚载入开始pushad/pushfd
- 将全部寄存器压栈后就设对ESP寄存器设硬件断点
- 运行程序, 触发断点
- 删除硬件断点开始分析
示例¶
示例程序可以点击此处下载: 2_esp.zip
还是上一篇的示例, 入口一句pushad
, 我们按下F8执行pushad
保存寄存器状态, 我们可以在右边的寄存器窗口里发现ESP
寄存器的值变为了红色, 也即值发生了改变.
我们鼠标右击ESP
寄存器的值, 也就是图中的0019FF64
, 选择HW break[ESP]
后, 按下F9
运行程序, 程序会在触发断点时断下. 如图来到了0040D3B0
的位置. 这里就是上一篇我们单步跟踪时到达的位置, 剩余的就不再赘述.