使用ESP定律,手脱UPX壳

关于upx壳,其实很容易脱壳,使用ESP定律,便可以很容易的脱掉。废话不多说,以notepad的UPX为例,说明ESP定律的使用过程。
   1、先用PEiD查壳,
       UPX 0.89.6 - 1.02 / 1.05 - 1.24 -> Markus & Laszlo
   2、OD载入,断到蓝色的代码行处,如下所示:
      0040E8C0     60              pushad
      0040E8C1     BE 15B04000     mov esi,UPX.0040B015
      0040E8C6     8DBE EB5FFFFF   lea edi,dword ptr ds:[esi+FFFF5FEB]
      0040E8CC     57              push edi
      0040E8CD     83CD FF         or ebp,FFFFFFFF
      0040E8D0     EB 10           jmp short UPX.0040E8E2

      如果看到pushad,pushfd,可以考虑使用ESP定律的方法脱壳。何 为ESP定律法,就是在pushad处,F8单步跟踪一步,查看右边寄存器窗口中,ESP的值发生了变化,右单击ESP寄存器的值,在弹出菜单中,选择" 在数据窗口跟随",此时,在数据窗口中,右单击“数值”,选择“断点”->“设置硬件访问断点”->“Word”,此时硬件断点设置完毕,按 Shift+F9,代码断到如下位置的蓝色代码处:

      0040EA0F   - E9 B826FFFF     jmp UPX.004010CC
      0040EA14     0000            add byte ptr ds:[eax],al
      0040EA16     0000            add byte ptr ds:[eax],al
      0040EA18     0000            add byte ptr ds:[eax],al
      0040EA1A     0000            add byte ptr ds:[eax],al
      0040EA1C     0000            add byte ptr ds:[eax],al

     此时,再按F8,便来到了OEP处,代码类似于:

     004010CC     55              push ebp
     004010CD     8BEC            mov ebp,esp
     004010CF     83EC 44         sub esp,44
     004010D2     56              push esi
     004010D3     FF15 E4634000   call dword ptr ds:[4063E4]          ; kernel32.GetCommandLineA
     004010D9     8BF0            mov esi,eax
     此处就是脱壳的最佳位置。使用OD自带的脱壳插件脱壳即可。注意,要记住10CC这个偏移地址,因为在修复脱壳文件时,要使用这个地址。

posted @ 2012-07-12 11:09  monkeycd  阅读(1188)  评论(0)    收藏  举报