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

未分类 cyanprobe 10年前 (2015-06-14) 17209次浏览 已收录 2个评论

前言:

到了这节课就应该上档次了,ESP定律都出来了,以前读过叉子档案里有关ESP定律的描述:我们可以把壳假设为一个子程序,当壳把代码解压前和解压后,他必须要做的是遵循堆栈平衡的原理。把壳当做子程序来看待。 好吧说了半天你可能不懂,我也不是很懂说实话,应该先学汇编,再学反汇编的说。

教程开始:

二话不说先上软件  :本课软件(提取码:9541)
今天讲的是脱壳,当然脱壳可以用各种强大的工具,ESP定律手动脱壳适用于压缩壳和部分加密壳,不适用于完全加密壳。我们先载入PE看看是否加壳?如图所示:
2015-06-15_063743
UPX 0.89 – 3.xx -> Markus & Laszlo ver. [ 3.08 ] <- from file. ( sign like UPX packer )
这是一个UPX压缩壳 ,利用脱壳机可以轻松脱掉,但是我们这回玩的是手动ESP定律,我们就把它看成未知壳吧。

载入OllyDbg:

2015-06-15_064113
注意:我们点击否,进入程序伪入口点。我们按下F8键,注意右侧的寄存器窗口内的变化。
2015-06-15_064404
2015-06-15_064530
我们可以看到ESP和EIP数值变化了,并且只有他们两个为红色。 就像ESP平衡定律中说到的,其实变化的只有子模块。我们选中 ESP C0012ffA4这里右键,数据窗口跟随。
2015-06-15_064934
 
跟随完成,我们已经来到下图数据位置 ,我们选中数据进行断点处理。断点完成后,我们F9运行程序,程序执行到断点位置停下。
2015-06-15_065338
 
断点位置如下图所示:我们F8单步往下走注意第四行有一个JNZ跳转,为了防止绕圈我们就要想个办法跳过。
2015-06-15_065907
 

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

选中JNZ的下一行 F4  ,跳了之后,你看到下面那个JMP无条件跳转了吧,这是一个大跳转。我们必须跳过去,因为他可能达到了程序的OEP(OEP就是程序的真正入口点) 。我们F8步入,直接大跳转。
2015-06-15_071340
好了轻轻松松来到程序入口点,OEP! 你要问怎么看出来的?这玩意一定有特征啊~什么特征?其实我也不知道,我也是百度的,估计这玩意看看就顺眼了。程序特征如下:
 

