如何以编程方式检测我正在运行的环(-1,0,1,2,3)?

And*_*ehm 3 virtual-machine

如何以编程方式检测我正在运行的环(-1,0,1,2,3)?

Chr*_*her 7

最简单的方法是,只运行(x86)命令并捕获相应的错误.

例如(SEH,Windows,内核模式)

bool ring_lower_0 = false;
__try
{
    __asm { <cmd> };
    ring_lower_0 = true;
}
__except( GetExceptionCode() == EXCEPTION_PRIV_INSTRUCTION )
{
    ring_lower_0 = false;
}
Run Code Online (Sandbox Code Playgroud)

笔记:

cmd,是一个汇编命令.有关命令及其各自的环级别列表,请参阅"英特尔体系结构参考手册".

Linux的概念略有不同.

但请记住,驻留在较低级别的VM可能会通过模拟调用来掩盖结果.

(注意:VM的作业是将无效指令转换为有意义的调用)


如果你真的想检查你的虚拟化并且想要因此而停止执行,你应该阅读有关"红丸"的文章.