文章目录

  • 示例代码
  • VM完整流程分析
    • VM解码循环
    • 保存寄存器环境
    • 压入EBP和偏移
    • 执行函数
    • 恢复寄存器环境
  • 总结

示例代码

示例代码如下:

#include "stdafx.h"
#include <Windows.h>int Calc(int a,int b)
{return a + b;}int main(int argc, char* argv[])
{Calc(2,3);getchar();return 0;
}

同样用VMP1.09对程序进行加壳,只对两句代码进行VM处理。

这次的目的是为了分析虚拟机,选择最小保护。

VM完整流程分析

来到Calc函数当前堆栈值为+0的位置的返回地址,+4和+8的位置是Calc函数的参数

VM解码循环

接着VM开始部分的代码和之前分析过的一样,取指令流然后跳转到handler。

区别于VM最大保护的版本,最小保护的VM代码少了解密指令流的部分,解密Key中保存的就是真实的VM指令流。

保存寄存器环境

首先handler执行代码保存当前的寄存器环境,保存的寄存器环境和保存后的VM_Context如下:

当前堆栈
$ ==>    > 00000000--->第二个密钥
$+4      > 0019FED0--->EDI
$+8      > 00401520--->ESI
$+C      > 0019FED0--->EBP
$+10     > 0019FE7C--->ESP
$+14     > 00309000--->EBX
$+18     > 021E0FC0--->EDX
$+1C     > 00000000--->ECX
$+20     > CCCCCCCC--->EAX
$+24     > 00000206--->EFlags
VM_Context
$ ==>    >CCCCCCCC--->EAX
$+4      >00000206--->EFlags
$+8      >0019FED0--->EDI
$+C      >00000000--->第二个密钥
$+10     >00000000--->ECX
$+14     >02210FC0--->EDX
$+18     >000B8FA5--->
$+1C     >F609851D--->
$+20     >E654F2EE--->
$+24     >0019FED0--->EBP
$+28     >003CA000--->EBX
$+2C     >00401520--->ESI

压入EBP和偏移

VM代码保存完了寄存器之后,就要开始执行程序原本的功能了

执行完三个handler之后,VM压入了三个值,分别是

$ ==>    > 00000008
$+4      > 0019FED0
$+8      > 0000000C

其中8和C是偏移,而0019FED0是EBP的地址,再来看一下EBP的值

0019FED0  0019FF30
0019FED4  00401126  返回到 VMTest_v.main+26 来自 VMTest_v.0040100A
0019FED8  00000002
0019FEDC  00000003

EBP+8和+C的位置正好是被VM函数的两个参数,VM识图通过这种方式来取到参数,进行运算

执行函数

接着handler将参数一保存到VM_Context+0x20的位置

接着handler执行函数代码,将两个参数相加,结果保存在堆栈中

接着将计算结果保存在VM_Context+0x1C的位置。当前VM寄存器环境如下:

VM_Context
$ ==>    >CCCCCCCC--->EAX
$+4      >00000206--->EFlags
$+8      >0019FED0--->EDI
$+C      >00000000--->第二个密钥
$+10     >00000000--->ECX
$+14     >02210FC0--->EDX
$+18     >000B8FA5--->
$+1C     >F609851D--->计算结果
$+20     >E654F2EE--->参数
$+24     >0019FED0--->EBP
$+28     >003CA000--->EBX
$+2C     >00401520--->ESI

恢复寄存器环境

接着将VM_Context中的寄存器恢复到堆栈中,然后再从堆栈将数据恢复到寄存器

函数返回时,功能执行完成。至此,走完了整个VM的虚拟机流程

总结

VM代码流程总结如下:

  1. 保存寄存器环境到堆栈
  2. 将堆栈的寄存器环境保存到VM_Context
  3. 执行真正的函数代码
  4. 恢复VM_Context到堆栈
  5. 恢复寄存器

