我已经在另一个应用程序中注入了我想要调用的“用户调用”功能。所以我编写了一个简单的ASM包装器,它只是在正确的寄存器上调整我的参数并调用函数。
这是我将ASM字节放入应用程序的代码。
ASMWrapper = Marshal.AllocCoTaskMem(asm.Length);
Marshal.Copy(asm, 0, ASMWrapper, asm.Length);
在此之后,我只是在这个位置注册了一个delagate,我很高兴。现在有趣的是,这可以在我的5台经测试的计算机中的4台上运行,而最后一台我尝试使用干净的Windows 7 Ultimate进行格式化和安装。就像其他电脑一样。它仍然无效。
我可以做的是使用WriteProcessMemory
来编写我的ASM代码。如果我这样做有效,那么我可以将代码放在原始代码的位置。
有谁知道它为什么会这样?我更喜欢使用AllocCoTaskMem
方式放置我的asm,而不是试图找到手动放置的地方。
答案 0 :(得分:4)
VirtualAlloc
或VirtualProtect
的任何内容都可以为您提供可写和可执行的内存块。使用
VirtualAlloc(0, Size, MEM_RESERVE|MEM_COMMIT, PAGE_EXECUTE_READWRITE);
您使用的任何分配器都不允许执行它们分配的内存。
崩溃取决于数据执行保护(DEP)的系统和BIOS设置,以及CPU是否支持它。但普遍存在的DEP是行业的发展方向,也可能与它一起发挥作用。