如何在内存中运行一些代码?

时间:2009-10-11 18:23:12

标签: c# .net unmanaged jit dynamic-execution

我有一个编译器,它将汇编语言编译为机器语言(在内存中)。 我的项目是在C#.net中。 有没有办法在线程上运行内存? DEP如何防止它?

byte[] a:  
01010101 10111010 00111010 10101011 ...

4 个答案:

答案 0 :(得分:7)

关键是将可执行代码放入使用VirtualAlloc分配的内存块中,以便将缓冲区标记为可执行文件。

IntPtr pExecutableBuffer = VirtualAlloc(
  IntPtr.Zero,
  new IntPtr(byteCount),
  AllocationType.MEM_COMMIT | AllocationType.MEM_RESERVE,
  MemoryProtection.PAGE_EXECUTE_READWRITE);

(然后使用VirtualFree自行清理)。

这告诉Windows应该将内存标记为可执行代码,以便它不会触发DEP检查。

答案 1 :(得分:3)

可以将代码作为代码执行:

Inline x86 ASM in C#

确实需要使用unsafe代码。

我认为这只是一个有趣的事实但在实践中毫无用处,但也许你的应用程序实际上有用它:)

答案 2 :(得分:2)

我怀疑是否支持这种方式。我不知道也没有研究过,但这里有一些猜测:

最简单的方法可能是将其作为一个进程启动:将其写入*.com file,然后告诉O / S运行该可执行文件。

或者,将内存作为参数传递给CreateThread function(但是你需要担心具有正确调用约定的代码,期望指定的参数,保留寄存器,以及在可执行的内存中)。

另一种可能性是将操作码写入已知将要执行的内存中(例如,覆盖最近加载的DLL中的现有代码)。

答案 3 :(得分:1)

您可以从控制面板将应用程序列入白名单 http://ask-leo.com/how_do_i_turn_off_data_execution_prevention_errors.html

我怀疑你可以通过编程方式将其列入白名单,但肯定不会没有管理员权限 - 这会破坏此安全功能的目的。