在host上窥探kvm虚拟机内存

news2024/11/29 2:50:49

   1. kvm内存虚拟化

kvm虚拟机的内存虚拟化,使用了内存转换技术,过程如下:GVA -> GPA -> HVA -> HPA

通过qemu启动了一个8G内存的虚拟机,查看内存smaps,可以发现有个内存就是8G,这个就是guest所使用的物理内存。

利用这个信息就可以窥探虚拟机内存中特定的信息。

2. 虚拟地址转换为物理地址的原理

内核文档 pagemap.txt 中描述如下:

内存中每一个页对应一个64位,也就是8字节的字段。假设虚拟地址为0xfe0020,其转换过程如下:

虚拟地址0xfe0020,其高52位(0xfe0020>>12)为0xfe0,也就是其虚拟页号为0xfe0。那么该虚拟页的信息处于/proc/self/pagemap这个文件中偏移量为0xfe0*8的地方。从此处读取一个8字节的数据,先检查最高位 "Bit 63 page present",如果是1,那么说明该页处于物理内存中,那么该8字节的第0-54位就是物理页号。假设物理页号是0x40,那么实际的物理地址就是(0x40<<12)+0x20=0x40020。

(免费订阅,永久学习)学习地址: Dpdk/网络协议栈/vpp/OvS/DDos/NFV/虚拟化/高性能专家-学习视频教程-腾讯课堂

更多DPDK相关学习资料有需要的可以自行报名学习,免费订阅,永久学习,或点击这里加qun免费
领取,关注我持续更新哦! !   

介绍完原理,下面实现由虚拟地址到物理地址的转换代码就很简单了:

/* gva2gpa.c*/
#include <stdint.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define PFN_MASK         ((((uint64_t)1) << 55) - 1)
#define PFN_PRESENT_FLAG (((uint64_t)1) << 63)

int gva2gpa(unsigned long vir, unsigned long *phy)
{
  int fd;
  int page_size = getpagesize();                // 获取系统页大小, 通常为 4k
  unsigned long vir_page_idx = vir / page_size;
  unsigned long pfn_item_offset = vir_page_idx * sizeof(uint64_t);  // 在pagemap记录文件中的偏移量
  uint64_t pfn_item;
  char *page_map_file = "/proc/self/pagemap";   // pagemap 文件路径

    // 只读方式方式打开
  fd = open(page_map_file, O_RDONLY);

  if (fd < 0) {
    fprintf(stderr, "open %s failed", page_map_file);
    return -1;
  }

    // 定位到 offset 偏移位置
  if ((off_t) - 1 == lseek(fd, pfn_item_offset, SEEK_SET)) {
    fprintf(stderr, "lseek %s failed", page_map_file);
    return -1;
  }

    // 读取对应项的值, 并判断读取位数
  if (sizeof(uint64_t) != read(fd, &pfn_item, sizeof(uint64_t))) {
    fprintf(stderr, "read %s failed", page_map_file);
    return -1;
  }

    // 判断物理页是否在内存中 "Bit  63    page present"
  if (0 == (pfn_item & PFN_PRESENT_FLAG)) {
    fprintf(stderr, "page is not present");
    return -1;
  }

    // 如果在内存上,物理页号加上偏移地址就是物理地址
    // 对应项 bit0-54 位表示物理页号
  *phy = (pfn_item & PFN_MASK) * page_size + vir % page_size;

  return 0;
}

int main(int argc,char *argv[])
{
    uint8_t  *p_gva;
    uint64_t ptr_mem;

    p_gva = malloc(256);
    strcpy(p_gva, "Where am I?");
    printf("%s\n", p_gva);

    if (gva2gpa((unsigned long)p_gva, &ptr_mem) == 0) {
        printf("Physical address is: 0x%llx\n", ptr_mem);
    }

    getchar();
    free(p_gva);
    return 0;
}

在虚拟机上执行上面程序:

通过虚拟机物理地址获取物理机虚拟地址,即 gpa -> hva 。

在物理机上执行:

