Bagaimana cara memuat file Win32 yang dapat dieksekusi dan menjalankannya dari memori? [duplikat]

Jika saya memiliki executable yang tertanam sebagai sumber daya dalam suatu proses dan ingin menjalankan proses langsung dari memori tanpa menyimpannya di disk.

static void Main()
{
const string pathOfExecutable = @"C:\WINDOWS\system32\notepad.exe"; //size = 67KB 
// read the bytes from the application EXE file
FileStream fs = new FileStream(pathOfExecutable, FileMode.Open);
BinaryReader br = new BinaryReader(fs);
byte[] byteArray = br.ReadBytes(Convert.ToInt32(fs.Length));
fs.Close();
br.Close();


//Process.Start(byteArray) //Cannot use this, any other alternative?

}

person Martin    schedule 17.09.2013    source sumber
comment
Anda mencoba memuat notepad.exe sebagai rakitan CLR. Notepad bukan aplikasi .NET, oleh karena itu BadImageFormatException. Solusi yang Anda tautkan hanya berfungsi untuk executable CLR.   -  person Reda    schedule 17.09.2013
comment
Para pemilih yang tidak setuju tolong jelaskan alasan Anda tidak memberikan suara.   -  person Martin    schedule 17.09.2013
comment
stackoverflow.com/questions/3553875/   -  person dcaswell    schedule 17.09.2013
comment
Dugaan saya untuk suara negatif adalah kurangnya penjelasan lengkap tentang apa yang ingin Anda capai (dijelaskan di sini tidak dihitung), meskipun tampaknya agak kasar   -  person Richard Tingle    schedule 17.09.2013
comment
Pada catatan yang tidak berhubungan; pernyataan tangkapan kosong adalah permainan iblis. Saya seorang pria Java jadi terminologi saya mungkin salah tetapi pertimbangkan untuk memberikan pengecualian runtime setidaknya   -  person Richard Tingle    schedule 17.09.2013
comment
Pertanyaan diedit sesuai komentar   -  person Martin    schedule 17.09.2013


Jawaban (3)


Assembly.Load akan memuat rakitan .net. Notepad bukanlah hal seperti itu. Ini adalah aplikasi Win32 asli yang lama. Apa yang Anda coba lakukan tidak dapat dilakukan dengan Assembly.Load.

person David Heffernan    schedule 17.09.2013
comment
Adakah ide tentang cara memuat aplikasi win32 dari memori? - person Martin; 17.09.2013
comment
Itu tidak didukung. Ada banyak contoh peretasannya. Anda hanya perlu melakukan pencarian web untuk menemukannya. - person David Heffernan; 17.09.2013
comment
Tulis konten yang dapat dieksekusi ke lokasi sementara lalu jalankan. - person ta.speot.is; 17.09.2013

Pendekatan Anda hanya berfungsi dengan executable terkelola. notepad.exe adalah executable asli. Untuk menjalankannya, gunakan kelas Process.

person kol    schedule 17.09.2013
comment
Mencoba Proses.start() - person Martin; 17.09.2013
comment
@kol Komentar yang saya balas telah dihapus. - person ta.speot.is; 17.09.2013
comment
@ta.speot.tidak apa-apa. Terima kasih, saya pikir ada masalah dengan jawaban saya. - person kol; 17.09.2013

Salah satu solusinya adalah dengan menulis konten memori ke file sementara (Path.GetTempFileName), lalu menjalankannya dengan Process.Start()

person Reda    schedule 17.09.2013
comment
-1 menjalankan proses langsung dari memori tanpa menyimpannya di disk - person IInspectable; 17.09.2013
comment
@IInspectable Anda mengutip dari editan yang dilakukan setelah jawaban ini. Bagaimanapun, tidak mungkin untuk memulai aplikasi Win32 secara sembarangan dari memori. Jawaban ini adalah hal terbaik berikutnya. - person ta.speot.is; 18.09.2013
comment
@ta Bukan tidak mungkin, hanya tugas yang rumit. OS tidak secara langsung mendukung eksekusi gambar PE biner asli dari memori, namun, jika Anda melihat proses yang sedang berjalan, ada skenario yang persis seperti ini (mengabaikan pemetaan memori dari penyimpanan pendukung demi argumen). Pendekatan terperinci diuraikan di Memuat DLL dari memori. - person IInspectable; 18.09.2013
comment
Tidak mungkin dilakukan dengan cara apa pun yang didukung. - person ta.speot.is; 18.09.2013
comment
@ta Sangat didukung untuk modul kernel. - person IInspectable; 18.09.2013
comment
Pertanyaannya bukan tentang modul kernel. - person ta.speot.is; 18.09.2013