c++ - 来自内存缓冲区的 CreateProcess

标签 c++ winapi visual-c++

我可以使用 CreateProcess 来启动一个 EXE。我想在内存缓冲区中拥有 EXE 的内容并对其执行 CreateProcess(或等效项),而不必将其写入文件。有什么办法吗?

背景故事:我们制作游戏。我们将一个普通的 EXE 发送给我们的分销商,然后他们使用他们最喜欢的 DRM 对其进行包装并将其出售给他们的用户。曾有用户发现崩溃的情况。大多数崩溃需要 5 分钟才能修复,但补丁必须通过分销商,并且可能需要几天甚至几周的时间。我不能只将修补的 EXE 发送给播放器,因为它没有发行商的 DRM。我正在考虑将真正的游戏 EXE 分发到加密的数据文件中,这样被包装的(外部 EXE)只是解密并启动真正的 EXE。这样我就可以在不禁用 DRM 的情况下安全地分发修复程序。

最佳答案

其实很简单。我在 3 年前读过的一篇论文中描述了类似的技术。

Windows 允许您调用CreateProcess带有 CREATE_SUSPENDED 标志的函数,它告诉 API 保持进程暂停直到 ResumeThread函数被调用。

这让我们有时间使用 GetThreadContext 来获取挂起线程的上下文。函数,则 EBX 寄存器将保存指向 PBE(Process Enviroment Block) 的指针。结构,我们需要确定基地址。

从 PBE 结构的布局我们可以看到 ImageBaseAddress 存储在第 8 个字节,因此 [EBX+8] 将给出被挂起进程的实际基地址。

现在我们需要内存中的EXE,如果内存和内存中EXE的对齐方式不同,我们需要进行适当的对齐。

如果挂起的进程和内存中的exe的基地址匹配,加上如果内存中的exe的imageSize小于或等于挂起的进程'我们可以简单地使用WriteProcessMemory将内存中的exe写入挂起进程的内存空间。

但如果不满足上述条件,我们需要更多的魔法。 首先,我们需要使用 ZwUnmapViewOfSection 取消映射原始图像。 , 然后使用 VirtualAllocEx 分配足够的内存在挂起进程的内存空间内。现在我们需要使用 WriteProcessMemory 将内存中的 exe 写入挂起进程的内存空间。功能。

接下来,将内存中 exe 的 BaseAddress 补丁到被挂起进程的 PEB->ImageBaseAddress 中。

线程上下文的EAX寄存器保存EntryPoint地址,我们需要用内存中exe的EntryPoint地址重写。现在我们需要使用 SetThreadContext 保存更改后的线程上下文。功能。

瞧!我们准备好调用ResumeThread挂起的进程上的函数来执行它!

关于c++ - 来自内存缓冲区的 CreateProcess,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/305203/

相关文章:

c++ - pthread.h 头文件问题

c++ - 在 C++ 中记录用户的最佳方式

docker - 在 Windows Docker 容器上安装 MS Build Tools 失败

c++ - 为什么在使用标志 ios::ate 和 ios::out 打开时 fstream 被截断?

c++ - Boost:列出GraphML中指定的顶点和边属性

c++ - 如何将现有的 CMake git repo 作为子模块包含在我自己的 CMake 项目中?

c# - 如何将音频流式传输到特定的输出设备?

c++ - 开发一个应用程序以重启另一个应用程序

c++ - 检索具有多个重叠 I/O 请求的缓冲区