2017-09-17 62 views
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。 我做错了吗?

+1

您试图使用'rpill'中的数据作为函数,但是程序中的正常数据不应该是可执行的,因此它不能被“调用”。如果您使用的是64位系统,其中地址大小为64位? 'unsigned'类型等于'unsigned int',它在所有现代标准PC平台上都是32位类型的,所以当你将它“修补”到代码中时,'m'的地址可能会被截断。 –

+0

@Someprogrammerdude是否意味着这不是工作方法?或者有什么方法可以使这个解决方案在x86和x64系统上都能正常工作? – Kiramm

+0

指针问题很容易通过将您的程序构建为32位可执行文件来解决。这不会解决数据无法执行的问题,但我不知道如何解决这个问题。 –

回答

0

显然,示例代码试图执行的不同行为的内部一些虚拟机比*一些”真正的硬件。请注意,其他的虚拟机可能无法与这种简单的方法检测到的机器指令序列。

代码执行失败的原因是,在现代操作系统上,您无法执行数据部分,您需要专门将该代码部分放入可执行部分,或将数据部分更改为可执行部分。