ฉันจะสร้างไฟล์ .exe PE ที่ปฏิบัติการได้ด้วยตนเองได้อย่างไร

ข้อความทั้งหมดเกี่ยวกับวิธีสร้างคอมไพเลอร์หยุดหลังจากอธิบาย lexers และ parsers พวกเขาไม่ได้อธิบายวิธีสร้างรหัสเครื่อง ฉันต้องการที่จะเข้าใจกระบวนการตั้งแต่ต้นจนจบ

ปัจจุบันสิ่งที่ฉันเข้าใจคือรูปแบบไฟล์ exe ของ Windows เรียกว่า Portable Executable ฉันอ่านเกี่ยวกับส่วนหัวที่มีอยู่และยังไม่พบแหล่งข้อมูลที่อธิบายเรื่องนี้ได้อย่างง่ายดาย

ปัญหาต่อไปของฉันคือ ฉันไม่เห็นแหล่งข้อมูลใดที่อธิบายวิธีการจัดเก็บรหัสเครื่องในไฟล์ มันเหมือนกับคำสั่งความยาวคงที่แบบ 32 บิตที่จัดเก็บทีละคำสั่งในส่วน .text หรือไม่

มีที่ใดที่อย่างน้อยก็อธิบายวิธีสร้างไฟล์ exe ที่ไม่ทำอะไรเลย (มีคำสั่ง No Op) ขั้นตอนต่อไปของฉันคือการเชื่อมโยงไปยังไฟล์ dll เพื่อพิมพ์ไปยังคอนโซล


comment
โปรดทราบว่าระบบที่แตกต่างกันมีการแสดงไฟล์ปฏิบัติการที่แตกต่างกัน   -  person Keith Thompson    schedule 31.10.2011
comment
เขาพูดถึง Windows... ฉันคิดว่านั่นคือสิ่งที่เขาหมายถึงโดยเฉพาะ (รูปแบบ EXE)   -  person qJake    schedule 31.10.2011
comment
ใช่ ฉันต้องการเน้นที่ Windows ก่อน เมื่อฉันสบายใจกับสิ่งนี้ ฉันก็ย้ายไป ELF ได้เลย   -  person AppleGrew    schedule 31.10.2011
comment
นี่ไม่ใช่คำตอบที่คุ้มค่า แต่ Microsoft ใช้เวอร์ชันของรูปแบบ COFF โดยมีคำอธิบายที่นี่: msdn.microsoft.com/en-us/windows/hardware/gg463119   -  person wkl    schedule 31.10.2011


คำตอบ (7)


คำถามที่ดี! ฉันไม่มีความเชี่ยวชาญมากนักเกี่ยวกับคำถามเฉพาะนี้ แต่ฉันจะเริ่มต้นอย่างไร:

  1. PE หรือ ELF ไม่ได้สร้างรหัสเครื่องล้วนๆ นอกจากนี้ยังมีข้อมูลส่วนหัวบางส่วน ฯลฯ อ่านเพิ่มเติม: การเขียนข้อมูลที่กำหนดเองไปยังไฟล์ปฏิบัติการใน Windows และ Linux

  2. ฉันคิดว่าคุณกำลังมองหาไฟล์ ELF/PE เก็บรหัสเครื่องอย่างไร คุณสามารถรับได้จากคำถามนี้ (โดยใช้ objdump): คุณจะแยกเฉพาะเนื้อหาของส่วน ELF ได้อย่างไร

  3. ตอนนี้ หากคุณต้องการทราบว่าส่วนเนื้อหาถูกสร้างขึ้นตั้งแต่แรกอย่างไร เช่น รหัสเครื่องถูกสร้างขึ้นอย่างไร นั่นคือหน้าที่ของ การสร้างโค้ดของคอมไพเลอร์

  4. ลองใช้ตัวแก้ไขทรัพยากรบางอย่าง เช่น ResourceEditor เพื่อทำความเข้าใจ exe หรือเพียงแค่ ildasm

PS: ส่วนใหญ่เป็นโซลูชัน Unix แต่ฉันแน่ใจว่า PE ควรทำสิ่งที่คล้ายกันโดยพื้นฐาน

