在两个进程之间共享内存(C,Windows)

won*_*rer 28 c memory windows share code-injection

由于我没有找到前面提到的问题的答案,我正在尝试不同的方法.

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

第二个过程从注入中获取信息,因为它是一个遗留程序,它不再受支持.

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

这可能吗?怎么样?

代码表示赞赏.

编辑:

我认为现在还不清楚所以我会澄清一下.我知道如何注射.我已经这样做了.这里的问题是将动态数据传递给注入.

bdo*_*lan 25

虽然Windows通过其文件映射API支持共享内存,但是您无法轻松地将共享内存映射直接注入另一个进程,因为MapViewOfFileEx不接受进程参数.

但是,您可以通过使用VirtualAllocExWriteProcessMemory在另一个进程中分配内存来注入一些数据.如果要使用DuplicateHandle复制句柄,然后注入调用MapViewOfFileEx的存根,则可以在另一个进程中建立共享内存映射.既然听起来你无论如何都要注入代码,这应该对你有用.

总而言之,您需要:

  • 通过为hFile 调用带有INVALID_HANDLE_VALUE的CreateFileMapping并为lpName 调用NULL来创建匿名共享内存段句柄.
  • 使用DuplicateHandle将此句柄复制到目标进程中
  • 使用VirtualAllocEx为代码分配一些内存,使用flAllocationType = MEM_COMMIT | MEM_RESERVE和flProtect = PAGE_EXECUTE_READWRITE
  • 使用WriteProcessMemory将存根代码写入此内存.这个存根可能需要用汇编语言编写.从DuplicateHandle传递HANDLE,将其写在这里.
  • 使用CreateRemoteThread执行存根.然后,存根必须使用它获得的HANDLE来调用MapViewOfFileEx.然后,这些进程将具有共同的共享内存段.

如果你的存根加载了一个外部库,你可能会发现它更容易 - 也就是说,只需调用LoadLibrary(找到LoadLibrary的地址留给读者的练习),然后从库的dllmain入口点开始工作.在这种情况下,使用命名共享内存可能比使用DuplicateHandle更简单.有关更多详细信息,请参阅有关CreateFileMapping的MSDN文章,但实际上,为hFile传递INVALID_HANDLE_VALUE,为lpName传递名称.

编辑:由于您的问题是传递数据而不是实际的代码注入,这里有一些选项.

  1. 使用可变大小的共享内存.您的存根获取大小以及共享内存的名称或句柄.如果您只需要交换一次数据,这是合适的.请注意,创建后无法轻松更改共享内存段的大小.
  2. 使用命名管道.您的存根获取管道的名称或句柄.然后,您可以使用适当的协议来交换可变大小的块 - 例如,写入size_t作为长度,然后写入实际消息.或者使用PIPE_TYPE_MESSAGE和PIPE_READMODE_MESSAGE,并注意ERROR_MORE_DATA以确定消息的结束位置.如果您需要多次交换数据,这是合适的.

编辑2:这是一个如何实现存根的句柄或指针存储的草图:

.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...
Run Code Online (Sandbox Code Playgroud)

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


Sco*_*owe 10

您可以尝试使用内存映射文件.

提供了更多的逐步细节.