我正在尝试用c ++创建一个代码emmiter,以便学习如何创建一个模拟器,但是我很难让动态汇编器工作:
unsigned char program[] = {0x90, 0x90, 0xC3 }; //nop; nop; ret
void (*p)(void) = (void(*)()) &program;
p();
始终返回访问冲突.....
使用visual studio 2012 C ++ win32控制台应用程序
感谢。
答案 0 :(得分:7)
经过一番研究后我发现了这个: 您必须分配内存并将读/写/执行权限更改为:允许读取,禁止写入,允许执行。
请参阅this问题,了解“如何操作”。
在Windows上,该功能为VirtualProtect,您需要传递PAGE_EXECUTE_READWRITE才能获得执行权限。
默认情况下,Windows不允许执行内存。它被称为Data Execute Prevention (DEP)。
参见mprotect()。使用代码填充(n-)页面大小的内存区域(使用mmap()分配)后,更改其权限以禁止写入并允许执行。
在Windows上针对您的问题的另一个修复只是add your program to DEP whitelist ...(您可能没有注意到,但您的崩溃可能是BEX
类型,BEX
崩溃是在99与DEP相关的百分比案例
P.S。当你创建一个工作代码发射器..介意给我一个副本?的xD