0

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

在/Marshal.Copy工作的所有情况下都可以工作,还是更具限制性?ReadProcessMemoryWriteProcessMemory

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

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

谢谢。

4

2 回答 2

4

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

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

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

不可以,Marshal.Copy它仅限于在单个进程中运行。

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

不。

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

在这种情况下,ReadProcessMemory并且WriteProcessMemory根本与您的需求无关。

于 2012-05-24T11:56:30.327 回答
3

Marshal.Copy()不能替代Read/WriteProcessMemory()。它无法进入进程的地址空间并访问该进程拥有的内存。最强烈的暗示是,它没有需要进程句柄的重载。

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

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

于 2012-05-24T11:51:23.200 回答