栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 系统运维 > 运维 > Linux

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

Linux 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

文章目录
    • VMP2.X版本特点
    • VMP2.13加壳
    • VMP2.13代码分析
      • 进入VM虚拟机
      • 保存堆栈
        • 保存eflags和edx
        • 保存ecx和edi
        • 保存ebx
        • 保存eax
        • 保存ebx ebp和esi
      • VM解码循环
        • 解密指令流key
        • 解密操作码
        • 取加密过的handler
        • 解密handler
        • 解密操作数
        • 执行handler功能
    • 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虚拟机
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/309174.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号