2015-05-01 37 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。