?看了 上大神们写了好多的vmp 虚拟代码的分析 ,但是在对实在项目时,插件总是提示不对或者未知版本,一直对vm代码的还原有质疑,于是就萌发了具体分析这个vm代码是怎么回事,若有错误,欢迎指出,能力有限只能分析皮毛,只谈vm的代码。
VMProtect正版授权在线订购享受最低价,仅售801元起!还不赶紧加入你的订购清单/span>>>更多详情可点击咨询购买
相关链接:
代码保护软件VMP逆向分析虚拟机指令:初步认识与环境搭建
二、VM代码的提取
承接上文,我们写了个例子,然后用vmp3.3.1加壳程序把那4句汇编代码给VM了,那么VM的代码是哪里到哪里,我们用OD的run trace去跟踪提取。操作如下:
1.首先下2个断点 在准备进入VM代码和退出VM代码执行未VM代码位置下断点

如果你的run trace记录的文件没有汇编 参数等 请百度设置一下trace选项
2.然后我们按F9到达我们第一个断点 在按快捷键Ctrl+F11 跟踪步入 然后到我们的第二个断点,这个时候 我们查看我们run trace查看追踪出的信息 然后右键关闭记录文件 下图是记录的跟踪信息

然后看看保存的跟踪文件大概是这个样子 我有处理过

那么到现在我们就把vm后的代码给扒下来了 之后我们只要好好分析这个文件就OK了
下面我们先搜索一下我们之前vm的汇编中的常量 我们先搜索第一个 1111 为什么是00001111就不多解释了0041DB98 Main BSWAP ECX ; ECX=000011110041DB9A Main RCR AH,CL0041DB9C Main OR EAX,EBP ; EAX=0041DBFF0041DB9E Main NEG AX ; EAX=004124010041DBA1 Main XOR EBX,ECX ; EBX=0046B5880041DBA3 Main BSR EAX,ESP ; EAX=000000140041DBA6 Main SUB EDI,4 ; EDI=0012FF880041DBAC Main LAHF ; EAX=000006140041DBAD Main MOV DWORD PTR DS:[EDI],ECX
我们去一下混淆
0041DB98 Main BSWAP ECX ; ECX=000011110041DBA6 Main SUB EDI,4 ; EDI=0012FF880041DBAD Main MOV DWORD PTR DS:[EDI],ECX
就这3句有用的 得到00001111 怎么来的我们先不深究 EDI-=4 然后在向 [EDI]=ECX 这个像不像是压栈的操作,栈的增长方向是向下的是吧 栈顶减小就是压栈 (思考一下 那有没有栈顶减小的是出栈呢)。回到上文(一、认识与环境搭建)中我们说了ebp是代表栈,EDI是跳转基址(JumpBase),怎么现在又说这个EDI是代表栈了。莫急我们在往下看看
0041DBBF Main MOV EAX,DWORD PTR DS:[ESI] ; EAX=1AB34C770041DBC1 Main CMP EDX,EDX0041DBC3 Main XOR EAX,EBX ; EAX=1AF5F9FF0041DBC5 Main JMP vmptest_.0046A2FF0046A2FF Main BSWAP EAX ; EAX=FFF9F51A0046A301 Main JMP vmptest_.00476E9500476E95 Main DEC EAX ; EAX=FFF9F51900476E96 Main NOT EAX ; EAX=00060AE600476E98 Main JMP vmptest_.0044E8620044E862 Main DEC EAX ; EAX=00060AE50044E863 Main XOR EBX,EAX ; EBX=0040BF6D0044E865 Main JMP vmptest_.0041F3160041F316 Main ADD EBP,EAX ; EBP=0047E65C0041F318 Main JMP vmptest_.00472E4100472E41 Main LEA EDX,DWORD PTR SS:[ESP+60] ; EDX=0012FF0000472E45 Main TEST DH,AL00472E47 Main CLC00472E48 Main CMP EDI,EDX00472E4A Main JMP vmptest_.0046EE860046EE86 Main JA vmptest_.00480A0500480A05 Main JMP EBP
很乱我们去混淆一下
0041DBBF Main MOV EAX,DWORD PTR DS:[ESI] ; EAX=1AB34C770041DBC3 Main XOR EAX,EBX0046A2FF Main BSWAP EAX ; EAX=FFF9F51A00476E95 Main DEC EAX ; EAX=FFF9F51900476E96 Main NOT EAX ; EAX=00060AE60044E862 Main DEC EAX ; EAX=00060AE50041F316 Main ADD EBP,EAX ; EBP=0047E65C00472E41 Main LEA EDX,DWORD PTR SS:[ESP+60] ; EDX=0012FF0000472E48 Main CMP EDI,EDX0046EE86 Main JA vmptest_.00480A0500480A05 Main JMP EBP
.vmp30:00430A1F 8B EC mov ebp, esp ; ebp 为压环境后esp的值.vmp30:00430A21 81 EC C0 00+ sub esp, 0C0h ; esp下移 0xC0
然后我们之前说了 edi是栈, 因为上面那个语句是edi-=4 然后把00001111赋值给这个EDI指向的地址(其实这里我们截取了VM_PushImm32指令分析的) 是吧, 然后edi就是栈 然后edi这里又与这个esp + 0x60比教, 这里的结果是大于的结果(因为是追踪出来的所以只有一个分支)我们结合这3个块 分析出一个图

如果您对该加密/解密软件感兴趣,欢迎加入加密/解密QQ交流群:
标签:
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!