gpt4 book ai didi

c# - 如何执行作为资源嵌入的可执行文件

转载 作者:可可西里 更新时间:2023-11-01 08:26:39 24 4
gpt4 key购买 nike

是否可以执行作为资源包含在项目中的exe文件?我可以将文件作为字节数组获取并在内存中执行吗?

我不想将文件写入临时位置并在那里执行。我正在寻找可以在内存中执行的解决方案。 (它不是 .NET 程序集。)

最佳答案

这很有可能 - 我自己做过 - 但它很繁琐,而且从托管代码来看更是如此。它没有 .NET API,也没有您可以 PInvoke 的 native API。因此,您必须手动处理负载,这需要了解用于 DLL 和 EXE 等模块的 PE(可移植可执行文件)文件格式的一些知识 - http://msdn.microsoft.com/en-us/magazine/cc301805.aspx .会有很多指针操作(强制使用不安全的 {} block )和 PInvoke。

首先将PE文件载入内存(或使用MapViewOfFile)。 PE 文件在内部由包含代码、数据或资源的不同部分组成。文件中每个部分的偏移量并不总是与预期的内存偏移量匹配,因此需要进行一些小的调整。

每个 PE 文件都假定它会加载到虚拟内存中的某个基地址。除非您可以确保这一点,否则您将需要遍历 PE 文件的重定位表以相应地调整指针。

每个 PE 文件还有一个导入表,列出它要调用的其他 DLL 函数。您需要遍历此表并调用 LoadLibrary()/GetProcAddress() 来填写每个导入。

接下来需要为每个section正确设置内存保护。每个部分的标题都注明了它想要的保护,因此只需使用正确的标志为每个部分调用 VirtualProtect() 即可。您至少需要使用 PAGE_EXECUTE_READWRITE VirtualProtect 加载的模块,否则您不太可能执行任何代码。

最后,对于 DLL,您需要调用其入口点,其地址可在 PE header 中找到;然后您可以自由调用导出的函数。

既然你想运行一个 EXE,你就会有一些额外的麻烦。您可以启动一个新线程并从中调用 EXE 的入口点,但是许多 EXE 可能会感到不安,因为该进程是为您设置的,而不是 EXE。当它试图退出时,它也可能会终止您的进程。因此,您可能想要生成一个新进程——也许是主 EXE 的另一个副本,带有特殊参数以告诉它它将运行一些不同的代码——在这种情况下,您必须将 EXE 复制到它的内存空间中。您可能希望在新流程中完成上述大部分工作,而不是旧流程。您可以创建一个命名管道并将数据从一个 EXE 发送到另一个,或者使用 MapViewOfFile 分配一个命名的共享内存区域。当然,EXE 可能仍然会感到不安,因为它运行的进程仍然不是它自己的。

总而言之,只需写入临时文件然后使用 Process.Start() 就容易得多。

如果您仍然想以困难的方式进行操作,请查看非托管代码中的示例:http://www.joachim-bauch.de/tutorials/loading-a-dll-from-memory/ .这不涵盖可执行文件,仅涵盖 DLL,但如果其中的代码不会吓到您,您可以将流程扩展到涵盖可执行文件。

关于c# - 如何执行作为资源嵌入的可执行文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2176122/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com