是否可以在一個字節數組中存儲一個程序(一個.NET目標機器或純機器代碼),然後將其直接存入內存並執行它(即創建一個新進程)?程序是否必須具有內核訪問權限,還是可以在用戶模式下運行?是否可以執行存儲在變量中的機器代碼?
可以這樣使用C#和/或C++來實現?
是否可以在一個字節數組中存儲一個程序(一個.NET目標機器或純機器代碼),然後將其直接存入內存並執行它(即創建一個新進程)?程序是否必須具有內核訪問權限,還是可以在用戶模式下運行?是否可以執行存儲在變量中的機器代碼?
可以這樣使用C#和/或C++來實現?
我不知道機器代碼,但是你可以很容易地做到這一點與.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.
謝謝你的提示! +1 – Artem
是的,你可以。它可能通過使用CodeDom,但它不是一個好主意。舉例來說,用戶可能會構建會損壞硬盤驅動器的字符串。
*「舉例來說,用戶可能會構建一個會損壞硬盤驅動器的字符串。」*不是,代碼會在運行過程中執行,它不能執行任何您的程序無法做到的事情 –
@ScottChamberlain哦,很高興我學到了新東西。阿爾喬姆,也許你應該看看Reflection.Emit。與CodeDom相比,它有一些優點和缺點。沒有時間仔細觀察。 – CallMeLeonardo
@CallMeLeonardo,謝謝你的提示! +1 – Artem
在C++中,這是一個變量編譯.NET程序集將是幾乎不可能,因爲現代的CPU級和操作系統級保護的([來源](http://stackoverflow.com/questions/20233289/execute-instructions-from-the-heap#20233427)) – hlt
我相信這實際上是可能的,但是你可能需要管理員權限和/或一些彙編代碼來移動數據和/或相對深入的關於操作系統如何與不同存儲類型一起工作的知識(可執行和不可用正exexutable)。 – ForceBru
這就是所謂的過程空心。這是可能的,只是很困難。 – user3104201