在 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的主要内容,如果未能解决你的问题,请参考以下文章
在 CreateProcess 之后调用 GetModuleFileNameEx 时出现 ERROR_INVALID_HANDLE
CreateProcess 适用于某些计算机,而不适用于其他计算机。为啥?
CreateProcess启动隐藏的外部程序(其实就是CreateDesktop,然后指定STARTUPINFO.lpDesktop)