文章目录

  • 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虚拟机

VMP分析之VMP2.13流程分析(三)相关推荐

  1. VMP分析之VMP2.13插件化分析(四)

    文章目录 Zeus插件 相关介绍 初始化Key并解密 加载操作码 解密操作码 取handler 解密handler 进入handler 保存堆栈 指令流解密Key VMP分析插件 相关介绍 VM分析插 ...

  2. 代码覆盖率原理分析:sys.settrace流程分析

    sys.settrace分析环境 本文环境python3.5.2 sys.settrace函数执行 首先我们继续查看示例代码如下: import sysdef trace(frame, event, ...

  3. linux意外重启分析,Linux关机重启流程分析

    linux下的关机和重启流程对于一般的桌面应用和网络服务器来说并不重要,但是在用户自己定义的嵌入式系统内核中就有一定的研究意义,通过了解Linux 关机重启的流程,我们对它可以修改和自定义,甚至以此为 ...

  4. Framework原理分析之——Zygote进程流程分析

    在启动Zygote进程的分析中,我们知道其实是通过系统调用fork()函数来创建一个进程,然后执行Zygote.rc中的执行文件,从而开始Zygote进程业务. 本篇文章我们就来分析大名鼎鼎的Zygo ...

  5. [Abp vNext 源码分析] - 1. 框架启动流程分析

    一.简要说明 本篇文章主要剖析与讲解 Abp vNext 在 Web API 项目下的启动流程,让大家了解整个 Abp vNext 框架是如何运作的.总的来说 ,Abp vNext 比起 ABP 框架 ...

  6. 【neutron源码分析】neutron-server启动流程分析

    Neutron为Openstack的网络组件,其内部功能均是以plugin形式实现的,其中代表性的plugin就是ml2和l3,下面将从neutron启动的源码来分析neutron加载和扩展插件的流程 ...

  7. Android 8.1 PowerManagerService分析(四)——亮屏流程分析

    欢迎大家关注我的掘金帐号 我会在那里定期更新最新版本的Android Framework源码分析! 相关文章: [Android Framework] 8.1 PowerManagerService分 ...

  8. 测试用例设计方法:场景分析法(又名流程分析法)

    分享一个大牛的人工智能教程.零基础!通俗易懂!风趣幽默!希望你也加入到人工智能的队伍中来!请轻击人工智能教程 场景分析法 分析软件应用的场景,从用户的角度出发,从场景的角度来设计测试用例,是一种面向用 ...

  9. ARChon 分析之七:启动流程分析

    引文 通过前面几篇文章的介绍,现在来看ARChon的js代码就简单多了.基础代码是 ARC 的运行环境.然后ChromeApp启动,ChromeApp在配置项中配置了apk的路径.然后调用 ARCho ...

最新文章

  1. lodash 工具库
  2. leetcode算法题--回文子串
  3. 山西职称计算机考试报名时间 2014,2014山西省6月份职称计算机考试报名入口
  4. 什么是web2py框架?它有什么作用呢?
  5. web前端开发的好工具sublime
  6. java arraylist 添加对象_如何在Java中将对象添加到ArrayList
  7. 面向项目(六)—— 错误(异常)信息的书写
  8. vue中怎么点击修改文字_怎么拍照识别文字?什么软件可以识别照片中文字?
  9. PHP中date()日期函数有关参数整理
  10. 打开.mpp文件有感
  11. Hudi-通过Hive查询hudi表数据
  12. 大陆、港澳台身份证、护照、军官证的正则表达式
  13. 武汉工程大学第一届程序设计女生赛(牛客contest 4746)解题报告 Apare_xzc
  14. 第四章 大数定律与中心极限定理(总结)
  15. 周末作业-循环练习题(未完)
  16. C++ typename的起源与用法
  17. 日语学习之——长音促音
  18. 传神语联网完美塑造“惊奇队长” 展现影视译制的突围之路
  19. 2023年值得关注的20大网络安全趋势
  20. 【UE4】模仿《黑暗之魂》系列游戏制作一个简单的锁定敌人的功能

热门文章

  1. Process.GetCurrentProcess 方法的VB.NET例子
  2. 全世界最让人无语的脑筋急转弯
  3. 计算机体系结构考试题及知识点,2018年10月自考02325计算机系统结构真题及答案...
  4. Spark高手之路1—Spark简介
  5. Android 背景虚化实现
  6. 在word中把波浪符号打在数字正中间
  7. 小米路由器wifi不可用,有线却正常
  8. rocketmq存储消息mysql_再说rocketmq消息存储
  9. 下载: eMule 0.46b 2005-07-05
  10. linux环境下DOL的配置