破解基础利用OD-ESP定律脱壳

作者: gaohailin 分类: 其他 发布时间: 2018-11-24 15:49

今天讲的是脱壳,当然脱壳可以用各种强大的工具,ESP定律手动脱壳适用于压缩壳和部分加密壳,不适用于完全加密壳。我们先载入PE看看是否加壳?如图所示:

破解基础五 利用OD-ESP定律脱壳

UPX 0.89 – 3.xx -> Markus & Laszlo ver. [ 3.08 ] <- from file. ( sign like UPX packer )

这是一个UPX压缩壳 ,利用脱壳机可以轻松脱掉,但是我们这回玩的是手动ESP定律,我们就把它看成未知壳吧。

载入OllyDbg:

破解基础五 利用OD-ESP定律脱壳

注意:我们点击否,进入程序伪入口点。我们按下F8键,注意右侧的寄存器窗口内的变化。

破解基础五 利用OD-ESP定律脱壳

破解基础五 利用OD-ESP定律脱壳

我们可以看到ESP和EIP数值变化了,并且只有他们两个为红色。 就像ESP平衡定律中说到的,其实变化的只有子模块。我们选中 ESP C0012ffA4这里右键,数据窗口跟随。

破解基础五 利用OD-ESP定律脱壳

 

跟随完成,我们已经来到下图数据位置 ,我们选中数据进行断点处理。断点完成后,我们F9运行程序,程序执行到断点位置停下。

破解基础五 利用OD-ESP定律脱壳

 

断点位置如下图所示:我们F8单步往下走注意第四行有一个JNZ跳转,为了防止绕圈我们就要想个办法跳过。

破解基础五 利用OD-ESP定律脱壳

 

注意:凡是向上的跳转,我们就用鼠标选中他的下一行,按下F4,让程序直接到跳转的下面。

选中JNZ的下一行 F4  ,跳了之后,你看到下面那个JMP无条件跳转了吧,这是一个大跳转。我们必须跳过去,因为他可能达到了程序的OEP(OEP就是程序的真正入口点) 。我们F8步入,直接大跳转。

破解基础五 利用OD-ESP定律脱壳

