
ทำความเข้าใจหัวใจของโปรแกรม: ส่วนข้อมูลและส่วนหัวของ PE File
เมื่อพูดถึงไฟล์โปรแกรมที่รันได้บนระบบ Windows หลายคนอาจเคยได้ยินคำว่า PE File Format ซึ่งเป็นโครงสร้างพื้นฐานที่กำหนดว่าโปรแกรมเหล่านั้นถูกจัดเก็บและโหลดอย่างไร และองค์ประกอบสำคัญที่ทำให้โปรแกรมทำงานได้อย่างถูกต้องก็คือ ส่วนข้อมูล (Sections) และ ส่วนหัวของส่วนข้อมูล (Section Headers)
ลองจินตนาการว่าโปรแกรมหนึ่งชุดก็เหมือนหนังสือเล่มหนึ่งที่มีบทต่างๆ บทเหล่านั้นคือส่วนข้อมูล ซึ่งเก็บข้อมูลเฉพาะประเภทไว้ เช่น โค้ดโปรแกรม ข้อมูล และทรัพยากรต่างๆ ส่วนหัวของส่วนข้อมูลก็เปรียบเสมือนสารบัญที่บอกว่าแต่ละบทเริ่มต้นที่ไหน มีขนาดเท่าไหร่ และคุณสมบัติของบทนั้นๆ เป็นอย่างไร
ส่วนข้อมูล (Sections) คืออะไร และมีความสำคัญอย่างไร?
ส่วนข้อมูล คือพื้นที่ที่โปรแกรมใช้จัดเก็บข้อมูลประเภทต่างๆ ที่จำเป็นต่อการทำงาน เมื่อโปรแกรมถูกโหลดเข้าสู่หน่วยความจำ ระบบปฏิบัติการจะจัดสรรพื้นที่สำหรับแต่ละส่วนข้อมูลเหล่านี้
ส่วนข้อมูลที่เราพบบ่อยๆ มีดังนี้:
- โค้ดโปรแกรม: ส่วนนี้มักมีชื่อว่า
.textหรือ.codeเป็นที่เก็บคำสั่งทั้งหมดที่ทำให้โปรแกรมทำงานได้ - ข้อมูลโปรแกรม: ส่วนนี้อาจมีชื่อเช่น
.data(ข้อมูลที่ถูกกำหนดค่าเริ่มต้น),.rdata(ข้อมูลอ่านอย่างเดียว) หรือ.bss(ข้อมูลที่ยังไม่มีการกำหนดค่าเริ่มต้น) สำหรับเก็บตัวแปร ค่าคงที่ หรือสตริงต่างๆ - ทรัพยากร: ส่วน
.rsrcเป็นที่เก็บรูปภาพ ไอคอน เสียง หรือข้อความที่โปรแกรมใช้ เช่น ปุ่มหรือเมนูต่างๆ
การแยกข้อมูลออกเป็นส่วนๆ ทำให้การจัดการหน่วยความจำมีประสิทธิภาพมากขึ้น และยังช่วยเพิ่ม ความปลอดภัยทางไซเบอร์ เพราะระบบสามารถกำหนด การอนุญาต (Permissions) ที่แตกต่างกันให้กับแต่ละส่วนได้ เช่น ส่วนโค้ดสามารถสั่งงานได้แต่เขียนทับไม่ได้ ส่วนข้อมูลอ่านและเขียนได้ เป็นต้น
เจาะลึกส่วนหัวของส่วนข้อมูล (Section Headers)
ส่วนหัวของส่วนข้อมูล เป็นโครงสร้างข้อมูลที่ทำหน้าที่เป็นสารบัญสำคัญ บอกรายละเอียดทั้งหมดของแต่ละส่วนข้อมูลที่อยู่ใน PE File แต่ละส่วนหัวจะประกอบด้วยข้อมูลสำคัญหลายอย่างที่ช่วยให้ระบบปฏิบัติการเข้าใจและโหลดโปรแกรมได้อย่างถูกต้อง
ข้อมูลหลักๆ ที่อยู่ในส่วนหัวของส่วนข้อมูล ประกอบด้วย:
- ชื่อส่วนข้อมูล (Name): เป็นชื่อสั้นๆ 8 ไบต์ที่อธิบายวัตถุประสงค์ของส่วนนั้นๆ เช่น
.text,.data,.rsrc - ขนาดเสมือน (Virtual Size): ขนาดจริงของส่วนข้อมูลเมื่อถูกโหลดเข้าสู่หน่วยความจำ ซึ่งอาจไม่เท่ากับขนาดในไฟล์
- ที่อยู่เสมือน (Virtual Address – RVA): ที่อยู่เริ่มต้นของส่วนข้อมูลนั้นในหน่วยความจำเมื่อถูกโหลด
- ขนาดข้อมูลดิบ (Size of Raw Data): ขนาดของส่วนข้อมูลในไฟล์บนดิสก์
- ตำแหน่งข้อมูลดิบ (Pointer to Raw Data): ค่าออฟเซ็ต (offset) หรือตำแหน่งเริ่มต้นของส่วนข้อมูลในไฟล์บนดิสก์
- คุณลักษณะของส่วนข้อมูล (Characteristics): เป็นค่าแฟล็ก (flags) ที่ระบุคุณสมบัติของส่วนข้อมูล เช่น อนุญาตให้อ่าน เขียน หรือประมวลผลได้หรือไม่ รวมถึงประเภทของข้อมูลในส่วนนั้นๆ
ข้อมูลเหล่านี้มีความสำคัญอย่างยิ่งสำหรับทั้งระบบปฏิบัติการในการโหลดโปรแกรม และสำหรับผู้ที่ต้องการวิเคราะห์ไฟล์ โดยเฉพาะในงานด้าน ความปลอดภัยทางไซเบอร์ การตรวจสอบ ส่วนหัวของส่วนข้อมูล ช่วยให้สามารถระบุพฤติกรรมที่น่าสงสัยของ มัลแวร์ (Malware) หรือทำ วิศวกรรมย้อนกลับ (Reverse Engineering) เพื่อทำความเข้าใจการทำงานของโปรแกรมได้
ทำความเข้าใจโครงสร้างพื้นฐานเหล่านี้จะช่วยให้มองเห็นภาพรวมของการทำงานของโปรแกรม และเปิดประตูสู่การวิเคราะห์เชิงลึกยิ่งขึ้นในโลกของไฟล์ปฏิบัติการ.