gpt4 book ai didi

c - 在两个进程之间共享内存(C、Windows)

转载 作者:IT王子 更新时间:2023-10-28 23:29:00 25 4
gpt4 key购买 nike

由于我还没有找到答案to the question asked previously here我正在尝试不同的方法。

有没有办法在两个进程之间共享内存?

第二个进程从注入(inject)中获取信息,因为它是一个不再受支持的遗留程序。

我的想法是在那里注入(inject)一些代码,在我传递给注入(inject)程序的结构中,将地址(或其他)传递给我需要运行的数据所在的共享内存。获得数据后,我将在注入(inject)的线程中填充我自己的变量。

这可能吗?怎么样?

感谢代码。

编辑:

我认为不清楚,所以我会澄清一下。我知道怎么注入(inject)。我已经在做。这里的问题是将动态数据传递给注入(inject)。

最佳答案

虽然 windows 通过它的 file mapping API 支持共享内存。 ,您不能轻易地将共享内存映射直接注入(inject)另一个进程,如 MapViewOfFileEx不接受进程参数。

但是,您可以通过使用 VirtualAllocEx 在另一个进程中分配内存来注入(inject)一些数据。和 WriteProcessMemory .如果您要使用 DuplicateHandle 复制句柄, 然后注入(inject)一个调用 MapViewOfFileEx 的 stub ,您可以在另一个进程中建立共享内存映射。因为听起来你无论如何都会注入(inject)代码,所以这应该很适合你。

总而言之,您需要:

  • 通过调用 CreateFileMapping 创建一个匿名共享内存段句柄hFile 为 INVALID_HANDLE_VALUE,lpName 为 NULL。
  • 使用DuplicateHandle 将此句柄复制到目标进程中
  • 使用 VirtualAllocEx 为代码分配一些内存, flAllocationType = MEM_COMMIT | MEM_RESERVE 和 flProtect = PAGE_EXECUTE_READWRITE
  • 使用 WriteProcessMemory 将 stub 代码写入此内存.这个 stub 可能需要用汇编程序编写。将 DuplicateHandle 中的 HANDLE 写在此处某处。
  • 使用 CreateRemoteThread 执行您的 stub .然后 stub 必须使用它获得的 HANDLE 来调用 MapViewOfFileEx。 .然后,这些进程将拥有一个公共(public)共享内存段。

如果你的 stub 加载一个外部库,你可能会发现它更容易一些——也就是说,让它简单地调用 LoadLibrary(查找 LoadLibrary 的地址留给读者作为练习)并从库的 dllmain 条目中完成你的工作观点。在这种情况下,使用命名共享内存可能比使用 DuplicateHandle 更简单。请参阅 CreateFileMapping 上的 MSDN 文章有关更多详细信息,但本质上,为 hFile 传递 INVALID_HANDLE_VALUE 并为 lpName 传递一个名称。

编辑:由于您的问题是传递数据而不是实际的代码注入(inject),因此这里有几个选项。

  1. 使用可变大小的共享内存。您的 stub 获取共享内存的大小和名称或句柄。如果您只需要交换一次数据,这是合适的。 请注意,共享内存段的大小在创建后不能轻易更改。
  2. 使用 named pipe .您的 stub 获取管道的名称或句柄。然后,您可以使用适当的协议(protocol)来交换可变大小的 block - 例如,为长度编写 size_t,然后是实际消息。或者使用 PIPE_TYPE_MESSAGE 和 PIPE_READMODE_MESSAGE,并观察 ERROR_MORE_DATA 以确定消息的结束位置。如果您需要多次交换数据,这是合适的。

编辑 2:以下是如何为 stub 实现句柄或指针存储的草图:

.db B8            ;; mov eax, imm32
.dl handle_value ;; fill this in (located at the start of the image + one byte)
;; handle value is now in eax, do with it as you will
;; more code follows...

您也可以只使用固定名称,这可能更简单。

关于c - 在两个进程之间共享内存(C、Windows),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1200998/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com