ฉันคิดว่าวิธีที่ดีที่สุดในการเข้าถึง อันดับแรกคือพยายามวิเคราะห์ว่า PE/ELF ที่มีอยู่ทำงานอย่างไร โดยพื้นฐานแล้วเป็นวิศวกรรมย้อนกลับ และเพื่อทำเช่นนั้น เครื่อง Unix จะเป็นจุดเริ่มต้นที่ดี แล้วทำเวทมนตร์ของคุณ :)

ไม่เหมือนกันแต่มีคำถามคล้ายกันที่นี่

อัปเดต:

ฉันสร้างการถ่ายโอนข้อมูลวัตถุจากโค้ด c ตัวอย่าง ตอนนี้ ฉันคิดว่านั่นคือสิ่งที่คุณกำหนดเป้าหมายใช่ไหม คุณจำเป็นต้องรู้ว่าคุณสร้างไฟล์นี้ (a.out) หรือไม่?

https://gist.github.com/1329947

ลองดูที่ภาพนี้ อายุการใช้งานของรหัส c

ป้อนคำอธิบายรูปภาพที่นี่

แหล่งที่มา เพื่อให้ชัดเจนว่าคุณต้องการ ใช้ขั้นตอนสุดท้าย เช่น การแปลงโค้ดออบเจ็กต์เป็นโค้ดที่เรียกใช้งานได้หรือไม่

person zengr    schedule 31.10.2011
comment
ลิงค์ของคุณมีประโยชน์ สิ่งหนึ่งที่ขาดหายไปคือส่วนการสร้างโค้ด คุณหมายถึงอะไรกันแน่ที่พวกเขาไม่มีรหัสเครื่องล้วนๆ - person AppleGrew; 01.11.2011
comment
อีกหนึ่งบันทึก ฉันใช้ 7zip เพื่อแยกส่วนต่างๆ จาก exe หรือ dll นี่เป็นเรื่องง่ายมาก - person AppleGrew; 01.11.2011
comment
1. เมื่อคุณพูดถึงส่วนการสร้างโค้ด คุณหมายถึงวิธีสร้างไฟล์ ELF หรือไม่? 2. รหัสเครื่องแท้ไม่ใช่รหัสที่อ่านได้ แต่ไฟล์ ELF มีข้อมูลเมตาบางส่วนแนบมาด้วย ฉันจะอัปเดตคำตอบของฉันแล้วบางทีเราอาจจะอ่านคำตอบได้ - person zengr; 01.11.2011
comment
ใช่ ฉันต้องการทำความเข้าใจขั้นตอนสุดท้าย ฉันค่อนข้างชัดเจนว่า ELF และ PE หมายถึงอะไร โดยการสร้างรหัสฉันหมายถึงแค่รหัสเครื่อง เอกสารเกี่ยวกับ PE ไม่ได้ให้ความกระจ่างเกี่ยวกับเรื่องนั้น - person AppleGrew; 01.11.2011
comment
เพื่อนแนะนำ - inst.eecs.berkeley.edu/~cs164/fa11 . นี่ก็ดูดีทีเดียว - person AppleGrew; 01.11.2011

เช่นเดียวกับบทความอื่นๆ ของเขา ฉันจะพูดว่า ผลงานของ Matt Pietrek เกี่ยวกับ PE Internals ยังคงเป็นคำนำที่ดีที่สุดสำหรับเรื่องนี้มานานกว่าทศวรรษหลังจากเขียน

person Ofek Shilon    schedule 29.05.2015
comment
ไม่สามารถใช้ได้อีก. ลิงก์นี้บน รายการ Wikipedia ของเขา ยังคงใช้งานได้ แต่มีอายุสองทศวรรษแล้ว... - person Andreas Haferburg; 27.10.2017

ฉันใช้ "รูปแบบไฟล์ของ Wotsit" มาหลายปีแล้ว... ย้อนกลับไปในสมัยของ MS-Dos :-) และย้อนกลับไปเมื่อเป็นเพียงชุดของไฟล์ข้อความที่คุณสามารถดาวน์โหลดได้จากระบบ BBS ส่วนใหญ่ที่เรียกว่า "The สารานุกรมประเภทไฟล์โปรแกรมเมอร์เกม"

