由于我没有find一个问题的答案在这里以前问我在尝试一种不同的方法。
第二个进程从注入获取信息,因为这是一个传统程序,它不再被支持。
我的想法是在那里注入一些代码,在我传递给注入的程序的结构中,将地址(或其他)传递给共享内存,我需要运行的数据位于该共享内存中。 一旦我得到的数据,我将在注入的线程中填充我自己的variables。
这可能吗? 怎么样?
代码表示赞赏。
编辑:
我认为这不清楚,所以我会澄清。 我知道如何注入。 我已经在做了。 这里的问题是将dynamic数据传递给注入。
你可以尝试一个内存映射文件 。
这给了更多的一步一步的细节。
尽管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...
你也可以使用一个固定的名字,这可能更简单。
您可以使用共享内存
你尝试使用管道(内存),甚至是序列化(为你的对象)? 您可以使用文件来管理进程之间的内存。 套接字也是很好的进程之间的沟通。
如果你在谈论Windows,主要的障碍是每个进程都在自己的虚拟地址空间中。 不幸的是,你不能从正在处理的流程中传递正常的内存地址,并得到你期望的结果。 (线程,另一方面,都住在相同的地址空间,这就是为什么线程可以看到内存的方式。)
但是,Windows有一个共享内存空间,您必须非常小心才能正确管理。 在共享内存空间中分配空间的任何进程都负责明确地释放该内存。 这与本地内存不同,当进程死亡时,本地内存或多或少地消失。
有关如何使用共享内存空间来接管世界的一些想法,请参阅此MSDN示例文章 。 呃,与传统软件的接口。 或者任何:)祝你好运,无论你最终做什么!
您可以尝试使用Boost.Interprocess在两个进程之间进行通信。 但是要将代码注入到以前存在的,不受支持的软件中,您可能必须使用@ bdonlan的方式使用WriteProcessMemory 。
内存映射是要走的路,你甚至不需要创建一个永久的内存空间,内存扇区超出范围,当共享它的所有进程都关闭。 还有其他的方法。 将数据从一个C应用程序传递到另一个应用程序的快速和肮脏的方法就是使用操作系统。 在命令行键入app1 | app2
app1 | app2
。 这导致app2成为app1的输出目的地,或者,来自app1的printf命令将其发送到app2(这被称为管道)。