Marshal.Copy与ReadProcessMemory / WriteProcessMemory win32 api - 在同一个过程中

时间:2012-05-24 11:15:19

标签: .net winapi memory readprocessmemory interopservices

我想知道是否有人可以概述在Windows .NET中使用ReadProcessMemory / WriteProcessMemory而不是Marshal.Copy的主要差异,支持和纠纷(C#/ VB.net )应用程序读取/写入应用程序的进程内存(不是其他进程的内存)。特别是对于涉及进程内存中任意地址的操作以及将内存块作为字节数组处理(即读/写原始数据)。

Marshal.Copy / ReadProcessMemory工作的所有情况下WriteProcessMemory能否正常工作,还是更有限制?

Marshal.Copy的实施是否在内部使用ReadProcessMemory / WriteProcessMemory API?

澄清一下:我所说的只是读取/写入调用(拥有)进程的内存,而不是其他进程的内存!

感谢。

2 个答案:

答案 0 :(得分:3)

Marshal.Copy()是Read / WriteProcessMemory()的替代品。它无法进入进程的地址空间并访问该进程拥有的内存。最强烈的提示是,它没有一个需要进程处理的重载。

请记住,Windows中的每个进程都有自己的虚拟内存地址空间。一个过程中的指针在另一个过程中不可用。这是Windows提供的进程隔离的重要组成部分,使进程不会相互破坏。并且提供安全保证,如果进程不属于同一用户,则使用ReadProcessMemory()需要管理员权限。必须通过在OpenProcess()调用中指定PROCESS_VM_READ / WRITE来获取进程句柄,这是一个高权限。

如果您在自己的进程中访问指针,这不是问题。在这种情况下,您只需依靠内置于pinvoke marshaller中的Marshal.Copy()。很好地隐藏在视图之外但肯定不比Copy()快,因为你增加了进行pinvoke调用和Windows执行函数的开销。 Marshal.Copy()简单快速,只相当于memcpy()。

答案 1 :(得分:3)

ReadProcessMemoryWriteProcessMemory是本机Win32 API,允许您从不同进程的内存中读取和写入。在尝试在不同进程中读取和写入内存时,您只需要使用这些API。正如您可能想象的那样,它们并不经常用于日常开发。

Marshal.Copy用于在托管和非托管内存之间进行复制,但在同一进程中。

  

Marshal.Copy会在ReadProcessMemory / WriteProcessMemory工作的所有情况下工作,还是更有限制?

不,Marshal.Copy仅限于在单个流程中运营。

  

Marshal.Copy的实现是否在内部使用ReadProcessMemory / WriteProcessMemory API?

没有

  

澄清一下:我所说的只是读取/写入调用(拥有)进程的内存,而不是其他进程的内存!

在这种情况下,ReadProcessMemoryWriteProcessMemory根本不符合您的需求。