1
我试图检测我的Windows是否在虚拟机上运行。我发现这被称为乔安娜鲁特克丝卡的红色药丸这个C代码:当我在我的VC++项目它在线Red Pill检测虚拟化
((void(*)())&rpill)();
失败消息运行它
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;
}
但是:访问冲突执行位置0x003AFCE8。 我做错了吗?
您试图使用'rpill'中的数据作为函数,但是程序中的正常数据不应该是可执行的,因此它不能被“调用”。如果您使用的是64位系统,其中地址大小为64位? 'unsigned'类型等于'unsigned int',它在所有现代标准PC平台上都是32位类型的,所以当你将它“修补”到代码中时,'m'的地址可能会被截断。 –
@Someprogrammerdude是否意味着这不是工作方法?或者有什么方法可以使这个解决方案在x86和x64系统上都能正常工作? – Kiramm
指针问题很容易通过将您的程序构建为32位可执行文件来解决。这不会解决数据无法执行的问题,但我不知道如何解决这个问题。 –