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

C# 如何在内存中运行一些代码?,c#,.net,unmanaged,jit,dynamic-execution,C#,.net,Unmanaged,Jit,Dynamic Execution,我有一个编译器,它把汇编语言编译成机器语言(在内存中)。 我的项目是C#net。 有没有办法在线程上运行内存? 环保署如何预防 byte[] a: 01010101 10111010 00111010 10101011 ... 我怀疑是否有支持的方法。我不知道,也没有研究过,但这里有一些猜测: 最简单的方法可能是将其作为一个进程启动:将其写入一个进程,然后告诉O/S运行该可执行文件 IntPtr pExecutableBuffer = VirtualAlloc( IntPtr.Zero

我有一个编译器,它把汇编语言编译成机器语言(在内存中)。 我的项目是C#net。 有没有办法在线程上运行内存? 环保署如何预防

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

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

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

IntPtr pExecutableBuffer = VirtualAlloc(
  IntPtr.Zero,
  new IntPtr(byteCount),
  AllocationType.MEM_COMMIT | AllocationType.MEM_RESERVE,
  MemoryProtection.PAGE_EXECUTE_READWRITE);
或者,将内存作为参数传递给(但您需要担心代码是否具有正确的调用约定、是否需要指定的参数、是否保留寄存器以及是否在内存中可执行)


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

您可以从控制面板将应用程序列入白名单


我怀疑您是否可以通过编程方式将其列入白名单,但在没有管理员访问权限的情况下肯定不行-这将破坏此安全功能的用途。

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

它确实需要使用
不安全的
代码


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

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

IntPtr pExecutableBuffer = VirtualAlloc(
  IntPtr.Zero,
  new IntPtr(byteCount),
  AllocationType.MEM_COMMIT | AllocationType.MEM_RESERVE,
  MemoryProtection.PAGE_EXECUTE_READWRITE);
(然后使用VirtualFree清理您自己)


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

一个
.com
文件被限制为16位DOS代码,虽然这对于某些目的可能足够了,但它不是一个通用的解决方案。它会产生加载NTVDM以执行16位代码的成本。不推荐使用-在x64应用程序中不受支持。以何种方式不支持?它是固有的破坏,还是只是这个示例不是非常便携?微软的C++编译器只是从未做过支持64位的工作。当64位开始流行的时候,汇编编程对人们来说已经不像以前那么重要了。