จะโหลดไฟล์ปฏิบัติการ Win32 และเรียกใช้จากหน่วยความจำได้อย่างไร [ทำซ้ำ]

ในกรณีที่ฉันมีไฟล์ปฏิบัติการฝังตัวเป็นทรัพยากรในกระบวนการ และต้องการเรียกใช้กระบวนการโดยตรงจากหน่วยความจำโดยไม่ต้องมีบนดิสก์

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 แหล่งที่มา
comment
คุณกำลังพยายามโหลด notepad.exe เป็นแอสเซมบลี CLR Notepad ไม่ใช่แอป .NET ดังนั้นจึงเป็น BadImageFormatException โซลูชันที่คุณเชื่อมโยงใช้งานได้กับไฟล์ปฏิบัติการ CLR เท่านั้น   -  person Reda    schedule 17.09.2013
comment
ผู้ลงคะแนนเสียงกรุณาอธิบายเหตุผลในการลงคะแนนเสียงของคุณ   -  person Martin    schedule 17.09.2013
comment
stackoverflow.com/questions/3553875/   -  person dcaswell    schedule 17.09.2013
comment
การเดาของฉันสำหรับการโหวตลงคงจะขาดคำอธิบายที่ครบถ้วนเกี่ยวกับสิ่งที่คุณพยายามทำให้สำเร็จ (ไม่นับที่อธิบายไว้ที่นี่) ดูเหมือนจะรุนแรงเล็กน้อย   -  person Richard Tingle    schedule 17.09.2013
comment
ในบันทึกที่ไม่เกี่ยวข้อง คำสั่ง catch ที่ว่างเปล่าเป็นสิ่งที่เล่นของปีศาจ ฉันเป็นชาว Java ดังนั้นคำศัพท์ของฉันอาจใช้ไม่ได้ แต่อย่างน้อยก็ควรพิจารณาส่งข้อยกเว้นรันไทม์เป็นอย่างน้อย   -  person Richard Tingle    schedule 17.09.2013
comment
แก้ไขคำถามตามความคิดเห็น   -  person Martin    schedule 17.09.2013


คำตอบ (3)


Assembly.Load จะโหลด .net assemblies Notepad ไม่ใช่สิ่งนั้น มันเป็นแอปพลิเคชั่น Win32 ดั้งเดิมธรรมดา ๆ สิ่งที่คุณพยายามทำไม่สามารถทำได้ด้วย Assembly.Load

person David Heffernan    schedule 17.09.2013
comment
มีความคิดเห็นเกี่ยวกับวิธีการโหลดแอป win32 จากหน่วยความจำหรือไม่ - person Martin; 17.09.2013
comment
มันไม่รองรับ มีตัวอย่างมากมายของการแฮ็กมัน คุณเพียงแค่ต้องทำการค้นหาเว็บเพื่อค้นหาพวกเขา - person David Heffernan; 17.09.2013
comment
เขียนเนื้อหาที่ปฏิบัติการได้ไปยังตำแหน่งชั่วคราวแล้วดำเนินการ - person ta.speot.is; 17.09.2013

วิธีการของคุณใช้ได้กับไฟล์ปฏิบัติการที่ได้รับการจัดการเท่านั้น notepad.exe เป็นไฟล์ปฏิบัติการดั้งเดิม หากต้องการเรียกใช้ ให้ใช้คลาส กระบวนการ

person kol    schedule 17.09.2013
comment
พยายาม Process.start() - person Martin; 17.09.2013
comment
@kol ความคิดเห็นที่ฉันตอบกลับถูกลบแล้ว - person ta.speot.is; 17.09.2013
comment
@ta.speot.is โอเค ขอบคุณ ฉันคิดว่าคำตอบของฉันมีปัญหา - person kol; 17.09.2013

วิธีแก้ปัญหาหนึ่งคือเขียนเนื้อหาหน่วยความจำลงในไฟล์ชั่วคราว (Path.GetTempFileName) จากนั้นรันด้วย Process.Start()

person Reda    schedule 17.09.2013
comment
-1 รันกระบวนการโดยตรงจากหน่วยความจำโดยไม่ต้องมีบนดิสก์ - person IInspectable; 17.09.2013
comment
@IInspectable คุณกำลังอ้างอิงจากการแก้ไขที่ทำหลังจากคำตอบนี้ ไม่ว่าจะด้วยวิธีใดก็ตาม จะไม่สามารถเริ่มแอปพลิเคชัน Win32 จากหน่วยความจำได้ คำตอบนี้คือสิ่งที่ดีที่สุดถัดไป - person ta.speot.is; 18.09.2013
comment
@ta มันเป็นไปไม่ได้ มันเป็นเพียงงานที่ซับซ้อน ระบบปฏิบัติการไม่สนับสนุนการเรียกใช้อิมเมจ PE ไบนารีดั้งเดิมจากหน่วยความจำโดยตรง แต่ถ้าคุณดูกระบวนการที่ทำงานอยู่ก็มีสถานการณ์นี้อย่างแม่นยำ (โดยไม่สนใจการแมปหน่วยความจำของที่จัดเก็บสำรองเพื่อประโยชน์ของอาร์กิวเมนต์) แนวทางโดยละเอียดแสดงอยู่ที่ การโหลด DLL จากหน่วยความจำ. - person IInspectable; 18.09.2013
comment
ไม่สามารถทำได้ในรูปแบบที่รองรับ - person ta.speot.is; 18.09.2013
comment
@ta รองรับโมดูลเคอร์เนลเป็นอย่างมาก - person IInspectable; 18.09.2013
comment
คำถามไม่เกี่ยวกับโมดูลเคอร์เนล - person ta.speot.is; 18.09.2013