?看了 上大神们写了好多的vmp 虚拟代码的分析 ,但是在对实在项目时,插件总是提示不对或者未知版本,一直对vm代码的还原有质疑,于是就萌发了具体分析这个vm代码是怎么回事,若有错误,欢迎指出,能力有限只能分析皮毛,只谈vm的代码。
VMProtect正版授权在线订购享受最低价,仅售801元起!还不赶紧加入你的订购清单/span>>>更多详情可点击咨询购买
相关链接:
代码保护软件VMP逆向分析虚拟机指令:初步认识与环境搭建(一)
代码保护软件VMP逆向分析虚拟机指令:VMP代码的提取(二)
代码保护软件VMP逆向分析虚拟机指令详细分析(三)
代码保护软件VMP逆向分析虚拟机指令:分析那4条汇编被VM的VM指令
代码保护软件VMP逆向分析虚拟机指令:分析VMP的一些细节
七、附加 分析如果VM的指令中包含了函数调用
材料文件在vmptestcall2文件夹中,不知道为什么我这个vm后的exe总 毒,之前上面那个没 。追踪时一样是按Ctrl+F11记录,我们先看一下原来的汇编是什么样:

然后VMP3后我们下的trace断点:

首先进入虚拟机:
0043D9C2 主 push 0x7EBD5487 ESP=0012FF88 ; 进入虚拟机前兆 VM_Entry0043D9C7 主 call vmptestc.0041258D ESP=0012FF840041258D 主 push edi ESP=0012FF800041258E 主 mov di,0x7063 EDI=0000706300412592 主 pushfd ESP=0012FF7C00412593 主 push ebx ESP=0012FF7800412594 主 clc00412595 主 neg bx FL=CPS, EBX=7FFD9000
我们直接搜索puts字符串,得到所在位置如下:
00414248 主 jmp vmptestc.0047DE970047DE97 主 retn ESP=0012FF84 ; 退出虚拟机环境 进入函数调用内部puts 主 push 0xC ESP=0012FF80 -----------------------------------------------------------puts75A68D06 主 push msvcrt.75A68E80 ESP=0012FF7C75A68D0B 主 call msvcrt.759F9836 FL=0, EAX=0012FF70, ESP=0012FF54, EBP=0012FF8075A68D10 主 or ebx,0xFFFFFFFF FL=PS, EBX=FFFFFFFF75A68D13 主 mov dword ptr ss:[ebp-0x1C],ebx75A68D16 主 xor eax,eax FL=PZ, EAX=00000000
而我们往上看,看出上面是退出虚拟机的代码,特征不要我多说了吧,很多pop,然后只有一个VM_Exit。在往下看看退出puts后紧跟着的是什么:
75A68E4E 主 mov dword ptr ss:[ebp-0x4],-0x275A68E55 主 call msvcrt.75A68E6D75A68E5A 主 mov eax,dword ptr ss:[ebp-0x1C]75A68E5D 主 call msvcrt.759F987B ECX=75A68E62, EBX=7FFD7000, ESP=0012FF84, EBP=0012FF94, ESI=00000000, EDI=0000000075A68E62 主 retn ESP=0012FF88 ; 退出puts0042AB41 主 push 0x7EB991DF ESP=0012FF84 ; 重新进入虚拟机0042AB46 主 call vmptestc.0041258D ESP=0012FF800041258D 主 push edi ESP=0012FF7C0041258E 主 mov di,0x7063 EDI=0000706300412592 主 pushfd ESP=0012FF7800412593 主 push ebx ESP=0012FF7400412594 主 clc
这里我们看到我们退出puts后,紧跟着并没有看到调用我们的EspArg1函数,而是又进入虚拟机,难道我们的EspArg1内部被VM了,然后我们继续往下分析,找下VM_Exit看看。我们直接搜索特征: 提示我们可以搜索popfd,当然仅限这里,为什么/span>
00461852 主 popfd FL=PZ, ESP=0012FF7C00461853 主 cmovne edi,esi00461856 主 movsx edi,sp EDI=FFFFFF7C00461859 主 pop edi ESP=0012FF80, EDI=000000000046185A 主 jmp vmptestc.004266A6004266A6 主 retn ESP=0012FF84 ;退出虚拟机00401008 主 mov dword ptr ss:[esp+0x4],vmptestc.00403018 ---------------------------EspArg1 function00401010 主 retn ESP=0012FF880045AAE7 主 push 0x7EB42BBF ESP=0012FF84 ;进入虚拟机0045AAEC 主 call vmptestc.0041258D ESP=0012FF800041258D 主 push edi ESP=0012FF7C0041258E 主 mov di,0x7063 EDI=00007063
嗯什么情况,我们看到退出虚拟机,然后下一条就是我们的EspArg1 function里面的内容(“原画”),然后又进入虚拟机。
我们其实VM的就这3句:
push offset HelloWordcall crt_putscall EspArg1
然后我们可以分析一下有多少次退出虚拟机的操作,我们可以搜索特征去分析,经过分析:
1.VM_Entery............2.VM_Exit3.Call puts4.VM_Entery...........5.VM_Exit6.Call EspArg17.VM_Entery...........8.VM_Exit
我们主要分析的是被VM代码中存在调用函数时的问题,所以其他我们不多管,只管这个是怎么处理调用函数的,现在应该可以大致知道是什么调用的了吧。所以知道为什么有的代码被VM了,我们还能东扣西扣的了没。看到源码 call puts 与call EspArg1中间可是没有代码的 ,但还是要重新进入虚拟机。
如果您对该加密/解密软件感兴趣,欢迎加入vmpQQ交流群:
标签:
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!