【文章标题】: vmp1.63加壳程序破解分析
【文章作者】: 西风[BCG]
【作者邮箱】: 41382440@qq.com
【作者QQ号】: 41382440
【软件名称】: 自己写的
【下载地址】: 无
【加壳方式】: vmp1.63
【保护方式】: VMP1.63
【编写语言】: delphi
【操作平台】: windows
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
  这是自己写来玩的,感谢小伟的指点,不然估计弯路还走得多了,谢谢!
  源码是这样的,delphi写的
    {$I VMProtectBegin.inc}
    if edt1.Text='12345' then
      MessageBox(Handle, '你真厉害!', '提示', MB_OK)
    else
      MessageBox(Handle, '小西风同志,继续努力!', '提示', MB_OK);
    {$I VMProtectEnd.inc}
  
  开始旅程:
  
  004501B2       68 AA84B6EB     push EBB684AA
  004501B7       E8 709D0000     call Project1.00459F2C
  
  要进入VM了
  进CALL,一路F7
  00459CA0       FF3424          push dword ptr ss:[esp]
  00459CA3       9C              pushfd
  00459CA4       8F4424 4C       pop dword ptr ss:[esp+4C]                ; 保存flag用的
  我们都知道jnz要判断,是根据flag来判断的,这儿比较关键了,
  记下POP的地址
  堆栈 [0012F500]=00000246
  堆栈 ss:[0012F54C]=0012F708
  246的值,保存到0012f54c,
  记下这个地址
  
  然后转到strcmp,这儿取巧了,delphi源程序是我写的,当然知道strcmp的位置
  
  
  0040421C       53              push ebx
  0040421D       56              push esi
  0040421E       57              push edi
  0040421F       89C6            mov esi,eax
  00404221       89D7            mov edi,edx
  00404223       39D0            cmp eax,edx
  00404225       0F84 8F000000   je Project1.004042BA
  0040422B       85F6            test esi,esi
  0040422D       74 68           je short Project1.00404297
  0040422F       85FF            test edi,edi
  00404231       74 6B           je short Project1.0040429E
  00404233       8B46 FC         mov eax,dword ptr ds:[esi-4]
  00404236       8B57 FC         mov edx,dword ptr ds:[edi-4]
  00404239       29D0            sub eax,edx
  0040423B       77 02           ja short Project1.0040423F
  0040423D       01C2            add edx,eax
  0040423F       52              push edx
  00404240       C1EA 02         shr edx,2
  00404243       74 26           je short Project1.0040426B
  00404245       8B0E            mov ecx,dword ptr ds:[esi]
  00404247       8B1F            mov ebx,dword ptr ds:[edi]
  00404249       39D9            cmp ecx,ebx
  0040424B       75 58           jnz short Project1.004042A5
  0040424D       4A              dec edx
  0040424E       74 15           je short Project1.00404265
  00404250       8B4E 04         mov ecx,dword ptr ds:[esi+4]
  00404253       8B5F 04         mov ebx,dword ptr ds:[edi+4]
  00404256       39D9            cmp ecx,ebx
  00404258       75 4B           jnz short Project1.004042A5
  0040425A       83C6 08         add esi,8
  0040425D       83C7 08         add edi,8
  00404260       4A              dec edx
  00404261     ^ 75 E2           jnz short Project1.00404245
  00404263       EB 06           jmp short Project1.0040426B
  00404265       83C6 04         add esi,4
  00404268       83C7 04         add edi,4
  0040426B       5A              pop edx
  0040426C       83E2 03         and edx,3
  0040426F       74 22           je short Project1.00404293
  00404271       8B0E            mov ecx,dword ptr ds:[esi]
  00404273       8B1F            mov ebx,dword ptr ds:[edi]
  00404275       38D9            cmp cl,bl
  00404277       75 41           jnz short Project1.004042BA
  00404279       4A              dec edx
  0040427A       74 17           je short Project1.00404293
  0040427C       38FD            cmp ch,bh
  0040427E       75 3A           jnz short Project1.004042BA
  00404280       4A              dec edx
  00404281       74 10           je short Project1.00404293
  00404283       81E3 0000FF00   and ebx,0FF0000
  00404289       81E1 0000FF00   and ecx,0FF0000
  0040428F       39D9            cmp ecx,ebx
  00404291       75 27           jnz short Project1.004042BA
  00404293       01C0            add eax,eax
  00404295       EB 23           jmp short Project1.004042BA
  00404297       8B57 FC         mov edx,dword ptr ds:[edi-4]
  0040429A       29D0            sub eax,edx
  0040429C       EB 1C           jmp short Project1.004042BA
  0040429E       8B46 FC         mov eax,dword ptr ds:[esi-4]
  004042A1       29D0            sub eax,edx
  004042A3       EB 15           jmp short Project1.004042BA
  004042A5       5A              pop edx
  004042A6       38D9            cmp cl,bl
  004042A8       75 10           jnz short Project1.004042BA
  004042AA       38FD            cmp ch,bh
  004042AC       75 0C           jnz short Project1.004042BA
  004042AE       C1E9 10         shr ecx,10
  004042B1       C1EB 10         shr ebx,10
  004042B4       38D9            cmp cl,bl
  004042B6       75 02           jnz short Project1.004042BA
  004042B8       38FD            cmp ch,bh
  004042BA       5F              pop edi
  004042BB       5E              pop esi
  004042BC       5B              pop ebx
  004042BD       C3              retn
  
  
  这就是strcmp了,这儿patch也行,不过这儿就是vm patch了,失去意义了,昨天我就是一直郁闷,
  我们要patch VM,这儿忽略掉,
  在004042BD       C3              retn下断
  断下后,再在0012f54c下硬件访问,
  会断下好几次,每一次就需要做一些简单判断了,
  海风牛的文章上说
  vmp里面有唯一的跳转指令,handle大概是这样的
  
  mov e?x,[ebp]
  add ebp,4
  mov esi, e?x
  
  这条handle是跳转指令,jmp,唯一的跳转
  看到这种形式了,就差不多了,
  顺利来到
  
  0045A57E       8B55 00         mov edx,dword ptr ss:[ebp]
  0045A581       F5              cmc
  0045A582       80FC FF         cmp ah,0FF
  0045A585       895424 04       mov dword ptr ss:[esp+4],edx
  0045A589       83C5 04         add ebp,4
  0045A58C       60              pushad
  0045A58D       891407          mov dword ptr ds:[edi+eax],edx
  0045A590       887424 04       mov byte ptr ss:[esp+4],dh
  0045A594       9C              pushfd
  
  可以发现edx就是flag了,将edx=202改成246,呵呵,
  破解了吧
  patch 如何做?
  直接复制小伟的,
  vmp的vm中,esi是vm_eip,所以判断esi即可。所以,找块空地,补上代码:
  0045050E       9C                      pushfd
  0045050F       81FE 5DAA4500           cmp     esi, 0045AA5D
  00450515       75 07                   jnz     short 0045051E
  00450517       C745 00 46020000        mov     dword ptr [ebp], 0x246
  0045051E       9D                      popfd
  0045051F       8B55 00                 mov     edx, dword ptr [ebp]
  00450522       F5                      cmc
  00450523       80FC FF                 cmp     ah, 0xFF
  00450526     - E9 5AA00000             jmp     0045A585
  
  
  
  如果没有源程序,人肉吧,暂时我也没想到更好的方法
  
--------------------------------------------------------------------------------
【版权声明】: 本文原创于西风, 转载请注明作者并保持文章的完整, 谢谢!

                                                       2010年02月19日 AM 10:30:47

后记:VMP内部的流程实际还是很复杂,不过对于破解来说,是可以取巧的,
VMP详细的细节,以后陆陆续续来发。
  下次来发个safengine的小窥,未能见到全貌,不得不说safengine技术还是强悍,这方面SessionDiy S牛比较有发言权,希望能得到S牛指点。