我想知道是否有人可以概述在Windows .NET中使用ReadProcessMemory
/ WriteProcessMemory
而不是Marshal.Copy
的主要差异,支持和纠纷(C#/ VB.net )应用程序读取/写入应用程序的进程内存(不是其他进程的内存)。特别是对于涉及进程内存中任意地址的操作以及将内存块作为字节数组处理(即读/写原始数据)。
在Marshal.Copy
/ ReadProcessMemory
工作的所有情况下WriteProcessMemory
能否正常工作,还是更有限制?
Marshal.Copy
的实施是否在内部使用ReadProcessMemory
/ WriteProcessMemory
API?
澄清一下:我所说的只是读取/写入调用(拥有)进程的内存,而不是其他进程的内存!
感谢。
答案 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)
ReadProcessMemory
和WriteProcessMemory
是本机Win32 API,允许您从不同进程的内存中读取和写入。在尝试在不同进程中读取和写入内存时,您只需要使用这些API。正如您可能想象的那样,它们并不经常用于日常开发。
Marshal.Copy
用于在托管和非托管内存之间进行复制,但在同一进程中。
Marshal.Copy会在ReadProcessMemory / WriteProcessMemory工作的所有情况下工作,还是更有限制?
不,Marshal.Copy
仅限于在单个流程中运营。
Marshal.Copy的实现是否在内部使用ReadProcessMemory / WriteProcessMemory API?
没有
澄清一下:我所说的只是读取/写入调用(拥有)进程的内存,而不是其他进程的内存!
在这种情况下,ReadProcessMemory
和WriteProcessMemory
根本不符合您的需求。