我試圖檢測我是否在虛擬環境(虛擬機,虛擬機等)上運行
在Windows上,我使用了幾個ASM,但我不能在Linux中使用它們,主要是因爲該代碼可能被編譯並在32位或64位Linux上運行。在Linux上檢測VMM
下面的代碼可以在Windows 32和64,並在VMWare,VirtualBox和其他虛擬機進行了測試:
#include <stdio.h>
int idtCheck()
{
unsigned char m[2];
__asm sidt m;
printf("IDTR: %2.2x %2.2x\n", m[0], m[1]);
return (m[1]>0xd0) ? 1 : 0;
}
int gdtCheck()
{
unsigned char m[2];
__asm sgdt m;
printf("GDTR: %2.2x %2.2x\n", m[0], m[1]);
return (m[1]>0xd0) ? 1 : 0;
}
int ldtCheck()
{
unsigned char m[2];
__asm sldt m;
printf("LDTR: %2.2x %2.2x\n", m[0], m[1]);
return (m[0] != 0x00 && m[1] != 0x00) ? 1 : 0;
}
int main(int argc, char * argv[])
{
idtCheck();
gdtCheck();
if (ldtCheck())
printf("Virtual Machine detected.\n");
else
printf("Native machine detected.\n");
return 0;
}
現在,GCC抱怨上的所有功能的__asm。我試着用ASM(),ASM和其他形式,我在過去使用但沒有工作。有任何想法嗎?
我建議你閱讀整個文檔,特別是文本註釋後**:**。那麼你就可以問一個相關的問題或者自己弄清楚。 – jbcreix 2010-09-08 14:58:52
謝謝。看到編輯的問題。 – 2010-09-08 15:12:53
SIDT產生6(32位)或10(64位)字節的結果,不要將其推入一個2字節的字符數組,除非你喜歡覆寫堆的隨機比特。 – bdonlan 2010-09-08 15:18:59