2015-05-01 39 views
17

我正在与沙箱技术相关的项目中工作。从C中的缓冲区运行程序集.exe

目前我正在写一个C程序,从远程Web服务器获取一个小程序集.exe二进制(.NET)。这个二进制文件存储在内存中(从不接触磁盘),我的意图是从内存中运行这个二进制文件。如果我的客户是在.NET中制作的,我从内存中运行该程序集没有任何问题(事实上,有很多不同的方法可以获得这个),但当然这不可能与C(不完全确定)。

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

在任何情况下,毫无疑问,最好的和有效的方式是通过使用.NET客户端。

+5

这是可能的,我毫不怀疑。简单?不,我相当怀疑这远远超出了单个SO回答的范围。 –

+0

那么,我们知道.net程序集只能由.net运行时(或等效)执行。那么如何使用cli与C中的C#进行交互,然后使用已有的C#方法从内存中运行程序集。这会按照你想要的方式工作吗? – kbzombie

+3

它可以在没有写入磁盘的PS中完成。绝对不容易。以下是[how]的概要(https://www.defcon.org/images/defcon-21/dc-21-presentations/Bialek/DEFCON-21-Bialek-PowerPwning-Post-Exploiting-by-Overpowering-Powershell .pdf)和[很多代码]的链接(https://github.com/clymb3r/powershell) –

回答

0

由于.exe将具有IL,而不是实际的机器说明,因此无法直接运行。你最好的选择是使用CLR hosting api,即使如此,我也不确定你是否可以在不触摸磁盘的情况下工作。当然,作为汇编代码执行结果运行的任何.NET代码将最终从磁盘加载CLR程序集。

1

如果它是一个exe。然后有可能,检查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); 
0

如果您已加载的exe文件到内存中,并且你有虚拟地址,(在你的应用程序的虚拟空间),也许你可以使用像跳转一样的汇编命令,或者像DLL注入一样的方法来运行其他exe。