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.
Đâ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
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
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ệ. –