2010-06-04 34 views
15

Tôi có một chương trình được lưu trữ trong mảng byte.Chạy chương trình từ mảng byte

Có thể chạy nó bên trong C# không?

+2

Loại chương trình nào? –

+0

Cho phép nói rằng tôi có chương trình đơn giản hiển thị văn bản "Hello" được lưu trữ bên trong mảng byte – DanSpd

+8

Nội dung của mảng đó là gì? Sourcecode, mã thực thi? – Ikke

Trả lời

11

Chắc chắn.

  1. Lưu mảng byte vào tệp .exe.
  2. Sử dụng lớp Process để thực thi tệp.

Lưu ý: giả định rằng mảng byte của bạn là mã thực thi chứ không phải mã nguồn. Điều này cũng giả định rằng bạn có một tiêu đề PE hợp lệ hoặc biết cách tạo một tiêu đề.

+2

+1 đơn giản và dễ hiểu! – Kryptic

+0

Họ có thể cần phải thêm tiêu đề thực thi ngay? – m0s

+1

Có thể thực hiện điều đó nhưng không thực sự lưu mảng byte vào tệp exe? Ngoài ra có nó là thực thi. – DanSpd

4

Bạn có thể tạo một máy ảo và thực thi mã HOẶC bạn có thể sử dụng các kiểu phản chiếu và động để tạo ra một cụm động, có khả năng. Bạn có thể tự động lắp ráp.

http://msdn.microsoft.com/en-us/library/system.reflection.assembly.load.aspx

Bạn có thể làm điều gì đó với điều đó. Nếu trí nhớ của tôi phục vụ tôi mặc dù có một số hạn chế.

Xem

Reflection Assembly.Load Application miền

15

Yes. This answer cho thấy bạn có thể trực tiếp thực hiện các nội dung của một mảng byte. Về cơ bản, bạn sử dụng VirtualAlloc để phân bổ vùng thực thi trên heap với địa chỉ đã biết (một IntPtr). Sau đó bạn sao chép mảng byte của bạn đến địa chỉ đó với Marshal.Copy. Bạn chuyển đổi con trỏ đến một đại biểu với GetDelegateForFunctionPointer, và cuối cùng gọi nó là một đại biểu bình thường.

11

Giả sử các mảng byte chứa một hội .net (.exe hoặc .dll):

Assembly assembly = AppDomain.Load(yourByteArray) 
Type typeToExecute = assembly.GetType("ClassName"); 
Object instance = Activator.CreateInstance(typeToExecute); 

Bây giờ, nếu typeToExecute thực hiện một giao diện được biết đến với chương trình gọi điện thoại, bạn có thể bỏ nó vào giao diện này và gọi phương pháp trên đó:

((MyInterface)instance).methodToInvoke(); 
6

Nếu mảng byte là một .Net assembly với EntryPoint (Phương pháp chính) bạn chỉ có thể thực hiện việc này. Phần lớn thời gian returnValue sẽ là null. Và nếu bạn muốn cung cấp các đối số dòng lệnh, bạn có thể đặt chúng trong chuỗi commandArgs được liệt kê bên dưới.

var assembly = Assembly.Load(assemblyBuffer); 
var entryPoint = assembly.EntryPoint; 
var commandArgs = new string[0]; 
var returnValue = entryPoint.Invoke(null, new object[] { commandArgs }); 
Các vấn đề liên quan