c - 反虚拟机的定时检查效果不佳?

标签 c linux

有谁知道定时检查是否仍然可以检测虚拟环境?我尝试使用 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/

相关文章:

c - read 将 stdout 从无缓冲更改为在规范模式下缓冲的行

c - Linux C 编程 : Concurrent reads/writes to same file descriptor

c - 具有多个进程的 TCP 客户端

c++ - 从头开始实现经典 OPC DA 服务器

c - ISO_8583 消息打包

linux - 将 XInput2 设备映射到 sysfs 节点

linux - Apache/HTTPD 服务不工作

c++ - 是否可以在不重新编译程序的情况下在 BLAS 库之间切换?

linux - 如何在不包含文件夹本身的情况下查找文件夹中的所有文件

ruby-on-rails - Apache with Passenger 不加载 Rails 应用程序