0

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

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

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

在此之后,我只需在这个位置注册一个 delagate,我就可以走了。现在有趣的是,这适用于我测试的 5 台计算机中的 4 台,最后一台我尝试使用干净的 Windows 7 Ultimate 格式化和安装。就像其他电脑一样。它仍然不起作用。

不过,我能做的就是WriteProcessMemory用来编写我的 ASM 代码。如果我这样做它会起作用,那么我可以将代码放在原始代码所在的位置。

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

4

1 回答 1

4

没有什么VirtualAlloc可以VirtualProtect给你一个既可写又可执行的内存块。采用

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

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

崩溃取决于数据执行保护 (DEP) 的系统和 BIOS 设置,以及 CPU 是否支持它。但无处不在的 DEP 是该行业的发展方向,不妨好好利用它。

于 2013-02-18T21:08:49.893 回答