码迷,mamicode.com
首页 > 其他好文 > 详细

[逆向破解]使用ESP定律手动脱"中国菜刀"壳

时间:2017-08-20 14:11:25      阅读:669      评论:0      收藏:0      [点我收藏+]

标签:断点   正文   笔记   bug   其他   template   sof   红色   数据窗   

0x00前言:
    ESC定律脱壳一般的加壳软件在执行时,首先要初始化,保存环境(保存各个寄存器的值),一般利用PUSHAD(相当于把eax,ecx,edx,ebx,esp,ebp,esi,edi都压栈),当加壳程序的外壳执行完毕以后,再来恢复各个寄存器的内容,通常会用POPAD(相当与把eax,ecx,edx,ebx,esp,ebp,esi,edi都出栈),通过跨区段的转移来跳到程序的OEP来执行原程序!简单点来说就是会将加壳过程执行一遍之后会跳到OEP来执行源程序。当我们找到了OEP的时候就是找到了源程序,就可以脱壳了(以上简单点来说纯属是我个人理解)。
 
0x01工具:
  • PEID v0.95
  • Ollydbg
0x02正文:
    一般拿到程序的第一件事就是查壳,查是否存在壳,存在什么壳。打开PEID。
    技术分享
  这里PEID有效的告诉了我们,该程序加的是UPX压缩加密壳。
  直接导入进OD里面。
  技术分享

    如果目标程序加了壳的话,导入进od都会有该提示。直接点否。
技术分享

    点否之后OD会自动到pusdad 既是外壳的入口点。

    注意右边的寄存器。现在一共是有EAX、ECX、EDX、ESP、EBP、ESI、EDI寄存器。

技术分享

    然后我们按下F8或者点菜单栏的单步步过。

    按下之后右边的ESP以及EIP会同时变红。变成了红色代表有新的数据压入。注意:多个寄存器中除了EIP外只有ESP红色才行。其他变红则不能使用ESP定律脱壳。
 
技术分享
      选中 ESP  0012FFA4 然后右键 选择数据窗口中跟随。然后注意左下角。

 技术分享

 左下角任意选择一段数据。右键-》断点-》硬件访问-》Word。然后运行程序(F9)。程序运行到指定地方会自动断点停掉。

技术分享

004AE9BB    6A 00           push 0x0
004AE9BD    39C4            cmp esp,eax
004AE9BF    75 FA            jnz short 中国菜刀.004AE9BB
 
注意看这里。有一个判断。看红色箭头(这个箭头不是我标的)。如果不为0 那么就跳向 004AE9BB
这里我们需要选择"004AE9BF    75 FA  jnz short 中国菜刀.004AE9BB"的下面一行。然后按F4。直接跳过这个判断之后。继续按F8。
然后会发现直接跳进了真正程序的入口。
 

 技术分享

 

004659A8    55              push ebp
004659A9    8BEC            mov ebp,esp
004659AB    6A FF           push -0x1
004659AD    68 18714700     push 中国菜刀.00477118
004659B2    68 805B4600     push 中国菜刀.00465B80
004659B7    64:A1 00000000  mov eax,dword ptr fs:[0]
004659BD    50              push eax
004659BE    64:8925 0000000>mov dword ptr fs:[0],esp
004659C5    83EC 68         sub esp,0x68
004659C8    53              push ebx
004659C9    56              push esi
004659CA    57              push edi
004659CB    8965 E8         mov dword ptr ss:[ebp-0x18],esp
004659CE    33DB            xor ebx,ebx
004659D0    895D FC         mov dword ptr ss:[ebp-0x4],ebx
004659D3    6A 02           push 0x2
004659D5    5F              pop edi                                  ; 0012FFF0
 
这里就是我们要的OEP了。通过OEP我们可以猜出该程序是什么编程语言开发的。
 
(OEP入口特征百度都是有的。为了方便阅读。我已经从网上收集了出来。在本文的最下方就可以看到了)

 技术分享

找到了OEP接下来就是脱壳了。记住脱壳之前请先讲断点删除掉否则程序将会出错或者脱壳失败的。
技术分享
我们右键-》用OllyDump脱壳调试进程

 技术分享

技术分享

选择脱壳。然后保存。
 
这个时候我们在打开PEID来查一下"中国菜刀_1.exe"
 