Microsoft Visual C++ 6.0
00496EB8 >/$   55          PUSH EBP                               ;   (初始 cpu 选择)
00496EB9   |.   8BEC       MOV EBP,ESP
00496EBB   |.   6A FF       PUSH -1
00496EBD   |.   68 40375600 PUSH Screensh.00563740
00496EC2   |.   68 8CC74900 PUSH Screensh.0049C78C                ;   SE 处理程序安装
00496EC7   |.   64:A1 0000000>MOV EAX,DWORD PTR FS:[0]
00496ECD   |.   50          PUSH EAX
00496ECE   |.   64:8925 00000>MOV DWORD PTR FS:[0],ESP
00496ED5   |.   83EC 58    SUB ESP,58
---------------------------------------------------------------------------------------
Microsoft Visual Basic 5.0 / 6.0
00401166   - FF25 6C104000 JMP DWORD PTR DS:[<&MSVBVM60.#100>]    ; MSVBVM60.ThunRTMain
0040116C >   68 147C4000     PUSH PACKME.00407C14
00401171 E8 F0FFFFFF     CALL <JMP.&MSVBVM60.#100>
00401176 0000          ADD BYTE PTR DS:[EAX],AL
00401178 0000          ADD BYTE PTR DS:[EAX],AL
0040117A 0000          ADD BYTE PTR DS:[EAX],AL
0040117C 3000          XOR BYTE PTR DS:[EAX],AL
或省略第一行的JMP
00401FBC >   68 D0D44000        push dumped_.0040D4D0
00401FC1 E8 EEFFFFFF        call <jmp.&msvbvm60.ThunRTMain>
00401FC6 0000             add byte ptr ds:[eax],al
00401FC8 0000             add byte ptr ds:[eax],al
00401FCA 0000             add byte ptr ds:[eax],al
00401FCC 3000             xor byte ptr ds:[eax],al
00401FCE 0000             add byte ptr ds:[eax],al
----------------------------------------------------------------------
BC++
0040163C > $ /EB 10       JMP SHORT BCLOCK.0040164E
0040163E     |66          DB 66                                  ;   CHAR 'f'
0040163F     |62          DB 62                                  ;   CHAR 'b'
00401640     |3A          DB 3A                                  ;   CHAR ':'
00401641     |43          DB 43                                  ;   CHAR 'C'
00401642     |2B          DB 2B                                  ;   CHAR '+'
00401643     |2B          DB 2B                                  ;   CHAR '+'
00401644     |48          DB 48                                  ;   CHAR 'H'
00401645     |4F          DB 4F                                  ;   CHAR 'O'
00401646     |4F          DB 4F                                  ;   CHAR 'O'
00401647     |4B          DB 4B                                  ;   CHAR 'K'
00401648     |90          NOP
00401649     |E9          DB E9
0040164A . |98E04E00    DD OFFSET BCLOCK.___CPPdebugHook
0040164E > \A1 8BE04E00 MOV EAX,DWORD PTR DS:[4EE08B]
00401653 .   C1E0 02    SHL EAX,2
00401656 .   A3 8FE04E00 MOV DWORD PTR DS:[4EE08F],EAX
0040165B .   52          PUSH EDX
0040165C .   6A 00       PUSH 0                                   ; /pModule = NULL
0040165E .   E8 DFBC0E00 CALL <JMP.&KERNEL32.GetModuleHandleA> ; \GetModuleHandleA
00401663 .   8BD0       MOV EDX,EAX
-----------------------------------------------------------------------------------------------
Borland Delphi 6.0 - 7.0
00509CB0 > $   55          PUSH EBP
00509CB1 .   8BEC       MOV EBP,ESP
00509CB3 .   83C4 EC    ADD ESP,-14
00509CB6 .   53          PUSH EBX
00509CB7 .   56          PUSH ESI
00509CB8 .   57          PUSH EDI
00509CB9 .   33C0       XOR EAX,EAX
00509CBB .   8945 EC    MOV DWORD PTR SS:[EBP-14],EAX
00509CBE .   B8 20975000 MOV EAX,unpack.00509720
00509CC3 .   E8 84CCEFFF CALL unpack.0040694C
-----------------------------------------------------------------------------------------------
易语言入口
00401000 >   E8 06000000     call dump_.0040100B
00401005 50              push eax
00401006 E8 BB010000     call <jmp.&KERNEL32.ExitProcess>
0040100B 55              push ebp
0040100C 8BEC          mov ebp,esp
0040100E 81C4 F0FEFFFF add esp,-110
00401014 E9 83000000     jmp dump_.0040109C
00401019 6B72 6E 6C    imul esi,dword ptr ds:[edx+6E],6C
0040101D 6E              outs dx,byte ptr es:[edi]
也可能是这样的入口
Microsoft Visual C++ 6.0 [Overlay] E语言
00403831 >/$   55          PUSH EBP
00403832   |.   8BEC       MOV EBP,ESP
00403834   |.   6A FF       PUSH -1
00403836   |.   68 F0624000 PUSH Nisy521.004062F0
0040383B   |.   68 A44C4000 PUSH Nisy521.00404CA4                    ;   SE 处理程序安装
00403840   |.   64:A1 0000000>MOV EAX,DWORD PTR FS:[0]
00403846   |.   50          PUSH EAX
00403847   |.   64:8925 00000>MOV DWORD PTR FS:[0],ESP
-------------------------------------------------------------------
MASM32 / TASM32入口
00401258 >/$   6A 00       push 0                                   ; /pModule = NULL
0040125A   |.   E8 47000000 call <jmp.&kernel32.GetModuleHandleA> ; \GetModuleHandleA
0040125F   |.   A3 00304000 mov dword ptr ds:[403000],eax
00401264   |.   6A 00       push 0                                   ; /lParam = NULL
00401266   |.   68 DF104000 push dump.004010DF                       ; |DlgProc = dump.004010DF
0040126B   |.   6A 00       push 0                                   ; |hOwner = NULL
0040126D   |.   6A 65       push 65                               ; |pTemplate = 65
0040126F   |.   FF35 00304000 push dword ptr ds:[403000]             ; |hInst = NULL
00401275   |.   E8 56000000 call <jmp.&user32.DialogBoxParamA>    ; \DialogBoxParamA-

易语言,比较像像C语言,上面你可以看到,和我们这次OEP很相似。我们找到了入口点,那么先把上面的硬件断点删掉吧。如图下操作:
2015-06-15_072118
删除后,我们在入口点第一行右键,选择——用OllyDbg脱壳调试进程。接下来我们直接点击脱壳:
2015-06-15_072345
接下来保存文件,我们再载入PE看看脱壳效果。(
2015-06-15_072609

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

 
 


CyanProbe , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:破解基础五 利用OD-ESP定律脱壳
喜欢 (5)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
(2)个小伙伴在吐槽
  1. 教程相当的详细啊1
    美Win网2015-06-24 15:23 回复
  2. 要是能提供源程序就好了,
    武子2017-10-24 11:10 回复