【发布时间】:2009-10-11 18:23:12
【问题描述】:
我有一个编译器,可以将汇编语言编译为机器语言(在内存中)。 我的项目在 C# .net 中。 有没有办法在线程上运行内存? DEP 如何预防?
byte[] a:
01010101 10111010 00111010 10101011 ...
【问题讨论】:
标签: c# .net unmanaged jit dynamic-execution
我有一个编译器,可以将汇编语言编译为机器语言(在内存中)。 我的项目在 C# .net 中。 有没有办法在线程上运行内存? DEP 如何预防?
byte[] a:
01010101 10111010 00111010 10101011 ...
【问题讨论】:
标签: c# .net unmanaged jit dynamic-execution
关键是将可执行代码放入分配有 VirtualAlloc 的内存块中,以便将缓冲区标记为可执行。
IntPtr pExecutableBuffer = VirtualAlloc(
IntPtr.Zero,
new IntPtr(byteCount),
AllocationType.MEM_COMMIT | AllocationType.MEM_RESERVE,
MemoryProtection.PAGE_EXECUTE_READWRITE);
(然后使用 VirtualFree 自行清理)。
这告诉 Windows 应该将内存标记为可执行代码,这样它就不会触发 DEP 检查。
【讨论】:
我怀疑是否有受支持的方式。我不知道也没有研究过,但这里有一些猜测:
最简单的方法可能是将其作为进程启动:将其写入*.com file,然后告诉 O/S 运行该可执行文件。
或者,将内存作为参数传递给CreateThread function(但您需要担心代码具有正确的调用约定、期望指定的参数、保留寄存器以及在可执行的内存中)。
另一种可能性是将操作码写入已知将要执行的内存中(例如,覆盖最近加载的 DLL 中的现有代码)。
【讨论】:
.com 文件仅限于 16 位 DOS 代码,虽然这对于某些用途可能已经足够,但它不是一个通用的解决方案。它会产生加载 NTVDM 以执行 16 位代码的成本。
【讨论】:
您可以从控制面板将您的应用列入白名单 http://ask-leo.com/how_do_i_turn_off_data_execution_prevention_errors.html
我怀疑您是否可以通过编程方式将其列入白名单,但肯定不能没有管理员访问权限 - 这会破坏此安全功能的目的。
【讨论】: