我正在尝试在 C++ 中创建一个代码发射器,以便学习如何制作一个模拟器,但我很难让动态汇编器工作:
unsigned char program[] = {0x90, 0x90, 0xC3 }; //nop; nop; ret
void (*p)(void) = (void(*)()) &program;
p();
总是返回访问冲突.....
我正在使用 Visual Studio 2012 C++ win32 控制台应用程序
谢谢。
我正在尝试在 C++ 中创建一个代码发射器,以便学习如何制作一个模拟器,但我很难让动态汇编器工作:
unsigned char program[] = {0x90, 0x90, 0xC3 }; //nop; nop; ret
void (*p)(void) = (void(*)()) &program;
p();
总是返回访问冲突.....
我正在使用 Visual Studio 2012 C++ win32 控制台应用程序
谢谢。
经过一番研究,我发现:您必须分配内存并将读/写/执行权限更改为:允许读取、禁止写入、允许执行。
请参阅此问题以了解“如何做”。
在 Windows 上,函数是VirtualProtect,您需要传入PAGE_EXECUTE_READWRITE以获得执行权限。
默认情况下,Windows 不允许内存执行。它称为数据执行保护 (DEP)。
对于linux:
参见 mprotect()。一旦你用代码填充了(n-)页大小的内存区域(使用 mmap() 分配),更改其权限以禁止写入并允许执行。
在 Windows 上解决您的问题的另一个方法是将您的程序添加到 DEP 白名单...(您可能没有注意到,但您的崩溃可能是类型BEX
,BEX
崩溃在 99% 的情况下与 DEP 相关)
PS当你创建一个工作代码发射器..介意给我一份吗?xD