【文章标题】: 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牛指点。
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!