我有一个编译器,它将汇编语言编译为机器语言(在内存中)。 我的项目是在C#.net中。 有没有办法在线程上运行内存? DEP如何防止它?
byte[] a:
01010101 10111010 00111010 10101011 ...
答案 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)
答案 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
我怀疑你可以通过编程方式将其列入白名单,但肯定不会没有管理员权限 - 这会破坏此安全功能的目的。