gpt4 book ai didi

c - 反 VM 的时间检查效果不佳?

转载 作者:太空宇宙 更新时间:2023-11-04 07:16:41 29 4
gpt4 key购买 nike

有谁知道时序检查是否仍在检测虚拟环境?我尝试使用 rdtsc 指令来获取 cpu 周期并比较真实 linux 机器和在 virtualbox 上运行的 linux 之间的结果。但结果似乎不稳定。有时,真实机器的 cpu 周期甚至比 virtualbox 中的还要大。这种技术是否假设像 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有些结果比真机还低。顺便说一句,我在两台可能具有不同硬件配置的计算机上测试了 virtualbox 和真实环境。我不知道这是否是这些结果的原因。如果是这样,有没有办法改善它?谢谢。

最佳答案

您无法通过测量一种 操作的运行时间来检测虚拟化 - 考虑到大量不同的 CPU、并发工作负载等,您无法知道预期时间应该。此外,借助现代硬件虚拟化(VT-x 等),与直接在硬件上运行的普通代码相比,在 VM 中运行的普通代码不一定有任何显着的减速。

如论文Virtualization Detection: New Strategies and Their Effectiveness解释说,一种检测虚拟化存在的技术是比较两个操作的运行时间,这两个操作在没有虚拟化的情况下应该花费相似的时间,但在虚拟化的情况下花费不同的时间。该论文给出了无操作与 cpuid 指令的示例。在物理硬件上,cpuid 将花费与空操作大致相同的时间。在虚拟化环境中,cpuid 通常会捕获到管理程序(以便管理程序可能会修改结果),因此比空操作花费的时间要长得多。

关于c - 反 VM 的时间检查效果不佳?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24044410/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com