找到一个判断“程序是否是在纯DOS下运行”的可行办法,基本思路如下:
80386寄存器MSW可在实模式或任何特权级中读取到,而控制寄存器CR0只能在实模式或特权级0下才能读到,而CR0的低16位就是MSW,根据这个原理,如果它门的值相等,则认为在纯DOS下运行,否则是在Window下的DOS虚拟机运行。
BOOL IsWindowVM()
{
DWORD dwCr0;
WORD wMsw;
//读机器状态字MSW
asm smsw ax;
asm mov wMsw, ax
//读控制寄存器cr0,在VM下可能引起异常
asm mov eax, cr0
asm mov dwCr0, eax
//判断是否相等,相等时表示纯DOS,否则VM
if (wMsw == (WORD)(dwCr0 & 0xFFFFlu))
{
return (FALSE);
}
return (TRUE);
}
虽然纯DOS加载了“Emm386.Exe”后,纯DOS将从“实模式”进入到“保护模式”,但此时纯DOS是在“特权级0”的保护模式下运行,代码不受影响!
由于上面的代码用到了32位指令,特修改16位代码为:
BOOL IsWindowVM()
{
DWORD dwCr0;
WORD wMsw;
//read MSW
__emit__(0x0F, 0x01, 0xE0);//asm mov smsw ax
asm mov wMsw, ax
//Read cr0
asm mov ax, wMsw
asm inc ax
__emit__(0x0F, 0x20, 0xC0); //asm mov eax, cr0
//eax to dwCr0
__emit__(0x66, 0x50); //asm push eax
asm pop ax
asm pop dx
asm mov word ptr dwCr0 + 0, ax
asm mov word ptr dwCr0 + 2, dx
//judge
return ((wMsw == (WORD)(dwCr0 & 0xFFFFlu)) ? FALSE : TRUE);
}
[ Last edited by firstsail on 2008-3-14 at 08:21 PM ]