Skip to content

ESP 定律法

Warning

The current page still doesn't have a translation for this language.

You can read it through Google Translate.

Besides, you can also help to translate it: Contributing.

ESP定律法是脱壳的利器, 是应用频率最高的脱壳方法之一.

要点

ESP定律的原理在于利用程序中堆栈平衡来快速找到OEP.

由于在程序自解密或者自解压过程中, 不少壳会先将当前寄存器状态压栈, 如使用pushad, 在解压结束后, 会将之前的寄存器值出栈, 如使用popad. 因此在寄存器出栈时, 往往程序代码被恢复, 此时硬件断点触发. 然后在程序当前位置, 只需要少许单步操作, 就很容易到达正确的OEP位置.

  1. 程序刚载入开始pushad/pushfd
  2. 将全部寄存器压栈后就设对ESP寄存器设硬件断点
  3. 运行程序, 触发断点
  4. 删除硬件断点开始分析

示例

示例程序可以点击此处下载: 2_esp.zip

还是上一篇的示例, 入口一句pushad, 我们按下F8执行pushad保存寄存器状态, 我们可以在右边的寄存器窗口里发现ESP寄存器的值变为了红色, 也即值发生了改变.

esp_01.png

我们鼠标右击ESP寄存器的值, 也就是图中的0019FF64, 选择HW break[ESP]后, 按下F9运行程序, 程序会在触发断点时断下. 如图来到了0040D3B0的位置. 这里就是上一篇我们单步跟踪时到达的位置, 剩余的就不再赘述.

esp_02.png