从C中的缓冲区运行程序集.exe

时间:2015-05-01 01:36:11

标签: .net c powershell

我正在从事与沙盒技术相关的项目。

目前我正在编写一个C程序,它从远程Web服务器获取一个小程序集.exe二进制文件(.NET)。这个二进制文件存储在内存中(从不触摸磁盘),我的目的是从内存中运行这个二进制文件。如果我的客户端是在.NET中创建的,那么从内存中运行该程序集是没有问题的(事实上,有许多不同的方法可以获得这个)但当然这对于C是不可能的(不完全确定) )。

我的问题是:在我的.exe程序的地址空间中拥有该程序集C,有没有办法从那里运行它?有没有办法允许CLR运行它?起初我想调用powershell从那里运行它(使用Reflection.Assembly),但这种情况涉及将程序集写入磁盘。

无论如何,毫无疑问,最好和最有效的方法是使用.NET客户端。

3 个答案:

答案 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程序集。