现在得到了物理机中的虚拟机地址,下面通过两种方法获取虚拟机内存中的信息:

  • 一种方式是通过gdb提供的 x 指令:

  • 另外一种方法是通过 qmp 指令

现在看到的 "Where am I?" 就是虚拟机内存中写入的信息。

原文链接:https://zhuanlan.zhihu.com/p/576412838 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/26613.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Pioneer | X METAVERSE PRO Explores the New Value of “Mining + Finance“

“The mining boom driven by Bitcoin has created many wealth myths: miners can earn 50 BTC every 10 minutes at that time. If you successfully get a Bitcoin block and hold it since 2009, you will have BTC worth $827,930 in your wallet by 2022. “ Cryptocurr…

AE插件:Composite Brush Mac(画面颜色选取替换修改)

Composite Brush for Mac是一款由AEscripts出品的AE画面颜色选取替换修改插件&#xff0c;可以直接在视频画面上选取颜色&#xff0c;然后对选择部分修改替换成自己需要的颜色&#xff0c;有了Composite Brush插件用户可以直接在视频画面上选取自己想要的颜色。 单击并拖动&am…

图像运算和图像增强十一

图像运算和图像增强十一 图像锐化之 Scharr、Canny、LOG 实现边缘检测 &#xff08;1&#xff09;Scharr算子 Scharr算子又称为Scharr滤波器&#xff0c;也是计算x或y方向上的图像差分。Scharr 算子的函数原型如下所示&#xff0c;和 Sobel 算子几乎一致&#xff0c;只是没有…

服务器的区别跟服务器被攻击了怎么解决

大陆服务器都是需要备案的&#xff0c;想必这是众所周知的&#xff0c;备案的过程繁琐且严格。除此之外&#xff0c;备案还有期限的限制&#xff0c;若网站没有在规定的期限内完成备案&#xff0c;可能会导致我们不能在相应的时间内完成建站。而海外服务器是不存在备案的问题的…

【读论文】DIVFusion: Darkness-free infrared and visible image fusion

【读论文】DIVFusion: Darkness-free infrared and visible image fusion介绍网络结构SIDNet损失函数TCEFNetGRM&#xff08;梯度保持模块&#xff09;CEM&#xff08;对比度增强模块&#xff09;损失函数总结参考论文&#xff1a;https://www.sciencedirect.com/science/artic…

IPv6与VoIP——ipv6接口标识与VoIP概述

作者简介&#xff1a;一名在校云计算网络运维学生、每天分享网络运维的学习经验、和学习笔记。 座右铭&#xff1a;低头赶路&#xff0c;敬事如仪 个人主页&#xff1a;网络豆的主页​​​​​​ 目录 前言 一.ipv6接口标识符 1.IPv6接口标识符有以下几种 基于EUI-64地址…

[附源码]java毕业设计校园一卡通管理信息系统台

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

Go:交互式提示工具go-prompt简介

文章目录简介一、代码示例二、使用go-prompt的项目三、特性1. 强大的自动完成2. 灵活的功能选项3. 快捷键4. 历史记录5. 跨平台支持小结简介 受python提示工具包的启发&#xff0c;在Go中构建强大的交互式提示 一、代码示例 package mainimport ("fmt""githu…

Oracle在Logstash需求中碰到的问题处理方式

Oracle对空值(NULL)的5种处理 在公司Logstash相关需求中,为了方便sql语句更加简洁,所以需要使用到Oracle中的视图,在视图创建过程中,遇到有关对Null值的处理,这里做一个整理,方便日后查询 COALESCE函数 COALESCE&#xff08;expr1&#xff0c;expr2&#xff0c;expr3&#x…

【python】PyQt5的环境搭建和使用

什么是pyQT pyqt是一个用于创建GUI应用程序的跨平台工具包&#xff0c;它将python与qt库融为一体。也就是说&#xff0c;pyqt允许使用python语言调用qt库中的API。这样做的最大好处就是在保存了qt高运行效率的同时&#xff0c;大大提高开发效率。因为&#xff0c;使用python语…

