5

我正在尝试在 C++ 中创建一个代码发射器,以便学习如何制作一个模拟器,但我很难让动态汇编器工作:

unsigned char program[] = {0x90,  0x90, 0xC3 }; //nop; nop; ret
void (*p)(void) =  (void(*)())     &program;
p();

总是返回访问冲突.....

我正在使用 Visual Studio 2012 C++ win32 控制台应用程序

谢谢。

4

1 回答 1

7

经过一番研究,我发现:您必须分配内存并将读/写/执行权限更改为:允许读取、禁止写入、允许执行。

请参阅问题以了解“如何做”。

在 Windows 上,函数是VirtualProtect,您需要传入PAGE_EXECUTE_READWRITE以获得执行权限。

默认情况下,Windows 不允许内存执行。它称为数据执行保护 (DEP)

对于linux

参见 mprotect()。一旦你用代码填充了(n-)页大小的内存区域(使用 mmap() 分配),更改其权限以禁止写入并允许执行。

在 Windows 上解决您的问题的另一个方法是将您的程序添加到 DEP 白名单...(您可能没有注意到,但您的崩溃可能是类型BEXBEX崩溃在 99% 的情况下与 DEP 相关)

PS当你创建一个工作代码发射器..介意给我一份吗?xD

于 2013-06-17T23:48:04.447 回答