在 CreateProcess 之后修改 STARTUPINFO

Posted

技术标签:

【中文标题】在 CreateProcess 之后修改 STARTUPINFO【英文标题】:Modify STARTUPINFO after CreateProcess 【发布时间】:2015-09-02 09:50:43 【问题描述】:

我希望能够更改 STARTUPINFO 的值,就在 CreateProcess 被调用(暂停)之后。

因此,新的远程/子进程一启动就可以获取自定义的GetStartupInfo 值。

我怎样才能做到这一点?

更多信息:

我想将任意数据传递给子进程。 关于这篇文章:http://www.catch22.net/tuts/undocumented-createprocess 可以使用来自STARTUPINFO 结构的reserved2 成员来做到这一点。此方法有效,但限制为 65536 字节。为了传递超过 65536 个字节,理论上的解决方案是:

    创建进程(暂停) 在子进程中使用VirtualAllocEx 分配空间 用WriteProcessMemory向子进程写入数据> 65536字节 使用步骤 2 中的地址更改 reserved2 成员 恢复进程 子进程调用GetStartupInfo获取数据

【问题讨论】:

显而易见的事情是在调用CreateProcess 之前更改值。大概这不是一个选择,因为你没有打电话给CreateProcess。这让我觉得有一些外部过程,注入,挂钩诡计正在发生。如果我们知道那是什么会有帮助吗? @DavidHeffernan 你是对的。我想扩展/打破lpReserved2 65536 字节的限制。如果我能够用之前的 VirtualAllocEx 调用的结果填充这个值,理论上我可以存储 RAM 所提供的尽可能多的字节。 我不太明白那个评论。尽管如此,我认为您应该编辑问题以添加更多详细信息。也许有人会有不同的方法来解决你的根本问题。 为什么不使用标准的IPC让其他进程知道在哪里可以找到这段内存? 您不需要窗口句柄。内存映射文件将是完美的。 lpReserved2 上的文档很清楚。不要使用它。将文件映射的名称作为命令行参数传递,一切都很好。 【参考方案1】:

我不知道有任何受支持的方式可以让您按照您的要求进行操作。但是,我建议解决根本问题的替代方案。

    无论如何您都不应该使用lpReserved2,因为文档告诉您将其设置为NULL。 让父进程创建一个命名的内存映射文件。 将此文件映射的名称作为命令行参数传递给子进程。

确实,这种方法有很多变体,但命令行参数是将信息传递给新进程的方式。

【讨论】:

以上是关于在 CreateProcess 之后修改 STARTUPINFO的主要内容,如果未能解决你的问题,请参考以下文章

管道控制Telnet

在 CreateProcess 之后调用 GetModuleFileNameEx 时出现 ERROR_INVALID_HANDLE

CreateProcess 适用于某些计算机,而不适用于其他计算机。为啥?

CreateProcess启动隐藏的外部程序(其实就是CreateDesktop,然后指定STARTUPINFO.lpDesktop)

CreateProcess 执行批处理文件

调整使用 createprocess 创建的应用程序的大小和位置?