intel VT——系统调用的截获

VMM要截获guest os的系统,在硬件虚拟化的环境下用什么方法。

系统调用的实现:

windows:

1、0x2e号中断。这由用户态转向核心态,通过执行一条 int 0x2e指令。cpu完全相应的转换。这种方式用在windows 2000之前。

2、快速系统调用。陷入的方式进入核心态,cpu需要完成的操作太多,太慢。于是,intel发明一种新的机制,增加了两条新的指令。大大提高了系统调用的速度。详情见:

http://blog.csdn.net/misterliwei/archive/2009/07/15/4351592.aspx 只要你的CPU不是很老,都支持。

linux:与windows不同的是,中断号码为0x80,其他都一样。

在vt-x架构下的VMM要和guest os通信的标准机制就是 VM exit 和VM entry方式。通过在

VMCS(详情这里)设置,使得guest os 在发生某些情况的时候,从客户机退出来,进入VMM实现设置好的函数里面处理。

在kvm中,默认的没有打开快速系统调用。所以客户机用的是中断的形式。好了。我还没想好。而且事实证明,我的写作不是一般的烂。

终于搞好了。由于LIDT指令不能每个机器都可以拦截到的。因为要看一个MSR寄存器的值,但是具体的忘记了intel的手册上有的。

在kvm源代码里面,初始化第二哥执行控制指令的代码的时候是读取这个msr的。在我的机器上是0x41,。所有描述表退出不支持。所以只能检测什么时候idtr里面的值大于0x80000000了才表示xp已经写上去了。之后检测2e号表项不为0.就说明系统调用的地址已经写上去了。这时候可以改了。注意这些检测都是在vmexit的时候做的。guestos 已经运行起来之后,不能强行终止的。由于机器的限制,同时只有两个线程运行。并不是并行的,因此一定不是说停就停的。可以将这个地址改为全f的。kvm默认只有发送页错误。并且是由于页保护权限错误的时候才vmexit。所以必须手动改。所有的都要退出。写vmcs的两个字段。页错误屏蔽字段和匹配字段全0.就可以了/。。快速系统调用是一样的道理。最新的kvm内核好像已经支持快速系统调用了。工具检测的。

kvm的图形能力还是不怎么行。还要加强啊。不过kvm蛮简单,比xen要简单很多。适合学习硬件虚拟化技术。并实践下。

有人用硬件虚拟化技术做了一个恶意软件分析软件。我还想用这个来检测软件的漏洞。

留下评论