2015-05-01 14 views
17

Tôi đang làm việc trong một dự án liên quan đến công nghệ hộp cát.Chạy lắp ráp .exe từ bộ đệm trong C

Hiện tại tôi đang viết một chương trình C được lắp ráp nhỏ .exe nhị phân (.NET) từ máy chủ web từ xa. Mã nhị phân này được lưu trữ trong bộ nhớ (không bao giờ chạm vào đĩa) và ý định của tôi là chạy nhị phân này từ bộ nhớ. Nếu khách hàng của tôi đã được thực hiện trong .NET Tôi sẽ không có vấn đề để chạy mà lắp ráp từ bộ nhớ (trên thực tế, có rất nhiều differents cách để nhận được điều này), nhưng tất nhiên đó là không thể với C (không hoàn toàn chắc chắn).

Câu hỏi của tôi là: có hội đồng đó .exe trong không gian địa chỉ của chương trình C của tôi, có cách nào để chạy nó từ đó không? Có cách nào để cho phép CLR chạy nó không? Lúc đầu, tôi nghĩ để gọi powershell để chạy nó từ đó (bằng cách sử dụng Reflection.Assembly) nhưng trường hợp đó liên quan đến việc viết lắp ráp vào đĩa.

Trong mọi trường hợp, không nghi ngờ gì là cách tốt nhất và hiệu quả để có được điều này là sử dụng ứng dụng khách .NET.

+5

Có thể, tôi không nghi ngờ gì. Dễ dàng? Không, tôi khá nghi ngờ điều này nằm ngoài phạm vi của một câu trả lời SO đơn lẻ. –

+0

Vâng, chúng ta biết rằng hội đồng .net chỉ có thể được thực hiện bởi thời gian chạy .net (hoặc tương đương). Vì vậy, làm thế nào về việc sử dụng CLI để giao tiếp với C# từ C. Sau đó sử dụng các phương thức C# đã có để chạy một assembly từ bộ nhớ. Điều đó có hoạt động theo cách bạn muốn không? – kbzombie

+3

Nó có thể được thực hiện trong PS mà không cần ghi vào đĩa. Chắc chắn KHÔNG dễ dàng. Dưới đây là phác thảo của [cách] (https://www.defcon.org/images/defcon-21/dc-21-presentations/Bialek/DEFCON-21-Bialek-PowerPwning-Post-Exploiting-by-Overpowering-Powershell .pdf) và liên kết tới [nhiều mã] (https://github.com/clymb3r/powershell) –

Trả lời

0

Vì .exe sẽ có IL, thay vì hướng dẫn máy thực tế, bạn không thể chạy trực tiếp. Đặt cược tốt nhất của bạn là sử dụng CLR hosting api, và thậm chí sau đó tôi không chắc chắn bạn có thể có nó hoạt động mà không cần chạm vào đĩa. Chắc chắn bất kỳ mã .NET chạy như là kết quả của việc thực thi mã lắp ráp sẽ kết thúc tải hội đồng CLR từ đĩa.

1

Nếu đó là một exe. xây dựng từ .net sau đó nó có thể, kiểm tra http://www.codeproject.com/Articles/13897/Load-an-EXE-File-and-Run-It-from-Memory

Nếu nó là một nhị phân không được quản lý thì tôi không biết một phương pháp để làm điều này. Nếu bạn không thể lưu nó vào ổ cứng, ngay cả trong một thư mục tạm thời, bạn có thể thử một số loại ramdrive. Các thực hiện rất dễ dàng với đoạn mã sau:

 //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

Nếu bạn đã tải file exe vào bộ nhớ, và bạn có địa chỉ ảo đó, (trong không gian ảo của ứng dụng của bạn), có thể bạn có thể sử dụng lệnh lắp ráp như nhảy, hoặc một số phương pháp như tiêm DLL để chạy exe khác.

Các vấn đề liên quan