现在的位置: 首页 > 综合 > 正文

谈由VMM在运行时为GUEST OS 中给定进程打PATCH的方法

2013年10月03日 ⁄ 综合 ⁄ 共 1387字 ⁄ 字号 评论关闭

 谈由VMM在运行时为GUEST OS 中给定进程打PATCH的方法

康华 :主要从事 Linux 操作系统内核、虚拟机、Linux 技术标准、计算机安全、软件测试等领域的研究与开发工作,曾就职 MII-HP 软件实验室 瞬联软件公司/MOTOROLA,现就职于Lenovo研究院 。其所合写的Linux专栏见http://www.csdn.net/subject/linux/。 如果需要可以联系通过 kanghua151@msn.com (MSN)联系我.   

背景介绍:

    在一些要求7×24小时不间断服务的环境下或不希望被用户察觉的情况下,要求能在不重新启动系统,甚至不能重新启动服务进程的条件下,运行时修正给定进程中的bug. 这就要求动态运行时为给定进程打patch. 传统的做法是由目标操作系统将patch镜像插入到给定进程地址空间中,然后在给定进程中的问题函数地址头处插入跳转指令,将其跳转到patch中执行,从而达到了函数替换目的.

        在虚拟环境下,实现上述功能不需要照搬native环境下的做法.因此可以利用虚拟环境的特性,更高效的实现运行时打patch的要求. 本文就在虚拟环境下为GUEST OS(简称GOS)的给定进程打patch提出了实现方法.

技术特点和优点:

1.  核心要点:利用VMM对GOS的监控能力,实现在后台为GOS的给定进程打patch,完成修复GOS中代码bug的目的.

2.  该方法不需要GOS做任何改动, 具有普遍性.

3.  该方法由VMM执行,GOS透明和用户都透明,因此更隐秘和可靠.

具体实现过程:

       1 GOS中给定进程制作PATCH ((要依据该程序的符号表,将patch编译成无头信息的二进制可执行代码)

            1.1 根据给定进程的符号表,获得问题函数的头地址。

            1.2 将完善后的PATCH源文件,进行编译无头信息二进制执行文件,其编译地址指定为问题函数的头地址。

      2.SOSpatch二进制代码下载到本地

      3.VMMpatch载入到为给定GOS预先划定但未使用的内存空间内(可以通过虚拟一个设备的MMIO空间或者在e820表中预留一个空间作为patch存储空间, 其目的是为了避免让操作系统管理该内存区域)

     4.GOS中定位待打patch的进程(该方法我将在后续文章中介绍).

     5 VMMpatch镜像插入到该进程的地址空间中

GOS内存中存放的patch镜像建立页表项,并插入到目标进程页表中――此刻patch镜像被映射到的目标进程空间。

    6 VMM将对原例程的访问截获,并转而访问patch,从而达到修正bug的作用

        6.1 VMM在给定进程空间中找到问题函数

        6.2 VMM在问题函数中的头地址插入断点等特权指令。

        6.3 当问题函数被调用时,断点会触发虚拟机捕获到访问企图,这时VMM检查确认断点地址是问题函数地址后,将访问地址转向patch地址(修改GOSIP值),如果不是问题函数则不做处理,直接返回GOS

补记: 我在sourceforge申请了一个名为VMM Guest OS Process Monitor的开源项目(http://vgpm.wiki.sourceforge.net/),欢迎对虚拟机有兴趣的朋友能来参加.


抱歉!评论已关闭.