zoukankan      html  css  js  c++  java
  • [逆向破解]使用ESP定律手动脱"中国菜刀"壳

    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
    版权声明:若无注明,本文皆为“Poacher'Blog”原创,转载请保留文章出处。
    免责声明:学习网络技术是为了更好的提升自我安全意识。不允许将内容私自传播、销售或者其他任何非法用途!否则,一切后果请用户自负!如对站内文章或者软件有异议,请联系博主!联系QQ:177705712
  • 相关阅读:
    EF6(CodeFirst)+MySql开发遇到的坑
    Entity Framework mvc Code First data migration
    SQL 修改排序规则的问题 sql_latin1_general_cp1_ci_as
    sql 与linq的转换
    Entity Framework的事务提交
    .net Quartz 服务 作业调度
    如何插上U盘 自动复制内容
    SQL学习之--触发器
    原生javascript与jquery 的比较
    原生javascript学习
  • 原文地址:https://www.cnblogs.com/poacher/p/7399740.html
Copyright © 2011-2022 走看看