使用C#启动嵌入式exe文件而无需先提取到文件中的process.start()

12
我在我的应用程序资源中嵌入了一个可执行文件。现在,我使用程序集反射来将该可执行文件提取到自己的文件中,然后使用process.Start()启动可执行文件。是否有可能直接从流中运行嵌入式可执行文件,而不是先将其写入文件?请问有什么最有效的方法可以实现这个需求?

嵌入式可执行文件(不是行政主管,除非您在其中嵌入了某个政府部门)是.NET可执行文件还是本地非.NET可执行文件? - Lasse V. Karlsen
lol,ye,可执行文件,预测文本在公交车上。 - brux
2
创建一个独立的可执行文件需要磁盘上的一个文件。这是硬性的Windows要求,是进程工作方式的基本原理。当然可以使用简单的启动程序从资源中加载程序集。否则,用户、IT人员和病毒扫描器都希望可执行文件不会凭空出现。 - Hans Passant
任何时候,你想要真正地...你知道...回答我问的问题都可以...真的!我问你是否有一个 .NET 可执行文件,而不仅仅是任何可执行文件,你已经说过了。请确认它是一个 .NET 可执行文件,还是不是。 - Lasse V. Karlsen
抱歉,实际上我已经做了,不太清楚发生了什么,它不是 .net 的,我的朋友。 - brux
5个回答

9
以下是我根据你的问题和评论整理出来的要点:
1. 你想知道是否可以在程序中嵌入可执行文件,而无需先将其提取到磁盘上。 2. 你的程序是一个 .NET 程序。 3. 你想要执行的可执行文件不是 .NET 程序。
答案是:是的。
然而,答案也是:这非常非常困难。
你需要做的是,注意我并不知道所有细节,因为我没有做过这个,但是:
1. 将可执行代码加载到内存中。 2. 重新映射二进制图像中的所有地址,使它们相对于你所加载的可执行文件的基本地址正确。 3. 可能加载外部引用,即可执行文件需要的其他 DLL。 4. 重新映射那些引用的地址。 5. 可能加载刚刚加载的引用 DLL 需要的引用。 6. 重新映射那些 DLL。 7. 重复步骤 3 到 6 直到完成。 8. 调用代码。
我假设你的问题是“我能做 1 和 8 吗”,答案是:不行。

1
谢谢您提供这些信息,我怀疑自己是否足够精通 :s - brux
2
你不是,只有操作系统的人才是。将图像提取到磁盘上。 - Lasse V. Karlsen

4

3
非常简单实际上:
byte[] bytes = File.ReadAllBytes(path);
a = Assembly.Load(bytes);

现在不需要从文件读取字节,直接从资源中读取即可完成。实际上,这里有一篇非常好的文章:动态加载嵌入式资源程序集。请参考该文章。

1
这需要另一个程序是 .NET 程序。 - KeithS
ProcessStartInfo类只接受字符串作为参数,因此如果不是.NET,则无论如何都无法完成,除非使用P/Invoke。 - Teoman Soygul
那么你就得从多态病毒中获取灵感,这些病毒修改内存进程以注入自己的指令,但你知道... - Teoman Soygul

1

如果您不想将它保存在硬盘上,您可以考虑将其保存到 RAM 磁盘并从那里运行。


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接