来自内存缓冲区的 CreateProcess
Posted
技术标签:
【中文标题】来自内存缓冲区的 CreateProcess【英文标题】:CreateProcess from memory buffer 【发布时间】:2010-09-23 05:52:37 【问题描述】:我可以使用 CreateProcess 来启动一个 EXE。我想在内存缓冲区中拥有 EXE 的内容并对其执行 CreateProcess(或等效项),而不必将其写入文件。有什么办法吗?
背景故事:我们制作游戏。我们将一个普通的 EXE 发送给我们的分销商,然后他们使用他们最喜欢的 DRM 对其进行包装并将其出售给他们的用户。在某些情况下,用户会发现崩溃。大多数崩溃需要 5 分钟才能修复,但补丁必须通过分销商,并且可能需要几天甚至几周的时间。我不能只将修补的 EXE 发送给播放器,因为它没有分销商的 DRM。我正在考虑将真正的游戏 EXE 分发到加密的数据文件中,这样被包装的(外部 EXE)只是解密并启动真正的 EXE。这样我就可以在不禁用 DRM 的情况下安全地分发修复程序。
【问题讨论】:
【参考方案1】:其实很简单。我在 3 年前读过的一篇论文中描述了类似的技术。
Windows 允许您使用 CREATE_SUSPENDED 标志调用 CreateProcess 函数,该标志告诉 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函数来执行它!
【讨论】:
如果 EXE 有清单,这不起作用。哦,它加载正常,但可能会发生坏事。 也有概述的论文(现在可能是同一个......)可以在这里找到:security.org.sg/code/loadexe.html 对于任何路过的人,这里有一些示例代码:groups.google.com/forum/#!msg/… 由于 Urchin 的链接不再有效,这里有一个有效的链接:www.security.org.sg/code/loadexe.html【参考方案2】:您可以将游戏编译为 DLL,并将 DLL 放入加密的数据文件中。可以从内存中加载 DLL 而无需将其写入磁盘。请看本教程(末尾附示例代码):Loading a DLL From Memory
【讨论】:
另见***.com/questions/638277/…【参考方案3】:您想要做的事情需要 NtCreateProcess,但它没有记录,因此很脆弱。 This book 显然涵盖了它的使用。
也许你可以建立一个补丁系统?例如。启动时,程序会检查同一目录中的补丁 DLL,如果存在则加载它。
【讨论】:
【参考方案4】:为什么需要创建新流程?我原以为您可以在执行解包/解密的进程的上下文中运行。
【讨论】:
我绝对可以做到。我提到 CreateProcess 是因为它是我最好的选择,但你说的会奏效。【参考方案5】:你想要的东西可以通过一个叫做“Packer”的东西来实现。实际上从内存中启动 exe 可能是可能的,但它比打包程序要困难得多;)
最著名的打包程序之一是 UPX(谷歌搜索)。有一些工具可以解密它,但它至少应该给你一个开始工作的起点。我也相当肯定 UPX 是开源的。
【讨论】:
我之前用过UPX,这次没想到。可能值得探索。谢谢! 这是一个非常古老的线程 ;) 但要准确地说,尽管 UPX 确实是开源的,但它的许可证明确禁止将其用于加密/混淆目的。【参考方案6】:看BoxedAppSDK
它支持从内存缓冲区启动exe。
希望对你有帮助。
【讨论】:
他们如何在没有临时文件的情况下运行可执行文件?没有其他软件声称可以这样做。 通过钩子很多函数:)以上是关于来自内存缓冲区的 CreateProcess的主要内容,如果未能解决你的问题,请参考以下文章