Kir*_*amm 4 c c++ virtualization virtual-machine
我正在尝试检测我的 Windows 是否在虚拟机上运行。我找到了这个 C 代码,它被称为 Joanna Rutkowska's Red Pill:
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;
}
Run Code Online (Sandbox Code Playgroud)
但是当我在我的 VC++ 项目中运行它时,它在线失败
((void(*)())&rpill)();
Run Code Online (Sandbox Code Playgroud)
带有消息:访问冲突执行位置 0x003AFCE8。我做错了吗?
显然,示例代码试图执行一系列机器指令,这些指令在某些虚拟机中的行为与在“某些”真实硬件上的行为不同。请注意,使用这种简单的方法可能无法检测到其他 VM。
代码执行失败的原因是在现代操作系统上你不能执行数据段。您需要专门将该段代码放入可执行部分,或将数据部分更改为可执行。
来自代码的实际作者Joanna Rutkowska:
注意:该程序将在具有 PAX/X^W/grsecurity、protection 的系统上失败(正如 Brad Spengler 指出的那样),因为 rpill 变量未标记为可执行文件。要使其在此类系统中运行,应使用 mprotect() 用 PROT_EXEC 属性标记 rpill。另一种解决方案是只使用 asm() 关键字而不是类似 shellcode 的缓冲区。但是,这个程序应该被视为构建到您自己的 shellcode 中的框架,而不是独立的生产类工具;) 我的目标是使其尽可能简单和可移植。这就是我没有使用 asm() 和 mprotect() 的原因,因为它们依赖于系统或编译器。
| 归档时间: |
|
| 查看次数: |
1711 次 |
| 最近记录: |