代码保护软件VMP代码的提取
VMProtect是一种很可靠的工具,可以保护应用程序代码免受分析和破解,但只有在应用程序内保护机制正确构建且没有可能破坏整个保护的严重错误的情况下,才能实现最好的效果。
VMProtect通过在具有非标准体系结构的虚拟机上执行代码来保护代码,这将使分析和破解软件变得十分困难。除此之外,VMProtect还可以生成和验证序列号,限制免费升级等等。
下载VMProtect最新试用版【慧都网】
二、VM代码的提取
承接上文,我们写了个例子,然后用vmp3.3.1加壳程序把那4句汇编代码给VM了,那么VM的代码是哪里到哪里,我们用OD的run trace去跟踪提取。操作如下:
1.首先下2个断点 在准备进入VM代码和退出VM代码执行未VM代码位置下断点
![](https://image.evget.com/attachment/keditor/image/20210617/20210617135127_54204.png)
od view(查看)菜单里面有 run trace 我们 点击进去 然后右键记录到文件 方便我们后面好静态分析
如果你的run trace记录的文件没有汇编 参数等 请百度设置一下trace选项
2.然后我们按F9到达我们第一个断点 在按快捷键Ctrl+F11 跟踪步入 然后到我们的第二个断点,这个时候 我们查看我们run trace查看追踪出的信息 然后右键关闭记录文件 下图是记录的跟踪信息
![](https://image.evget.com/attachment/keditor/image/20210617/20210617135206_28027.png)
然后看看保存的跟踪文件大概是这个样子 我有处理过
![](https://image.evget.com/attachment/keditor/image/20210617/20210617135220_38285.png)
那么到现在我们就把vm后的代码给扒下来了 之后我们只要好好分析这个文件就OK了
下面我们先搜索一下我们之前vm的汇编中的常量 我们先搜索第一个 1111 为什么是00001111就不多解释了
0041DB98 Main BSWAP ECX ; ECX=00001111 0041DB9A Main RCR AH,CL 0041DB9C Main OR EAX,EBP ; EAX=0041DBFF 0041DB9E Main NEG AX ; EAX=00412401 0041DBA1 Main XOR EBX,ECX ; EBX=0046B588 0041DBA3 Main BSR EAX,ESP ; EAX=00000014 0041DBA6 Main SUB EDI,4 ; EDI=0012FF88 0041DBAC Main LAHF ; EAX=00000614 0041DBAD Main MOV DWORD PTR DS:[EDI],ECX
我们去一下混淆
0041DB98 Main BSWAP ECX ; ECX=00001111 0041DBA6 Main SUB EDI,4 ; EDI=0012FF88 0041DBAD 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=1AB34C77 0041DBC1 Main CMP EDX,EDX 0041DBC3 Main XOR EAX,EBX ; EAX=1AF5F9FF 0041DBC5 Main JMP vmptest_.0046A2FF 0046A2FF Main BSWAP EAX ; EAX=FFF9F51A 0046A301 Main JMP vmptest_.00476E95 00476E95 Main DEC EAX ; EAX=FFF9F519 00476E96 Main NOT EAX ; EAX=00060AE6 00476E98 Main JMP vmptest_.0044E862 0044E862 Main DEC EAX ; EAX=00060AE5 0044E863 Main XOR EBX,EAX ; EBX=0040BF6D 0044E865 Main JMP vmptest_.0041F316 0041F316 Main ADD EBP,EAX ; EBP=0047E65C 0041F318 Main JMP vmptest_.00472E41 00472E41 Main LEA EDX,DWORD PTR SS:[ESP+60] ; EDX=0012FF00 00472E45 Main TEST DH,AL 00472E47 Main CLC 00472E48 Main CMP EDI,EDX 00472E4A Main JMP vmptest_.0046EE86 0046EE86 Main JA vmptest_.00480A05 00480A05 Main JMP EBP
很乱我们去混淆一下
0041DBBF Main MOV EAX,DWORD PTR DS:[ESI] ; EAX=1AB34C77 0041DBC3 Main XOR EAX,EBX 0046A2FF Main BSWAP EAX ; EAX=FFF9F51A 00476E95 Main DEC EAX ; EAX=FFF9F519 00476E96 Main NOT EAX ; EAX=00060AE6 0044E862 Main DEC EAX ; EAX=00060AE5 0041F316 Main ADD EBP,EAX ; EBP=0047E65C 00472E41 Main LEA EDX,DWORD PTR SS:[ESP+60] ; EDX=0012FF00 00472E48 Main CMP EDI,EDX 0046EE86 Main JA vmptest_.00480A05 00480A05 Main JMP EBP
我们看到esi 还是bytescode 他这里是得到了跳转间隔密文, 我们往的话发现之前的00001111值也是从esi中得到密文解密出来的,那么说明esi里面不仅存在数据常量也有跳转间隔, 而且他们都是密文 然后回到这里 我们又发现 ebp变为了跳转base(JumpBase)。看到00472E41 这条指令 给edx赋值 esp + 0x60 你还记得最开始虚拟机入口时 那两句汇编吗
.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个块 分析出一个图
![](https://image.evget.com/attachment/keditor/image/20210617/20210617135420_77024.png)
那么这个图到底正确不正确或者完善了没呢? 到目前我们分析的我觉得应该是没问题的,目前只是我们的初略分析。
如果您对该加密/解密软件感兴趣,欢迎加入vmpQQ交流群:740060302