技术分享
    成功把壳脱下来了。当然像UPX这种壳的话。网上都有很多脱壳机和脱壳脚本来。直接用就可以啦。

技术分享

    程序也能运行。
    
    好啦,文章结束了,本文基本上没什么可以说的点。只是本着做笔记以后感叹人生以及交流分享所发滴。。
 
    PS:本着交流分享。如果有好的方法或者思路以及上文讲述不正确的地方欢迎指出。谢谢!(大牛勿喷!!)
  
OEP入口的特征大全:
Microsoft Visual C
++ 6.0 push ebp mov ebp, esp push -1 push 004C0618 push 004736F8 mov eax, dword ptr fs:[0] push eax mov dword ptr fs:[0], esp sub esp, 58 push ebx push esi push edi mov [local.6], esp Microsoft Visual Basic 5.0 / 6.0 JMP DWORD PTR DS[<&MSVBVM60.#100>] PUSH Dumped.00407C14 CALL <JMP.&MSVBVM60.#100> ADD BYTE PTR DS:[EAX],AL ADD BYTE PTR DS:[EAX],AL ADD BYTE PTR DS:[EAX],AL XOR BYTE PTR DS:[EAX],AL VB还有一种 push Dumped.0040D4D0 call <jmp.&msvbvm60.ThunRTMain> add byte ptr ds:[eax],al add byte ptr ds:[eax],al add byte ptr ds:[eax],al xor byte ptr ds:[eax],al add byte ptr ds:[eax],al Borland C++ JMP SHORT BCLOCK.0040164E DB 66 ; CHAR ‘f‘ DB 62 ; CHAR ‘b‘ DB 3A ; CHAR ‘:‘ DB 43 ; CHAR ‘C‘ DB 2B ; CHAR ‘+‘ DB 2B ; CHAR ‘+‘ DB 48 ; CHAR ‘H‘ DB 4F ; CHAR ‘O‘ DB 4F ; CHAR ‘O‘ DB 4B ; CHAR ‘K‘ NOP DB E9 DD OFFSET BCLOCK.___CPPdebugHook MOV EAX,DWORD PTR DS:[4EE08B] SHL EAX,2 MOV DWORD PTR DS:[4EE08F],EAX PUSH EDX PUSH 0 ; /pModule = NULL CALL <JMP.&KERNEL32.GetModuleHandleA> ; /GetModuleHandleA MOV EDX,EAX Borland Delphi 6.0 - 7.0 PUSH EBP MOV EBP,ESP ADD ESP,-14 PUSH EBX PUSH ESI PUSH EDI XOR EAX,EAX MOV DWORD PTR SS:[EBP-14],EAX MOV EAX,Dumped.00509720 CALL Dumped.0040694C 易语言入口 call Dumped.0040100B push eax call <jmp.&KERNEL32.ExitProcess> push ebp mov ebp,esp add esp,-110 jmp Dumped.0040109C imul esi,dword ptr ds:[edx+6E],6C outs dx,byte ptr es:[edi] 也是有令一种形式 Microsoft Visual C++ 6.0 [Overlay]的E语言 PUSH EBP MOV EBP,ESP PUSH -1 PUSH Dumped.004062F0 PUSH Dumped.00404CA4 ; SE 处理程序安装 MOV EAX,DWORD PTR FS:[0] PUSH EAX MOV DWORD PTR FS:[0],ESP MASM32 / TASM32 push 0 ; /pModule = NULL call <jmp.&kernel32.GetModuleHandleA> ; /GetModuleHandleA mov dword ptr ds:[403000],eax push 0 ; /lParam = NULL push Dumped.004010DF ; |DlgProc = dump.004010DF push 0 ; |hOwner = NULL push 65 ; |pTemplate = 65 push dword ptr ds:[403000] ; |hInst = NULL call <jmp.&user32.DialogBoxParamA> ; /DialogBoxParamA VC8 call Dumped.004ACF97 jmp Dumped.004A28FC int 3 int 3 int 3 int 3 int 3 int 3 int 3 int 3 int 3 int 3 mov ecx,dword ptr ss:[esp+4] test ecx,3 je short Dumped.004A2B20 mov al,byte ptr ds:[ecx] add ecx,1

[逆向破解]使用ESP定律手动脱"中国菜刀"壳

标签:断点   正文   笔记   bug   其他   template   sof   红色   数据窗   

原文地址:http://www.cnblogs.com/poacher/p/7399740.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!