有谁知道定时检查是否仍然可以检测虚拟环境?我尝试使用 rdtsc 指令来获取 CPU 周期,并比较真实 Linux 机器和在 VirtualBox 上运行的 Linux 之间的结果。但结果似乎并不稳定。有时,真实机器的 CPU 周期甚至比虚拟机中的还要大。该技术是否假设 CPU 速度等硬件相同?如果是这样,我很困惑它是如何运作的。我什至找不到真实环境和虚拟环境之间明显的界限。有谁知道可能出了什么问题吗?这是我的实现:
#define rdtsc(low,high) \
asm volatile ("rdtsc" : "=a" (low), "=d" (high))
typedef struct {
int lo;
int hi;
} longpair;
typedef union {
longpair ll;
long long t;
} timestamp;
void test(){
printf("test");
}
int main(int argc, char* argv[])
{
timestamp a,b,c;
int i;
rdtsc(a.ll.lo,a.ll.hi);
test();
rdtsc(b.ll.lo,b.ll.hi);
c.t = b.t-a.t;
}
Some results on virtualbox are:
c(hi) = 0 c(lo) = 36162
c(hi) = 0 c(lo) = 41468
c(hi) = 0 c(lo) = 85921
c(hi) = 0 c(lo) = 38840
c(hi) = 0 c(lo) = 24126
Some in real machine are:
c(hi) = 0 c(lo) = 52045
c(hi) = 0 c(lo) = 48382
c(hi) = 0 c(lo) = 47719
c(hi) = 0 c(lo) = 48535
c(hi) = 0 c(lo) = 58879
其实我不知道为什么virtualbox中有些结果比真机还低。顺便说一下,我在两台计算机上测试了虚拟机和真实环境,可能具有不同的硬件配置。我不知道这是否是这些结果的原因。如果是这样,有没有办法改进呢?谢谢。
最佳答案
您无法通过测量一种操作的运行时间来检测虚拟化 - 考虑到大量不同的 CPU、并发工作负载等,您无法知道预期时间是多少应该。此外,借助现代硬件虚拟化(VT-x 等),与直接在硬件上运行的普通代码相比,在 VM 中运行的普通代码不一定会出现明显的减速。
如论文Virtualization Detection: New Strategies and Their Effectiveness解释说,检测虚拟化是否存在的一种技术是比较两个操作的运行时间,这两个操作在没有虚拟化的情况下应该花费相似的时间,但在虚拟化的情况下花费不同的时间。本文给出了无操作与 cpuid 指令的示例。在物理硬件上,cpuid
将花费与空操作大约相同的时间。在虚拟化环境中,cpuid
通常会捕获到虚拟机管理程序(以便虚拟机管理程序可以修改结果),因此比无操作需要更长的时间。
关于c - 反虚拟机的定时检查效果不佳?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24044410/