在Marshal.AllocCoTaskMem中编写asm导致AccessViolation异常?

时间:2013-02-18 19:13:38

标签: c# assembly access-violation

我已经在另一个应用程序中注入了我想要调用的“用户调用”功能。所以我编写了一个简单的ASM包装器,它只是在正确的寄存器上调整我的参数并调用函数。

这是我将ASM字节放入应用程序的代码。

ASMWrapper = Marshal.AllocCoTaskMem(asm.Length);
Marshal.Copy(asm, 0, ASMWrapper, asm.Length);

在此之后,我只是在这个位置注册了一个delagate,我很高兴。现在有趣的是,这可以在我的5台经测试的计算机中的4台上运行,而最后一台我尝试使用干净的Windows 7 Ultimate进行格式化和安装。就像其他电脑一样。它仍然无效。

我可以做的是使用WriteProcessMemory来编写我的ASM代码。如果我这样做有效,那么我可以将代码放在原始代码的位置。

有谁知道它为什么会这样?我更喜欢使用AllocCoTaskMem方式放置我的asm,而不是试图找到手动放置的地方。

1 个答案:

答案 0 :(得分:4)

VirtualAllocVirtualProtect的任何内容都可以为您提供可写和可执行的内存块。使用

VirtualAlloc(0, Size, MEM_RESERVE|MEM_COMMIT, PAGE_EXECUTE_READWRITE);

您使用的任何分配器都不允许执行它们分配的内存。

崩溃取决于数据执行保护(DEP)的系统和BIOS设置,以及CPU是否支持它。但普遍存在的DEP是行业的发展方向,也可能与它一起发挥作用。

相关问题