如何在c ++中创建代码发射器

时间:2013-06-17 23:38:56

标签: c++

我正在尝试用c ++创建一个代码emmiter,以便学习如何创建一个模拟器,但是我很难让动态汇编器工作:

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

始终返回访问冲突.....

使用visual studio 2012 C ++ win32控制台应用程序

感谢。

1 个答案:

答案 0 :(得分:7)

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

请参阅this问题,了解“如何操作”。

  

在Windows上,该功能为VirtualProtect,您需要传递PAGE_EXECUTE_READWRITE才能获得执行权限。

     

默认情况下,Windows不允许执行内存。它被称为Data Execute Prevention (DEP)

for linux

  

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

在Windows上针对您的问题的另一个修复只是add your program to DEP whitelist ...(您可能没有注意到,但您的崩溃可能是BEX类型,BEX崩溃是在99与DEP相关的百分比案例

P.S。当你创建一个工作代码发射器..介意给我一个副本?的xD