2016-05-22 30 views
5

Kể từ khi một quá trình là một thể hiện của một chương trình máy tính và chứa mã chương trình và hoạt động hiện tại của mình, tôi đã cố gắng điều sau đây:C# Làm thế nào để lấy mã từ một quá trình và sau đó chạy nó?

  • Phân tích quá trình của tôi và lấy một mảng các byte.
  • Thực hiện các byte đó.

Vấn đề của tôi là tôi lấy cả mã chương trình và hoạt động hiện tại của nó, trong khi tôi chỉ quan tâm đến phần đầu tiên.

Dưới đây là cách tôi lấy các byte của quá trình của tôi "foo":

public static byte[] retrieveProcessBytes(String processName) { 
     Process process = ApplicationFinder.FromProcessName(processName).First(); 
     var sharp = new MemorySharp(process); 

     List<byte> bytes = new List<byte>(); 
     IntPtr ptr = IntPtr.Zero; 
     try 
     { 
      while (true) { 
       bytes.Add(sharp.Read<byte>(ptr, 1)[0]); 
       ptr = IntPtr.Add(ptr, 1); 
      } 
     } 
     catch (Exception e) { 
      Console.Write("Exception caught : " + e); 
     } 
     return bytes.ToArray(); 
    } 

Và đây là cách tôi cố gắng thực hiện nó:

byte[] bytes = retrieveProcessBytes("foo"); 
Assembly asm = Assembly.Load(bytes); 
Object[] Args = new Object[0]; 
asm.EntryPoint.Invoke(null, Args); 

Và nó mang lại cho tôi những lỗi sau:

Ngoại lệ không được xử lý loại 'System.BadImageFormatException' xảy ra trong mscorlib.dll

Trong khi đó, nếu tôi truy xuất các byte từ chương trình "foo.exe" của tôi và thực hiện chúng, như dưới đây, nó hoạt động.

Byte[] bytes = File.ReadAllBytes(pathToFooExe); 
Assembly asm = Assembly.Load(bytes); 

Mảng byte mà tôi lấy từ quy trình của tôi lớn hơn đáng kể so với tệp tôi lấy từ tệp "foo.exe" của tôi. Bởi vì tôi cho rằng tôi cũng lấy lại quá trình hoạt động hiện tại.

Tôi làm cách nào để truy xuất phần mã của quy trình của mình?

Bắt đầu từ IntPtr.Zero trở lên? Và khi nào tôi dừng lại?

Bất kỳ trợ giúp nào sẽ được đánh giá cao, Cảm ơn bạn trước.

+2

Đây là cách rất đơn giản để xem. Nhưng bạn không thể chỉ trích chương trình ra khỏi một tiến trình đang chạy như thế. Thứ nhất bộ nhớ không phải là một khối tuyến tính, thứ hai cũng có các mô-đun nạp khác (cụm/DLL, vv) trong bộ nhớ của quá trình và thứ ba tệp EXE không được nạp 1: 1 vào bộ nhớ. Để biết thêm chi tiết về định dạng tệp EXE và cách thức nó được tải vào bộ nhớ, hãy kiểm tra [this] (http://wiki.osdev.org/PE#Loading_a_PE_file). – CherryDT

+1

Mục tiêu của bạn về hoạt động này là gì?Có lẽ có một giải pháp tốt hơn để đạt được những gì bạn muốn. – CherryDT

+1

Tôi muốn so sánh nếu mã trong quy trình của tôi giống với mã trong tệp exe. Và nếu các chương trình thông thường khác nhau trong thời gian chạy, như các chương trình có DRM hoặc bảo vệ. –

Trả lời

0

Nếu bạn đọc về chức năng Assembly.Load bạn có thể thấy rằng bạn đang sử dụng nó không đúng cách. Chỉ vì nó cho phép một mảng các byte như đầu vào không có nghĩa là bạn đang cho nó một mảng thích hợp các byte.

Assembly.Load(Byte[])

tải lắp ráp với một định dạng tập tin đối tượng chung (COFF) hình ảnh dựa trên chứa một hội đồng phát ra. Việc lắp ráp được nạp vào miền ứng dụng của người gọi.

COFF file format

Đây không phải là những gì bạn đang làm rõ ràng. Về cơ bản, những gì bạn đang làm không thể được thực hiện. CherryDT đã đưa ra cho bạn lý do chính đáng ở trên trong các bình luận của anh ấy.

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