好了轻轻松松来到程序入口点,OEP! 你要问怎么看出来的?这玩意一定有特征啊~什么特征?其实我也不知道,我也是百度的,估计这玩意看看就顺眼了。程序特征如下:

 

  1. Microsoft Visual C++ 6.0
  2.  
  3. 00496EB8 >/$ 55 PUSH EBP ; (初始 cpu 选择)
  4. 00496EB9 |. 8BEC MOV EBP,ESP
  5. 00496EBB |. 6A FF PUSH -1
  6. 00496EBD |. 68 40375600 PUSH Screensh.00563740
  7. 00496EC2 |. 68 8CC74900 PUSH Screensh.0049C78C ; SE 处理程序安装
  8. 00496EC7 |. 64:A1 0000000>MOV EAX,DWORD PTR FS:[0]
  9. 00496ECD |. 50 PUSH EAX
  10. 00496ECE |. 64:8925 00000>MOV DWORD PTR FS:[0],ESP
  11. 00496ED5 |. 83EC 58 SUB ESP,58
  12. —————————————————————————————
  13. Microsoft Visual Basic 5.0 / 6.0
  14.  
  15. 00401166 FF25 6C104000 JMP DWORD PTR DS:[<&MSVBVM60.#100>] ; MSVBVM60.ThunRTMain
  16. 0040116C > 68 147C4000 PUSH PACKME.00407C14
  17. 00401171 E8 F0FFFFFF CALL <JMP.&MSVBVM60.#100>
  18. 00401176 0000 ADD BYTE PTR DS:[EAX],AL
  19. 00401178 0000 ADD BYTE PTR DS:[EAX],AL
  20. 0040117A 0000 ADD BYTE PTR DS:[EAX],AL
  21. 0040117C 3000 XOR BYTE PTR DS:[EAX],AL
  22.  
  23. 或省略第一行的JMP
  24.  
  25. 00401FBC > 68 D0D44000 push dumped_.0040D4D0
  26. 00401FC1 E8 EEFFFFFF call <jmp.&msvbvm60.ThunRTMain>
  27. 00401FC6 0000 add byte ptr ds:[eax],al
  28. 00401FC8 0000 add byte ptr ds:[eax],al
  29. 00401FCA 0000 add byte ptr ds:[eax],al
  30. 00401FCC 3000 xor byte ptr ds:[eax],al
  31. 00401FCE 0000 add byte ptr ds:[eax],al
  32. ———————————————————————-
  33. BC++
  34.  
  35. 0040163C > $ /EB 10 JMP SHORT BCLOCK.0040164E
  36. 0040163E |66 DB 66 ; CHAR ‘f’
  37. 0040163F |62 DB 62 ; CHAR ‘b’
  38. 00401640 |3A DB 3A ; CHAR ‘:’
  39. 00401641 |43 DB 43 ; CHAR ‘C’
  40. 00401642 |2B DB 2B ; CHAR ‘+’
  41. 00401643 |2B DB 2B ; CHAR ‘+’
  42. 00401644 |48 DB 48 ; CHAR ‘H’
  43. 00401645 |4F DB 4F ; CHAR ‘O’
  44. 00401646 |4F DB 4F ; CHAR ‘O’
  45. 00401647 |4B DB 4B ; CHAR ‘K’
  46. 00401648 |90 NOP
  47. 00401649 |E9 DB E9
  48. 0040164A . |98E04E00 DD OFFSET BCLOCK.___CPPdebugHook
  49. 0040164E > \A1 8BE04E00 MOV EAX,DWORD PTR DS:[4EE08B]
  50. 00401653 . C1E0 02 SHL EAX,2
  51. 00401656 . A3 8FE04E00 MOV DWORD PTR DS:[4EE08F],EAX
  52. 0040165B . 52 PUSH EDX
  53. 0040165C . 6A 00 PUSH 0 ; /pModule = NULL
  54. 0040165E . E8 DFBC0E00 CALL <JMP.&KERNEL32.GetModuleHandleA> ; \GetModuleHandleA
  55. 00401663 . 8BD0 MOV EDX,EAX
  56. ———————————————————————————————–
  57. Borland Delphi 6.0 – 7.0
  58.  
  59. 00509CB0 > $ 55 PUSH EBP
  60. 00509CB1 . 8BEC MOV EBP,ESP
  61. 00509CB3 . 83C4 EC ADD ESP,-14
  62. 00509CB6 . 53 PUSH EBX
  63. 00509CB7 . 56 PUSH ESI
  64. 00509CB8 . 57 PUSH EDI
  65. 00509CB9 . 33C0 XOR EAX,EAX
  66. 00509CBB . 8945 EC MOV DWORD PTR SS:[EBP-14],EAX
  67. 00509CBE . B8 20975000 MOV EAX,unpack.00509720
  68. 00509CC3 . E8 84CCEFFF CALL unpack.0040694C
  69. ———————————————————————————————–
  70. 易语言入口
  71. 00401000 > E8 06000000 call dump_.0040100B
  72. 00401005 50 push eax
  73. 00401006 E8 BB010000 call <jmp.&KERNEL32.ExitProcess>
  74. 0040100B 55 push ebp
  75. 0040100C 8BEC mov ebp,esp
  76. 0040100E 81C4 F0FEFFFF add esp,-110
  77. 00401014 E9 83000000 jmp dump_.0040109C
  78. 00401019 6B72 6E 6C imul esi,dword ptr ds:[edx+6E],6C
  79. 0040101D 6E outs dx,byte ptr es:[edi]
  80.  
  81.  
  82. 也可能是这样的入口
  83. Microsoft Visual C++ 6.0 [Overlay] E语言
  84.  
  85. 00403831 >/$ 55 PUSH EBP
  86. 00403832 |. 8BEC MOV EBP,ESP
  87. 00403834 |. 6A FF PUSH 1
  88. 00403836 |. 68 F0624000 PUSH Nisy521.004062F0
  89. 0040383B |. 68 A44C4000 PUSH Nisy521.00404CA4 ; SE 处理程序安装
  90. 00403840 |. 64:A1 0000000>MOV EAX,DWORD PTR FS:[0]
  91. 00403846 |. 50 PUSH EAX
  92. 00403847 |. 64:8925 00000>MOV DWORD PTR FS:[0],ESP
  93. ——————————————————————-
  94. MASM32 / TASM32入口
  95.  
  96. 00401258 >/$ 6A 00 push 0 ; /pModule = NULL
  97. 0040125A |. E8 47000000 call <jmp.&kernel32.GetModuleHandleA> ; \GetModuleHandleA
  98. 0040125F |. A3 00304000 mov dword ptr ds:[403000],eax
  99. 00401264 |. 6A 00 push 0 ; /lParam = NULL
  100. 00401266 |. 68 DF104000 push dump.004010DF ; |DlgProc = dump.004010DF
  101. 0040126B |. 6A 00 push 0 ; |hOwner = NULL
  102. 0040126D |. 6A 65 push 65 ; |pTemplate = 65
  103. 0040126F |. FF35 00304000 push dword ptr ds:[403000] ; |hInst = NULL
  104. 00401275 |. E8 56000000 call <jmp.&user32.DialogBoxParamA> ; \DialogBoxParamA

易语言,比较像像C语言,上面你可以看到,和我们这次OEP很相似。我们找到了入口点,那么先把上面的硬件断点删掉吧。如图下操作:

破解基础五 利用OD-ESP定律脱壳

删除后,我们在入口点第一行右键,选择——用OllyDbg脱壳调试进程。接下来我们直接点击脱壳:

破解基础五 利用OD-ESP定律脱壳

接下来保存文件,我们再载入PE看看脱壳效果。(

破解基础五 利用OD-ESP定律脱壳

信息:EP code like Delphi/C++ but different structure (其实是易语言)脱壳信息:No information – unknown protection or manually dumped  (没有壳子了)

如果觉得我的文章对您有用,请随意赞赏。您的支持将鼓励我继续创作!

发表评论

电子邮件地址不会被公开。 必填项已用*标注