代码保护软件VMP逆向分析虚拟机指令:VMP代码的提取

转帖|使用教程|编辑:杨鹏连|2021-06-17 13:55:31.100|阅读 46 次

概述:​看了网上大神们写了好多的vmp 虚拟代码的分析 ,但是在对实在项目时,插件总是提示不对或者未知版本,一直对vm代码的还原有质疑,于是就萌发了具体分析这个vm代码是怎么回事,若有错误,欢迎指出,能力有限只能分析皮毛,只谈vm的代码。

# 31款JAVA开发必备控件和工具 # 企业数字化建设合规无风险[专题]

VMProtect是一种很可靠的工具,可以保护应用程序代码免受分析和破解,但只有在应用程序内保护机制正确构建且没有可能破坏整个保护的严重错误的情况下,才能实现最好的效果。

VMProtect通过在具有非标准体系结构的虚拟机上执行代码来保护代码,这将使分析和破解软件变得十分困难。除此之外,VMProtect还可以生成和验证序列号,限制免费升级等等。

下载VMProtect最新试用版

VMProtect正版授权在线订购享受最低价,仅售801元起!还不赶紧加入你的订购清单?>>更多详情可点击咨询购买

相关链接:

代码保护软件VMP逆向分析虚拟机指令:初步认识与环境搭建

二、VM代码的提取

承接上文,我们写了个例子,然后用vmp3.3.1加壳程序把那4句汇编代码给VM了,那么VM的代码是哪里到哪里,我们用OD的run trace去跟踪提取。操作如下:

1.首先下2个断点 在准备进入VM代码和退出VM代码执行未VM代码位置下断点

od view(查看)菜单里面有 run trace 我们 点击进去 然后右键记录到文件 方便我们后面好静态分析
如果你的run trace记录的文件没有汇编 参数等 请百度设置一下trace选项

2.然后我们按F9到达我们第一个断点 在按快捷键Ctrl+F11 跟踪步入 然后到我们的第二个断点,这个时候 我们查看我们run trace查看追踪出的信息 然后右键关闭记录文件 下图是记录的跟踪信息

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

那么到现在我们就把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个块 分析出一个图
那么这个图到底正确不正确或者完善了没呢? 到目前我们分析的我觉得应该是没问题的,目前只是我们的初略分析。

如果您对该加密/解密软件感兴趣,欢迎加入加密/解密QQ交流群:740060302


标签:

本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至hey@evget.com

文章转载自:看雪

为你推荐

  • 推荐视频
  • 推荐活动
  • 推荐产品
  • 推荐文章
  • 慧都慧问
在线咨询
联系我们
TOP
在线客服系统
live chat