ตอนนี้เป็นของผู้ดูแล Gamedev.Net และอาจเป็นหนึ่งในความลับที่ดีที่สุดบนอินเทอร์เน็ต

คุณจะพบรูปแบบ EXE ในหน้านี้: http://www.wotsit.org/list.asp?fc=5

สนุก.

อัปเดตมิถุนายน 2020 - ดูเหมือนว่าลิงก์ด้านบนจะใช้งานไม่ได้แล้ว ฉันพบหน้า "EXE" ที่แสดงอยู่ในหน้าเก็บถาวรเว็บของไซต์ wotsit: https://web.archive.org/web/20121019145432/http://www.wotsit.org/list.asp?al=E

อัปเดต 2 - ฉันยังคงแก้ไขเหมือนเดิมเมื่อฉันเพิ่มการอัปเดตที่ผิดพลาด ขอบคุณผู้ที่ต้องการแก้ไข แต่ด้วยเหตุผลที่ดีที่ฉันปฏิเสธ:

1) Wotsit.org อาจกลับมาออนไลน์ได้ในอนาคต หากคุณลองเข้าไปดูที่ URL จริงๆ คุณจะพบว่ามันไม่หายไป มันยังคงตอบสนอง มันเพียงตอบสนองด้วย ข้อความผิดพลาด. สิ่งนี้บอกฉันว่ามีคนรักษาโดเมนให้คงอยู่ไม่ว่าด้วยเหตุผลใดก็ตาม

2) ลิงก์เก็บถาวรดูเหมือนจะกระวนกระวายใจเล็กน้อย บางอย่างได้ผล บางอย่างไม่ได้ บางครั้งดูเหมือนว่าจะได้ผล จากนั้นหลังจากการรีเฟรช ก็ไม่ได้ผล จากนั้นจึงกลับมาทำงานอีกครั้ง ฉันจำได้จากประสบการณ์ตอนที่ wotsit ยังออนไลน์อยู่ พวกเขามีโค้ดตรวจจับการดาวน์โหลด/ลิงก์ที่แปลกมาก และอาจส่งผลให้ archive.org ได้รับผลลัพธ์ที่แปลกประหลาด ฉันจำได้ว่าพวกเขาแสดงจุดยืนนี้เนื่องจากมีจำนวนมาก ไซต์บุคคลที่สามพยายามหาเงินจากความสำเร็จ โดยแสร้งทำเป็นพันธมิตร จากนั้นเชื่อมโยงโดยตรงกับ wotsit จากไซต์ที่มีโฆษณารบกวน

จนกว่าโดเมน wotsit จะถูกลบออกจากอินเทอร์เน็ตทั้งหมด และแม้แต่ DNS ก็ไม่ตอบสนอง ก็ถึงเวลาที่จะรวมทุกอย่างไว้ในลิงก์เก็บถาวรเพียงลิงก์เดียว จนกว่าจะถึงตอนนั้น นี่เป็นวิธีที่ดีที่สุดในการรักษาลิงก์

