红色药丸检测虚拟化
Red Pill detect virtualization
我正在尝试检测我的窗口是否在虚拟机上运行。我找到了这个C代码,该代码被称为Joanna Rutkowska的红色药丸:
int swallow_redpill ()
{
unsigned char m[2+4], rpill[] = "x0fx01x0dx00x00x00x00xc3";
*((unsigned*)&rpill[3]) = (unsigned)m;
((void(*)())&rpill)();
return (m[5]>0xd0) ? 1 : 0;
}
但是当我在VC 项目中运行它时,它会在线失败
((void(*)())&rpill)();
带有消息:访问违规执行位置0x003AFCE8。我做错了吗?
显然,示例代码正在尝试执行一系列机器指令,这些指令在某些虚拟机内与 *某些"真实硬件"中的行为不同。请注意,其他VMS可能无法通过这种简单的方法检测到。
代码无法执行的原因是,在现代OS上,您无法执行数据部分。您需要将该代码专门放入可执行的部分中,或更改数据部分才能执行。
来自Joanna Rutkowska代码的实际作者:
注意:由于RPILL变量不能标记为可执行文件,因此该程序将在具有PAX/X^w/grsecurity,Protection,Protection(正如Brad Spengler指出)的系统失败。为了使其在此类系统中运行,应使用mprotect()用Prot_Exec属性标记RPILL。另一个解决方案是仅使用ASM()关键字而不是类似壳牌的缓冲区。但是,该程序应被视为构成自己的ShellCode的骨骼,而不是独立的生产类工具;)我的目标是使其尽可能简单和便携。这就是为什么我不使用ASM()和mprotect(),因为它们是系统或编译器依赖性的。
#include <windows.h>
unsigned char m[2+4], rpill[] = "x0fx01x0dx00x00x00x00xc3";
int swallow_redpill ()
{
unsigned int old;
VirtualProtect(rpill, 8, PAGE_EXECUTE_READWRITE, &old);
*((unsigned*)&rpill[3]) = (unsigned)m;
((void(*)())&rpill)();
return (m[5]>0xd0) ? 1 : 0;
}
应该在Windows上做技巧。如果您有X64机器,请确保在Win32上运行它。
相关文章:
- 使用CMake检测支持的C++标准
- 当套接字连接断开时检测C/C++Unix
- C/C++预处理器是否可以检测一些编译器选项
- WMI检测进程创建事件-c++
- 基于树莓pi的tensorflow lite量化ssd目标检测
- 下面是我为检测链接列表中的循环而制作的代码
- 落砂模拟碰撞检测C++和SFML
- 我可以检测和更改 gcc/g++ 中结构的当前数据对齐设置吗?
- 为什么C++编译器没有检测到正确声明的类?
- 检测win32服务创建和删除的最佳方法
- 正在LLVM中检测整数比较条件
- 如何在鼠标挂钩过程中检测拖动
- 位移操作和位掩码未检测到重复字符
- 检测 COFF 对象文件中C++内联符号
- qmake:检测目标位宽(32 位或 64 位)
- 增强精神解析器规则以检测语句中的特殊结尾
- 用于C++的静态二进制检测或二进制重写工具和框架
- Tensorflow对象检测在Python和C++(OpenCV)之间有不同的结果
- C++中的张量流对象检测
- 红色药丸检测虚拟化