我正在尝试检测我的Windows是否运行在虚拟机中。我找到了这段被称为Joanna Rutkowska的Red Pill的C代码:
int swallow_redpill ()
{
unsigned char m[2+4], rpill[] = "\x0f\x01\x0d\x00\x00\x00\x00\xc3";
*((unsigned*)&rpill[3]) = (unsigned)m;
((void(*)())&rpill)();
return (m[5]>0xd0) ? 1 : 0;
}
但是当我在我的VC++项目中运行它时,它在这一行失败:
((void(*)())&rpill)();
出现错误信息:执行位置0x003AFCE8时访问冲突。 我做错了什么吗?
rpill
中的数据用作函数。然而,程序中的普通数据不应该是可执行的,因此它不能被“调用”。此外,如果您在一个64位系统上,地址的大小为64位呢?unsigned
类型等同于unsigned int
,在所有现代标准PC平台上都是32位类型,因此当您将m
的地址“修补”到代码中时,可能会被截断。 - Some programmer dude