在 Windows 中,是不是可以授予另一个进程访问您自己进程内存的一部分的权限?
Posted
技术标签:
【中文标题】在 Windows 中,是不是可以授予另一个进程访问您自己进程内存的一部分的权限?【英文标题】:In Windows, is it possible to grant another process access to a section of your own process's memory?在 Windows 中,是否可以授予另一个进程访问您自己进程内存的一部分的权限? 【发布时间】:2015-07-17 16:26:37 【问题描述】:我知道相反的情况是可能的(使用 VirtualAllocEx 来临时访问另一个进程的内存),但是是否有一个 Win32 函数让一个进程能够授予另一个进程临时访问它自己内存的一部分的能力?
【问题讨论】:
如果我猜对了你的意思,答案是否定的。最好的办法是使用 WriteProcessMemory 将数据从内存复制到目标进程的内存中。 (好吧,再三考虑,我想您可以将 CreateFileMapping 和 MapViewOfFile 调用注入目标进程。但这不太可能是个好主意。) 我已投票结束,因为您的 cmets 表明您提出的问题不是问题中所述。 @HarryJohnston 哼。我原以为会有一种简单的方法来做一些简单的事情,比如授予另一个进程访问您自己的内存的权限。另外,如何将函数调用注入到另一个进程中? 嗯,当然有 - 斯科特的回答。 Windows 的设计假设是,希望相互交互的进程会相互合作。 有个函数用于单边交互,但它们仅用于故障排除/调试。换句话说,您实际上不应该像那样修改另一个进程的行为 - 某些操作系统根本不允许您这样做,Windows 确实允许,但由于您超出了设计规范,您将必须走很长的路。 我强烈建议不要在您的用例中使用注入。但如果您好奇,请在 MSDN 和/或 search for it here 中查找 CreateRemoteThread。 【参考方案1】:是的,Windows 进程可以共享内存。请参阅 CreateFileMapping 和 MapViewOfFile。每个进程都使用相同的名称来创建或访问共享区域。
【讨论】:
我查找了它们,但它们没有提供我需要的功能。我需要的合作水平不超过简单地给接收应用程序一个指针。不过谢谢。如果他们提供了一个将内存映射到另一个进程的地址空间的函数,它就会起作用。 不确定你的意思。 MapViewOfFile 确实将内存映射到调用者的地址空间。这适用于两个协作进程,它们都使用相同的内存空间名称进行编码。 我需要能够将内存映射到完全不相关进程的地址空间,并且交互级别不超出指针的传递。 @SourceX 要求需要出现在问题中。如果您想将内存映射到多个进程,则只有一个选项可用。就是这样。 @DavidHeffernan 有没有办法将内存映射到另一个进程的地址空间?【参考方案2】:所以你希望进程 B 能够读取或写入进程 A 中的现有内存?
在这种情况下,您需要做的就是给进程 B 在进程 A 的地址空间中的地址(例如,将其作为消息中的参数从进程 A 发送出去)。那么只要进程 B 具有正确的访问权限,它就可以简单地使用ReadProcessMemory
或WriteProcessMemory
。
【讨论】:
很好的答案,但它不适用于我的情况。我正在尝试找到一种将文本直接传递到/从 Scintilla 编辑控件传递的方法。据我所知,Scintilla 不使用ReadProcessMemory
或WriteProcessMemory
——它使用自己的消息系统(如果我直接指定自己的指针,它会立即崩溃)。我目前使用VirtualAllocEx
作为一种解决方法,但它有不能使用管理员窗口的限制,这是它在所有情况下工作所必需的。这就是为什么我需要不超过传递指针的合作水平——这是我能做的。
基本上,我正在寻找的是一个函数,它允许另一个进程使用我的进程内存的特定部分,就好像它是它自己的一样,没有其他字符串(可能除了那些已经存储在内存中:) ) 附加。这可能吗?
@SourceX 您声明的目标(“允许另一个进程使用我的进程内存的特定部分,就好像它是它自己的一样”)是 ReadProcessMemory
和 WriteProcessMemory
的目的。但是现在您已经解释了更多,这听起来更像是一个 XY 问题。只有当数据都在一个连续的块中并且您知道地址是什么时,才能直接从编辑控件中读取(进程内或进程外)。编辑控件不太可能像那样工作。
这就是我从控件获取文本的算法现在的工作原理: 1) 我向控件发送一条消息以确定所需的缓冲区大小。 2)我使用VirualAllocEx
从控件进程的内存中分配了一块大小相同的内存。 3) 我向控件发送一条消息,告诉它将所需的文本复制到我刚刚分配的缓冲区中。 4) 我将控制缓冲区中的文本复制到我自己的缓冲区中。 5) 我释放了之前使用 VirtualFreeEx
分配的缓冲区。
我希望它是这样的: 1) 我向控件发送一条消息以确定所需的缓冲区大小。 2) 我分配了一块我自己的内存并授予控制权限以使用VirtualGrant
访问它(这是我正在寻找的函数的占位符名称)。 3)我向控件发送一条消息,告诉它将所需的文本复制到我刚刚分配的内存中。 4)我使用VirtualRevoke
(另一个占位符名称)撤销对内存的访问。 5) 我将刚刚检索到的文本复制到另一个缓冲区(如果需要)。这应该有助于任何试图理解我正在尝试做的事情的人。以上是关于在 Windows 中,是不是可以授予另一个进程访问您自己进程内存的一部分的权限?的主要内容,如果未能解决你的问题,请参考以下文章
C++ 应用程序:是不是可以将接受的 TCP 连接从一个进程传递到另一个进程?