【Spring Cloud实战】SpringCloud Sleuth分布式请求链路跟踪

gitee地址&#xff1a;https://gitee.com/javaxiaobear/spring-cloud_study.git 在线阅读地址&#xff1a;https://javaxiaobear.gitee.io/ 1、概述 在微服务框架中&#xff0c;一个由客户端发起的请求在后端系统中会经过多个不同的的服务节点调用来协同产生最后的请求结果&…

HTML5期末大作业 HTML+CSS+JavaScript美食坊美食购物主题(15页)

&#x1f380; 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业…

数据上云,如何解除用户对厂商监守自盗的担忧?

企业数字化转型中&#xff0c;安全从来都是企业用户最为关心和敏感的问题之一。对于数据上云&#xff0c;很多企业持保留态度。作为数字化转型服务商&#xff0c;如何解除用户对厂商监守自盗的担忧&#xff1f; 1.敏感的数据安全与用户的普遍认识 企业用户普遍对数据安全是极其…

湖北绝缘监测仪矿业煤炭石油金矿玉矿铁矿铜矿矿井钢厂

安科瑞 华楠 自第一次工业革命开始&#xff0c;人类社会进入工业时代。随着工业科技的发展&#xff0c;漏电流对工业生产安全构成了很大的威胁。为了提高供电的连续性、可靠性和安全性&#xff0c;许多重要生产场所也采用了IT配电系统&#xff08;不接地供电系统&#xff09;。…

使用CyberController来将旧手机改造成电脑外挂------手机交互翻译、人脸解锁、语音识别....各个功能等你来探索

文章目录前言操作PC端安装Python环境调试代码设置开机启动HMS Core API申请注册账号创建应用填写基本信息填写应用信息软件图标应用的截图应用分类API信息设置添加对应的包名勾选机器学习服务复制API信息将JSON信息保存下来安卓端安装开发工具修改源码克隆项目打开项目修改包名…

水滴邮件营销:让企业营销更简单

企业在利用邮件开发客户、推广产品的时候&#xff0c;最终目的是想产生转化&#xff0c;获得收益。邮件营销有他得天独厚的优势&#xff0c;它为买卖双方提供了一个交流平台&#xff0c;并且只要收件人同意&#xff0c;企业就可以长期对其进行个性化营销。这为企业积累长期忠实…

缘来交友网站的设计与实现(源码+数据库+论文+开题报告+说明文档)

项目描述 临近学期结束&#xff0c;还是毕业设计&#xff0c;你还在做java程序网络编程&#xff0c;期末作业&#xff0c;老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。这里根据疫情当下&#xff0c;你想解决的问…

DDANet: Dual Decoder Attention Network for Automatic Polyp Segmentation

双decoder用于息肉分割。文章的创新点在与使用了双分支的decoder&#xff0c;单encoder的结构。decoder的第二个分支会产生注意力map&#xff0c;在代码中体现为输出通道为1。这个和之前看的confidence map很像。 看一下文章的结构图&#xff1a; 在decoder中&#xff0c;第二…

小米手机买什么蓝牙耳机好?适配小米手机的蓝牙耳机推荐

作为一位音乐爱好者&#xff0c;拥有一款好的耳机是非常重要的。无线蓝牙耳机的出现就为喜欢听音乐的伙伴们提供了一个很好的选择&#xff0c;既不会有耳朵的胀痛&#xff0c;也不会影响享受音乐的体验&#xff0c;小米手机近几年也是深受大众欢迎&#xff0c;因此&#xff0c;…

【数据结构Note5】-二叉排序树 BST和平衡二叉树AVL

二叉排序树BST 二叉排序树&#xff0c;又称二叉查找树&#xff08;BST&#xff0c;Binary Search Tree&#xff09; 二叉排序树是左子树节点值<根节点值<右子树节点值的二叉树 所以对二叉排序树进行中序遍历会得到一个递增的序列&#xff08;左子树-根-右子树&#xff09…