person shawty    schedule 31.10.2011
comment
เพิ่งลองด้วยตัวเอง และใช่ สิทธิ์ของคุณ ครั้งแรกที่ฉันเคยเห็นปัญหาใด ๆ กับไซต์ น่าเสียดายที่ฉันไม่สามารถช่วยอะไรได้ ฉันไม่ได้ดูแลไซต์ ฉันคิดว่าคุณจะต้องลองดูว่ามีลิงก์ช่วยเหลือ/ผู้ดูแลระบบเพื่อติดต่อกับเจ้าของไซต์หรือไม่ อย่างที่บอกไปว่ามันดำเนินการโดยคนที่ใช้ Gamedev.Net ดังนั้นอาจจะคุ้มค่าที่จะไปที่นั่นและถามหารอบๆ - person shawty; 01.11.2011
comment
คุณยังคงค้นหาข้อมูลนี้ได้ที่ web.archive.org แต่การดาวน์โหลดใช้งานไม่ได้อีกต่อไป การค้นหาเว็บสำหรับรูปแบบไฟล์ Bernd Luevelsmeyer pe อาจทำงานได้ดีกว่า - person Andreas Haferburg; 27.10.2017
comment
น่าเสียดายที่มันยังไม่ได้มีชีวิตอยู่ :-( ในช่วงหลายปีที่ผ่านมาฉันบริจาคเอกสารรูปแบบเหล่านั้นบางส่วนให้กับโครงการด้วยตัวเอง ในห้องใต้หลังคาของฉันที่ไหนสักแห่งจริง ๆ แล้วฉันยังมีเอกสารจำนวนมากที่พิมพ์ออกมาด้วยเครื่องพิมพ์ดอทเมทริกซ์ที่เก่ามาก และเก็บไว้ในแฟ้มห่วงขนาดใหญ่ - person shawty; 27.10.2017
comment
@ user3789797 คุณไม่คิดว่าจะเป็นคำตอบที่ดีกว่าในตัวมันเองแทนที่จะแสดงความคิดเห็นในคำตอบของฉัน แต่คุณก็ตอบคำถามโดยตรงแทนที่จะเพิ่มอะไรพิเศษในความคิดเห็นของฉัน - person shawty; 13.06.2021
comment
ไม่ ไม่ต้องกลัว มันเป็นเรื่องเกี่ยวกับหัวเรื่องเดียวกันที่เป็นจริงมาก แต่เอกสารที่ฉันอ้างถึงนั้นคือเอกสารรูปแบบไฟล์ wottsists ดั้งเดิม ไม่ใช่โครงการ PE เล็ก ๆ ดังนั้นอย่างที่ฉันพูด คุณควรเป็นคำตอบแบบสแตนด์อโลนจะดีกว่า - person shawty; 14.06.2021

ไม่น่าแปลกใจเลยที่ไซต์ที่ดีที่สุดสำหรับข้อมูลเกี่ยวกับการเขียนไฟล์รูปแบบ PE ล้วนเกี่ยวกับการสร้างไวรัส

การค้นหา VX Heavens สำหรับ "PE" จะให้บทช่วยสอนมากมายสำหรับการแก้ไขไฟล์ PE

person Martin Beckett    schedule 31.10.2011
comment
ฉันไม่พบสิ่งที่มีประโยชน์บน VX Heavens มันมีลิงค์ไปยังเว็บไซต์รัสเซียนะ - person AppleGrew; 01.11.2011
comment
-แก้ไข- พบว่าฉันต้องค้นหาจากช่องเพื่อไปที่ลิงก์ ลิงก์ตรงเพิ่มเติมอาจเป็น forum.vxheavens.com/viewtopic.php?id=186< /ก> - person AppleGrew; 01.11.2011

ข้อมูลบางอย่างเกี่ยวกับการทำให้ไฟล์ PE มีขนาดเล็กที่สุด: PE ตัวจิ๋ว

วิธีง่ายๆ ในการจัดการกับการสร้างโค้ด หากคุณต้องการลองทำสิ่งง่ายๆ ไม่กี่อย่าง ก็คือเอาต์พุต ไฟล์ MS-DOS .COM ซึ่งไม่มีส่วนหัวหรือข้อมูลเมตา น่าเสียดายที่คุณถูกจำกัดให้ใช้โค้ด 16 บิต รูปแบบนี้ยังคงค่อนข้างเป็นที่นิยมสำหรับ การสาธิต .

สำหรับรูปแบบคำสั่ง สิ่งที่ฉันจำได้คือชุดคำสั่ง x86 มีความยาวผันแปรได้ รวมถึงคำสั่งขนาด 1 ไบต์ด้วย RISC CPU อาจมีคำสั่งที่มีความยาวคงที่

person Vlad    schedule 31.10.2011
comment
phreedom.org/research/tinype - person user3789797; 15.06.2021

สำหรับ Linux เราอาจอ่านและเรียกใช้ตัวอย่างจาก "Programming from the Ground Up" โดย Jonathan Bartlett:

http://www.cs.princeton.edu/courses/archive/spr08/cos217/reading/ProgrammingGroundUp-1-0-lettersize.pdf

แน่นอนว่าใครๆ ก็อาจชอบแฮ็กโปรแกรม Windows มากกว่า แต่บางทีอย่างแรกอาจเป็นวิธีที่ดีกว่าในการทำความเข้าใจสิ่งที่เกิดขึ้นจริง

person John Donn    schedule 31.10.2011
comment
ฉันไม่เห็นสิ่งใดที่เกี่ยวข้องกับคำถามของฉัน - person AppleGrew; 01.11.2011
comment
จากคำถามของคุณ: ข้อความทั้งหมดเกี่ยวกับวิธีสร้างคอมไพเลอร์หยุดหลังจากอธิบาย lexers และ parsers พวกเขาไม่ได้อธิบายวิธีสร้างรหัสเครื่อง ฉันต้องการที่จะเข้าใจกระบวนการตั้งแต่ต้นจนจบ หนังสือที่อ้างถึง (ดูบทที่ 3 สำหรับโปรแกรมที่คล้ายกับ Hello World) อธิบายวิธีการเขียนโปรแกรมแอสเซมบลี คอมไพล์เป็นภาษาเครื่อง จากนั้นลิงก์เพื่อสร้างไฟล์ปฏิบัติการ - person John Donn; 02.11.2011

รูปแบบไฟล์ปฏิบัติการจะขึ้นอยู่กับระบบปฏิบัติการ สำหรับ windows จะเป็น PE32(32 บิต) หรือ PE32+(64 บิต)

ลักษณะของไฟล์ปฏิบัติการขั้นสุดท้ายจะขึ้นอยู่กับ ABI (application binary interface) ของระบบปฏิบัติการ ABI บอกว่าตัวโหลดระบบปฏิบัติการควรโหลด exe อย่างไร และควรย้ายตำแหน่งอย่างไร ไม่ว่าจะเป็น dll หรือไฟล์ปฏิบัติการธรรมดา ฯลฯ

ไฟล์อ็อบเจ็กต์ทุกไฟล์ (ปฏิบัติการหรือ dll หรือไดรเวอร์) มีส่วนที่เรียกว่าส่วนต่างๆ นี่คือที่ซึ่งโค้ด ข้อมูล ตารางข้าม ฯลฯ ทั้งหมดของเราตั้งอยู่

ตอนนี้ ในการสร้างอ็อบเจ็กต์ไฟล์ซึ่งเป็นสิ่งที่คอมไพลเลอร์ทำ คุณไม่เพียงแต่สร้างรหัสเครื่องที่ปฏิบัติการได้ แต่ยังรวมถึงส่วนหัว ตารางสัญลักษณ์ บันทึกการย้ายตำแหน่ง ตารางนำเข้า/ส่งออก ฯลฯ

ส่วนการสร้างโค้ดเครื่องล้วนๆ ขึ้นอยู่กับว่าคุณต้องการให้โค้ดของคุณได้รับการปรับให้เหมาะสมมากเพียงใด แต่ในการรันโค้ดในพีซีจริงๆ คุณต้องสร้างไฟล์ที่มีส่วนหัวและข้อมูลที่เกี่ยวข้องทั้งหมด (ตรวจสอบ MSDN สำหรับรูปแบบ PE32+ ที่แม่นยำ) จากนั้นใส่โค้ดเครื่องที่ปฏิบัติการได้ทั้งหมด (ซึ่งคอมไพเลอร์ของคุณสร้างขึ้น) ไว้ในที่เดียว ของส่วนต่างๆ (โดยปกติโค้ดจะอยู่ในส่วนที่เรียกว่า .text) หากคุณสร้างไฟล์ที่เป็นไปตามรูปแบบ PE32+ แสดงว่าคุณได้สร้างไฟล์ปฏิบัติการใน Windows สำเร็จแล้ว

person Rohit Jacob    schedule 20.12.2020