VMP分析之VMP1.09虚拟化架构分析(二)相关推荐

  1. 2022CTF培训(十三)虚拟化QEMU架构分析QEMU CVE示例分析

    附件下载链接 虚拟化技术基本概念 硬件虚拟化 全虚拟化 提供可以完全模拟基础硬件的VME 可以在VM中运行任何能够在物理硬件上执行的软件,并且可以在每个单独的VM中运行基础硬件支持的任何OS 为每个V ...

  2. b2c项目基础架构分析(一)b2c 大型站点方案简述 已补充名词解释

    b2c项目基础架构分析(一)b2c 大型站点方案简述 已补充名词解释 我最近一直在找适合将来用于公司大型bs,b2b b2c的基础架构. 实际情况是要建立一个bs架构b2b.b2c的网站,当然还包括w ...

  3. b2c项目基础架构分析(二)前端框架 以及补漏的第一篇名词解释

    b2c项目基础架构分析(二)前端框架 以及补漏的第一篇名词解释 继续上篇,上篇里忘记了也很重要的前端部分,今天的网站基本上是以一个启示页,然后少量的整页切换,大量的浏览器后台调用web服务局部.动态更 ...

  4. NPU架构分析与应用

    NPU架构分析与应用 参考文献链接 https://mp.weixin.qq.com/s/62P8zVF7rySLakZJEkd7VA https://mp.weixin.qq.com/s/hvzwC ...

  5. Deep Learning论文笔记之(六)Multi-Stage多级架构分析

    Deep Learning论文笔记之(六)Multi-Stage多级架构分析 zouxy09@qq.com http://blog.csdn.net/zouxy09          自己平时看了一些 ...

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

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

  7. 【嵌入式Linux学习七步曲之第五篇 Linux内核及驱动编程】PowerPC + Linux2.6.25平台下的I2C驱动架构分析

    PowerPC + Linux2.6.25平台下的I2C驱动架构分析 Sailor_forever  sailing_9806#163.com (本原创文章发表于Sailor_forever 的个人b ...

  8. 【嵌入式Linux学习七步曲之第五篇 Linux内核及驱动编程】PowerPC + Linux2.6.25平台下的SPI驱动架构分析

    PowerPC + Linux2.6.25平台下的SPI驱动架构分析 Sailor_forever  sailing_9806#163.com (本原创文章发表于Sailor_forever 的个人b ...

  9. Linux虚拟化KVM-Qemu分析(八)之virtio初探

    目录 概述 1. 网卡 1.1 网卡工作原理 1.2 Linux网卡驱动 2. 网卡全虚拟化 2.1 全虚拟化方案 2.2 弊端 3. 网卡半虚拟化 3.1 virtio 3.2 半虚拟化方案 参考 ...

最新文章

  1. python爬虫超时重试_Python爬虫实例(三):错误重试,超时处理
  2. Mysql在离线安装时提示:error: Found option without preceding group in config file
  3. 第二天学习Java的笔记
  4. asp.net防类似DDOS攻击(CC攻击)代码
  5. 设计模式之模板方法模式实战解析
  6. php将get传参解析成数组,php解析url (parse_url) 参数成数组 (parse_str)
  7. centos7限制普通用户访问单一目录下的单一文件
  8. 兔子运送胡萝卜_我如何建立和运送第一个MVP
  9. 刚装的fedora16测试时出现莫名包
  10. phantom.js - HTML To PDF
  11. 调用webservice,解析返回数据为xml格式的字符串,进行数据绑定
  12. 鸿蒙系统和安装包,鸿蒙系统安装包
  13. 心电信号越界怎么回事_人体心电信号的特点
  14. 计算机网络工程教程,计算机网络工程实用教程ppt课件
  15. Scala中的Option
  16. 类人猿易语言云控系统开发 + 附加安卓模拟器中控+ 内存操控 系列课程
  17. CMD快捷指令之磁盘检查(管理员身份运行命令提示符)
  18. 【离散数学】数学归纳法
  19. Linux内核错误码和错误指针
  20. 【应用场景】智能定位胸牌帮你识别高质量月嫂

热门文章

  1. Py之cv2:cv2库(OpenCV,opencv-python)的简介、安装、使用方法(常见函数、方法等)最强详细攻略
  2. BootStrap Table - JS事件绑定
  3. SQL Server 查找统计信息的采样时间与采样比例
  4. 如果在chrome的新标签中继续打开开发工具
  5. 多对多的属性对应表如何做按照类别的多属性匹配搜索
  6. Divide and conquer:K Best(POJ 3111)
  7. CentOs Linux 文件位置标记
  8. 生成Base58格式的UUID(Hibernate Base64格式的UUID续)
  9. 第七章 综合练习 第四题
  10. 解决2003不支持FLV的方法