其他分享
首页 > 其他分享> > VMP分析之VMP2.13流程分析(三)

VMP分析之VMP2.13流程分析(三)

作者:互联网

文章目录

VMP2.X版本特点

2.X版本的VMP相对于1.0版本来说有下面的变化

  1. 自我膨胀,增加了大量混淆指令
  2. VM_Context的存放方式由内存改为栈,vmp1区段也没有了
  3. 有专门分析插件,可以帮助分析和理解
  4. 整体结构有所变化

VMP2.13加壳

这次利用插件来对VMP2.13.8版本进行分析,首先对目标程序进行加壳,选择最小保护,只分析VM的虚拟机部分

在这里插入图片描述

VMP2.13代码分析

进入VM虚拟机

在这里插入图片描述

和之前一样,进入虚拟机开始压入了一个指令流解密Key和密钥,区别之前的1.0版本,这个指令流解密Key是加密后的。

0042DAE3    9C              pushfd
0042DAE4    883424          mov     byte ptr [esp], dh
0042DAE7    9C              pushfd
0042DAE8    66:894C24 04    mov     word ptr [esp+4], cx
0042DAED    8D6424 08       lea     esp, dword ptr [esp+8]           ; esp=esp+8

中间的这一串指令都是混淆代码,执行前后堆栈没有发生改变,没有的实际用处。

保存堆栈

到这里按照之前的经验应该开始保存寄存器环境了,这里记录下进入VM后的栈情况。

相对于1.0版本来说,2.X版本保存堆栈相对比较复杂,刚开始分析起来有点晕。

$-8      > 502585E5--->第二个解密Key
$-4      > 92766AB7--->指令流解密Key
$ ==>    > 0019FF30--->进入VM时的ESP

保存eflags和edx

在这里插入图片描述

继续往下分析,VM开始将edx保存到堆栈,此时堆栈环境如下:

$-10     > 00650F90--->edx
$-C      > 00000302--->eflags
$-8      > 502585E5--->第二个解密Key
$-4      > 92766AB7--->指令流解密Key
$ ==>    > 0019FF30--->进入VM时的ESP

保存ecx和edi

在这里插入图片描述

继续往下,VM保存了edi和ecx。中间的花指令用来干扰我们分析,不需要深究,实时关注堆栈变化就行。此时的堆栈情况如下:

$-18     > 00000000--->ecx
$-14     > 0019FED8--->edi
$-10     > 00650F90--->edx
$-C      > 00000302--->eflags
$-8      > 502585E5--->第二个解密Key
$-4      > 92766AB7--->指令流解密Key
$ ==>    > 0019FF30--->进入VM时的ESP

保存ebx

在这里插入图片描述

接着保存ebx

$-1C     > 003FC000--->ebx
$-18     > 00000000--->ecx
$-14     > 0019FED8--->edi
$-10     > 00650F90--->edx
$-C      > 00000302--->eflags
$-8      > 502585E5--->第二个解密Key
$-4      > 92766AB7--->指令流解密Key
$ ==>    > 0019FF30--->进入VM时的ESP

保存eax

在这里插入图片描述

接着继续保存eax

$-20     > CCCCCCCC--->eax
$-1C     > 003FC000--->ebx
$-18     > 00000000--->ecx
$-14     > 0019FED8--->edi
$-10     > 00650F90--->edx
$-C      > 00000302--->eflags
$-8      > 502585E5--->第二个解密Key
$-4      > 92766AB7--->指令流解密Key
$ ==>    > 0019FF30--->进入VM时的ESP

保存ebx ebp和esi

接着保存ebx ebp和esi

在这里插入图片描述

$-2C     > 0019FE8C--->esi
$-28     > 0019FED8--->ebp
$-24     > 003FC000--->ebx
$-20     > CCCCCCCC--->eax
$-1C     > 003FC000--->ebx
$-18     > 00000000--->ecx
$-14     > 0019FED8--->edi
$-10     > 00650F90--->edx
$-C      > 00000302--->eflags
$-8      > 502585E5--->第二个解密Key
$-4      > 92766AB7--->指令流解密Key
$ ==>    > 0019FF30--->进入VM时的ESP

至此,堆栈保存完毕,开始进入VM解码循环

VM解码循环

区别于1.0的版本,2.X版本的VM解码循环需要将指令流解密Key进行解密。

解密指令流key

在这里插入图片描述

接着将esi和第一次压入的Key相加,开始解密esi

在这里插入图片描述

esi解密完成后的地址所指向的内容就是VM的指令流。

解密操作码

在这里插入图片描述

接着开始从指令流中取操作码

在这里插入图片描述

然后解密操作码

取加密过的handler

在这里插入图片描述

让vmEip指向下一个指令流之后,开始取handler,这个handler是经过加密的,需要解密以后才能跳转到正确的地址执行代码

解密handler

在这里插入图片描述

handler经过解密后,指向了正确的跳转地址

在这里插入图片描述

然后用push+ret的方式跳转到handler

解密操作数

在这里插入图片描述

跳转到handler之前,继续从指令流中取操作数并解密,解密完成后更新解密Key

执行handler功能

在这里插入图片描述

解密Key更新完成,开始执行handler功能,让vpEip++

在这里插入图片描述

执行完成后,跳转到解码循环开始的位置,开始新的解码循环。

VMP2.13流程总结

VMP2.13版本的代码流程总结如下:

  1. 进入VM虚拟机
  2. 保存堆栈环境
  3. 解密指向指令流的Key
  4. 解密操作码
  5. 取加密过的handler
  6. 解密handler
  7. 解密操作数
  8. 执行handler功能代码
  9. 开始新的VM解码循环
  10. 还原堆栈,退出VM虚拟机

标签:分析,VMP2.13,解密,VM,---,指令流,handler,Key,VMP
来源: https://blog.csdn.net/qq_38474570/article/details/120687366