2017-04-11 57 views
0

是否可以在一個字節數組中存儲一個程序(一個.NET目標機器或純機器代碼),然後將其直接存入內存並執行它(即創建一個新進程)?程序是否必須具有內核訪問權限,還是可以在用戶模式下運行?是否可以執行存儲在變量中的機器代碼?

可以這樣使用C#和/或C++來實現?

+0

在C++中,這是一個變量編譯.NET程序集將是幾乎不可能,因爲現代的CPU級和操作系統級保護的([來源](http://stackoverflow.com/questions/20233289/execute-instructions-from-the-heap#20233427)) – hlt

+0

我相信這實際上是可能的,但是你可能需要管理員權限和/或一些彙編代碼來移動數據和/或相對深入的關於操作系統如何與不同存儲類型一起工作的知識(可執行和不可用正exexutable)。 – ForceBru

+0

這就是所謂的過程空心。這是可能的,只是很困難。 – user3104201

回答

1

我不知道機器代碼,但是你可以很容易地做到這一點與.NET代碼。

有兩種方法可以做,以產生在運行時組件。第一個是CodeDom,這是較舊的方法。第二個是通過Microsoft.CodeAnalysis NuGet包使用Roslyn。

這裏是一個體面的article,做使用兩種編譯一個「Hello World」的例子。

當如果從啓動程序(無論是作爲一個獨立的EXE或作爲被加載的DLL)將具有相同的訪問權限爲你的程序創建組件使用此方法的組件。

編輯:如果你已經擁有你想加載存儲在你只需要調用Assembly.Load(byte[])和您的字節數組傳遞

byte[] data = //... 
var assembly = Assembly.Load(data); 
dynamic instance = assembly.CreateInstance("YourNamespace.SomeClass"); //assuming the constructor "public SomeClass()" exists. 
intance.Run(); //assuming the function "public void SomeClass.Run()" exists. 
+0

謝謝你的提示! +1 – Artem

1

是的,你可以。它可能通過使用CodeDom,但它不是一個好主意。舉例來說,用戶可能會構建會損壞硬盤驅動器的字符串。

+0

*「舉例來說,用戶可能會構建一個會損壞硬盤驅動器的字符串。」*不是,代碼會在運行過程中執行,它不能執行任何您的程序無法做到的事情 –

+0

@ScottChamberlain哦,很高興我學到了新東西。阿爾喬姆,也許你應該看看Reflection.Emit。與CodeDom相比,它有一些優點和缺點。沒有時間仔細觀察。 – CallMeLeonardo

+0

@CallMeLeonardo,謝謝你的提示! +1 – Artem

相關問題