由于我还没有找到之前在这里提出的问题的答案,我正在尝试一种不同的方法。
有没有办法在两个进程之间共享内存?
第二个过程从注入中获取信息,因为它是一个不再受支持的遗留程序。
我的想法是在那里注入一些代码,在我传递给注入程序的结构中,将地址(或其他)传递给我需要运行的数据所在的共享内存。一旦我得到数据,我将在注入的线程中填充我自己的变量。
这可能吗?如何?
代码表示赞赏。
编辑:
我认为这还不清楚,所以我会澄清一下。我知道怎么注射。我已经在做。这里的问题是将动态数据传递给注入。
由于我还没有找到之前在这里提出的问题的答案,我正在尝试一种不同的方法。
有没有办法在两个进程之间共享内存?
第二个过程从注入中获取信息,因为它是一个不再受支持的遗留程序。
我的想法是在那里注入一些代码,在我传递给注入程序的结构中,将地址(或其他)传递给我需要运行的数据所在的共享内存。一旦我得到数据,我将在注入的线程中填充我自己的变量。
这可能吗?如何?
代码表示赞赏。
编辑:
我认为这还不清楚,所以我会澄清一下。我知道怎么注射。我已经在做。这里的问题是将动态数据传递给注入。
尽管 windows 通过其文件映射 API支持共享内存,但您不能轻松地将共享内存映射直接注入另一个进程,因为MapViewOfFileEx不接受进程参数。
但是,您可以通过使用VirtualAllocEx和WriteProcessMemory在另一个进程中分配内存来注入一些数据。如果您要使用DuplicateHandle 复制句柄,然后注入一个调用MapViewOfFileEx的存根,您可以在另一个进程中建立共享内存映射。因为听起来你无论如何都会注入代码,所以这应该对你很有效。
总而言之,您需要:
如果您的存根加载一个外部库,您可能会发现它更容易一些——也就是说,让它简单地调用 LoadLibrary(查找 LoadLibrary 的地址留给读者作为练习)并从库的 dllmain 入口点执行您的工作。在这种情况下,使用命名共享内存可能比使用 DuplicateHandle 更简单。有关更多详细信息,请参阅有关CreateFileMapping的 MSDN 文章,但本质上,为 hFile 传递 INVALID_HANDLE_VALUE 并为 lpName 传递一个名称。
编辑:由于您的问题是传递数据而不是实际的代码注入,因此这里有几个选项。
编辑 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...
您也可以只使用固定名称,这可能更简单。
您是否尝试使用管道(用于内存)甚至序列化(用于您的对象)?您可以使用文件来管理进程之间的内存。套接字也很适合在进程之间进行通信。
内存映射是要走的路,您甚至不需要创建永久内存空间,当共享它的所有进程都关闭时,内存扇区超出范围。还有其他方法。将数据从一个 C 应用程序传递到另一个应用程序的一种快速而肮脏的方式就是使用操作系统。在命令行类型app1 | app2
. 这会导致 app2 成为 app1 的输出目的地,否则来自 app1 的 printf 命令会将其发送到 app2(这称为管道)。
如果您谈论的是 Windows,主要障碍是每个进程都存在于自己的虚拟地址空间中。不幸的是,您无法将正常的内存地址从一个进程传递到另一个进程并获得您期望的结果。(另一方面,线程都存在于相同的地址空间中,这就是线程可以以相同方式查看内存的原因。)
但是,Windows 确实有一个共享内存空间,您必须非常小心才能正确管理它。在共享内存空间中分配空间的任何进程都负责显式释放该内存。这与本地内存形成对比,本地内存在进程终止时或多或少地消失。
有关如何使用共享内存空间接管世界的一些想法,请参阅此 MSDN 示例文章。呃,与遗留软件的接口。或者其他什么:) 祝你好运,无论你最终做什么!
您可以尝试使用Boost.Interprocess在两个进程之间进行通信。但是要将代码注入到以前存在的、不受支持的软件中,您可能必须使用 @bdonlan 的方式使用WriteProcessMemory。