康华 :主要从事 Linux 操作系统内核、虚拟机、Linux 技术标准、计算机安全、软件测试等领域的研究与开发工作,曾就职 MII-HP 软件实验室 、瞬联软件公司/MOTOROLA,现就职于Lenovo研究院 。其所合写的Linux专栏见http://www.csdn.net/subject/linux/。 如果需要可以联系通过 [email protected] (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.SOS将patch二进制代码下载到本地
3.VMM将patch载入到为给定GOS预先划定但未使用的内存空间内(可以通过虚拟一个设备的MMIO空间或者在e820表中预留一个空间作为patch存储空间, 其目的是为了避免让操作系统管理该内存区域)。
4.在GOS中定位待打patch的进程(该方法我将在后续文章中介绍).
5 VMM将patch镜像插入到该进程的地址空间中
为GOS内存中存放的patch镜像建立页表项,并插入到目标进程页表中――此刻patch镜像被映射到的目标进程空间。
6 VMM将对原例程的访问截获,并转而访问patch,从而达到修正bug的作用
6.1 VMM在给定进程空间中找到问题函数
6.2 VMM在问题函数中的头地址插入断点等特权指令。
6.3 当问题函数被调用时,断点会触发虚拟机捕获到访问企图,这时VMM检查确认断点地址是问题函数地址后,将访问地址转向patch地址(修改GOS的IP值),如果不是问题函数则不做处理,直接返回GOS。
补记: 我在sourceforge申请了一个名为VMM Guest OS Process Monitor的开源项目(http://vgpm.wiki.sourceforge.net/),欢迎对虚拟机有兴趣的朋友能来参加.