我正在从事与沙盒技术相关的项目。
目前我正在编写一个C程序,它从远程Web服务器获取一个小程序集.exe
二进制文件(.NET)
。这个二进制文件存储在内存中(从不触摸磁盘),我的目的是从内存中运行这个二进制文件。如果我的客户端是在.NET
中创建的,那么从内存中运行该程序集是没有问题的(事实上,有许多不同的方法可以获得这个)但当然这对于C
是不可能的(不完全确定) )。
我的问题是:在我的.exe
程序的地址空间中拥有该程序集C
,有没有办法从那里运行它?有没有办法允许CLR
运行它?起初我想调用powershell从那里运行它(使用Reflection.Assembly),但这种情况涉及将程序集写入磁盘。
无论如何,毫无疑问,最好和最有效的方法是使用.NET
客户端。
答案 0 :(得分:1)
如果它是一个exe。从.net构建然后可以,检查http://www.codeproject.com/Articles/13897/Load-an-EXE-File-and-Run-It-from-Memory
如果它是一个非托管二进制文件,那么我不知道有一种方法可以做到这一点。如果您无法将其保存到硬盘驱动器,即使在临时文件夹中,您也可以尝试某种ramdrive。使用以下代码轻松执行:
//this is using imports from System.Diagnostics and System.IO
byte[] exeBytes = GetBytesFromStream(stream); // Get the .exe file from a webstream or something
string tmpFilename = Path.GetFileNameWithoutExtension(Path.GetTempFileName()) + ".exe";
string tmpFilePath = Path.Combine(Path.GetTempPath, tmpFilename);
File.WriteAllBytes(tmpFilePath, exeBytes);
Process.Start(tmpFilePath);
答案 1 :(得分:0)
如果你已经将exe文件加载到内存中,并且你有虚拟地址(在应用程序的虚拟空间中),也许你可以使用诸如jump之类的汇编命令,或者像DLL注入这样的方法来运行其他exe。
答案 2 :(得分:-1)
由于.exe将具有IL而不是实际的机器指令,因此无法直接运行它。您最好的选择是使用CLR hosting api,即便如此,我也不确定您是否可以在不触及磁盘的情况下使其工作。当然,任何因汇编代码执行而运行的.NET代码最终都会从磁盘加载CLR程序集。