【问题标题】:how to run some code in memory?如何在内存中运行一些代码?
【发布时间】:2009-10-11 18:23:12
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

    【讨论】:

      【解决方案2】:

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

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

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

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

      【讨论】:

      • .com 文件仅限于 16 位 DOS 代码,虽然这对于某些用途可能已经足够,但它不是一个通用的解决方案。它会产生加载 NTVDM 以执行 16 位代码的成本。
      【解决方案3】:

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

      Inline x86 ASM in C#

      它确实需要使用unsafe 代码。

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

      【讨论】:

      • 不推荐 - x64 应用程序不支持。
      • 怎么办?是天生就坏了,还是只是这个例子不是很便携?
      • Microsoft 的 C++ 编译器从来没有为 64 位提供支持。到 64 位开始流行时,人们对汇编编程的重要性已不如从前。
      【解决方案4】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-05-13
        • 2011-09-15
        • 1970-01-01
        • 1970-01-01
        • 2015-11-15
        • 1970-01-01
        • 2013-12-11
        • 2010-09-26
        相关资源
        最近更新 更多