ทำไมเราไม่เข้าใจเนื้อหาของไฟล์ไบนารีหลังจากรวบรวม


11

เท่าที่ผมรู้ว่าทุกโปรแกรมประกอบด้วยแพ็คของคำแนะนำโปรเซสเซอร์ที่มีตัวแปรข้อมูลเฉพาะบาง (float, int, ถ่าน ... ) ในการทำงานเกี่ยวกับการลงทะเบียนประมวลผล

ดังนั้นสิ่งแรกที่ฉันคิดเกี่ยวกับมัน (เมื่อนานมาแล้ว) คือถ้าคุณรู้ว่าค่า ASCII ของ%¨#$¨#(เพียงตัวอย่างแบบสุ่ม) สามารถตีความได้ว่าเป็นที่อยู่ของregister pointer stack (เพียงแค่แสดงตัวอย่าง) ของ x86 หน่วยประมวลผล หากสิ่งนี้เป็นจริงทุกครั้งที่คุณพบค่า "อ่านไม่ได้" นี้เมื่ออ่านเนื้อหาของไฟล์ไบนารีคุณสามารถตีความได้ว่าการใช้ตัวชี้กองซ้อนเพื่อจัดการตัวแปรข้อมูลบางอย่าง

น่าเสียดายที่นี่ไม่ได้เกิดขึ้น ด้านล่างมีตัวอย่างของเนื้อหาของping.exeโปรแกรมจาก Windows ที่เปิดด้วยnotepad.exe:

Ping.exe ตามที่ดูใน MS Notepad

มันเป็นไฟล์ไบนารีและข้อมูลนั้นไม่สามารถเข้าใจได้สำหรับมนุษย์เรา (มันสามารถเข้าใจได้สำหรับเครื่อง) มันไม่สมเหตุสมผลเลยสำหรับทุกคนแม้ว่าพวกเขาจะรู้รหัสการประกอบ (ระดับต่ำสุดของภาษาเครื่อง)

ดังนั้นถ้าฉันเข้าใจทุกอย่างถูกต้องใครจะอธิบายได้

  1. ทำไมรหัสไบนารี่ไม่สามารถกลับไปที่รหัสแอสเซมบลีได้เท่าที่พวกเขาอยู่ลึกลงไปในสิ่งเดียวกัน?
  2. หากสามารถเข้าใจรหัสการประกอบได้ทำไมไบนารีที่คอมไพล์ไม่ได้เป็นผลมาจากรหัสนี้ "อ่านได้" อีกต่อไป

12
คุณสามารถคุณเพียงแค่ต้องdisassembler
David Schwartz

ดังนั้นฉันสามารถแยกไฟล์ exe ใด ๆ ??? ฉันเพิ่งรู้ว่ามันทำงานกับรหัสที่ได้รับการจัดการ ...
Diogo

13
คุณสามารถแยกชิ้นส่วนที่ปฏิบัติการได้ ไม่ว่าคุณจะสามารถทำความเข้าใจกับเอาต์พุตที่ถอดประกอบได้เป็นอีกเรื่องหนึ่ง
David Schwartz

5
การรวบรวมหรือแอสเซมบลีจะลบข้อมูลที่มีความสำคัญของมนุษย์เช่นชื่อตัวแปรป้ายชื่อสาขา ฯลฯ Dissasembly จะได้รับกระแสการเรียนการสอน แต่คุณยังคงมีจำนวนมากที่จะคิดออก
mpez0

1
นอกจากนี้ยังobfuscation รหัสอาจขัดขวางการถอดชิ้นส่วน
คณิตศาสตร์

คำตอบ:


13

อันดับแรกการลงทะเบียนไม่มีที่อยู่ แต่ละคำสั่งในภาษาแอสเซมบลีใด ๆ แปลเป็น opcode Opcodes ใน x86 สามารถเป็นหนึ่งสองสองสามหรือมากกว่าไบต์ (ในโปรเซสเซอร์อื่น ๆ บางตัวพวกเขาเป็น "ความกว้างคงที่") โดยทั่วไป opcode จะระบุคำสั่งโหมดการระบุและการลงทะเบียนที่เกี่ยวข้อง "โหมดการกำหนดแอดเดรส" จะกำหนดว่าจำเป็นต้องใช้ CPU มากกว่า opcode หรือไม่นั่นคือโหมดการกำหนดแอดเดรสแบบ "ทันที" หมายความว่าจะมีข้อมูลเพิ่มเติมหลังจาก (หรือ "ทันทีหลังจาก") คำสั่งสำหรับคำสั่งนั้น - โหมดการระบุแอดเดรสแบบสัมบูรณ์ ที่อยู่หน่วยความจำทำตามคำแนะนำและถูกใช้โดยคำสั่งนั้น

คุณสามารถค้นหา opcode ของบางสิ่งที่MOV AL,SPคล้ายกันหรือคล้ายกันจากนั้นค้นหา x86 มีคำแนะนำมากมายที่ทำงานกับตัวชี้สแต็ก

แต่โปรดได้โปรดเลิกใช้ Notepad และใช้โปรแกรมแก้ไข hex แทน ฉันจะแนะนำ HxD แม้ว่าจะมีคนอื่นอีกหลายคน

และ @David Schwartz ถูกต้อง ตัวแยกส่วนจะวนซ้ำผ่านไฟล์และแปล opcodes กลับเป็นข้อความที่อ่านได้ สิ่งที่คุณต้องการจะเป็นไปได้โดยสิ้นเชิง

อย่างไรก็ตามคุณจำเป็นต้องรู้ว่าไฟล์อยู่ที่ไหนคำแนะนำเริ่มต้นเพราะถ้าคุณเริ่มที่อยู่ผิดข้อมูลบางอย่างที่ควรจะเป็น "ตัวถูกดำเนินการ" เพื่อ opcodes (เช่นคำแนะนำที่ใช้ที่อยู่สำหรับตัวถูกดำเนินการหรือ "อาร์กิวเมนต์") รับการตีความผิดเป็น opcodes การรู้สิ่งนี้ต้องการความรู้เกี่ยวกับรูปแบบที่สามารถเรียกใช้งานได้ซึ่งเป็นรูปแบบ "Portable Executable" หรือ PE สำหรับ Windows (และมักจะเป็น ELF สำหรับระบบ Linux) ฉันแน่ใจว่ามีอุปกรณ์ถอดแยกชิ้นส่วนที่เข้าใจ PE ฯลฯ แต่ฉันไม่รู้อะไรเลย


1
IDAเป็นหนึ่งในผู้ผลิต PE ที่ใช้กันทั่วไป ทำงานร่วมกับไฟล์ Linux และ Mac ได้เช่นกัน เวอร์ชั่น 5.0 ยังคงมีอยู่ในฟรีแวร์
Scott Chamberlain

1
> หากคุณเริ่มจากที่อยู่ผิด…อาจตีความผิด ซึ่งเป็นสาเหตุที่การเกิดขึ้นทั้งหมดของ%¨#$¨#ไม่จำเป็นต้องมีการอ้างอิงถึงตัวชี้กองซ้อน อาจเป็นแค่คำสั่งกลางที่ต่างกันสองคำสั่ง : _3p%¨#และ$¨#b5F( _3p   %¨#$¨#   b5F)
Synetech

12

ดังนั้นถ้าฉันเข้าใจทุกอย่างถูกต้อง

ไม่มาก

มันเป็นไฟล์ไบนารีและข้อมูลนั้นไม่สามารถเข้าใจได้สำหรับมนุษย์เรา

โดยทั่วไปแล้วไฟล์ไบนารีจะไม่สามารถเข้าใจมนุษย์และเครื่องได้โดยเฉพาะอย่างยิ่งเมื่อไม่ทราบจุดประสงค์ของไฟล์ โปรดทราบว่าไม่ใช่ไฟล์ไบนารี่ทั้งหมดที่เป็นไฟล์สั่งการ ไฟล์ไบนารีจำนวนมากเป็นไฟล์ข้อมูลที่ไม่มีคำสั่งเครื่องใด ๆ นั่นคือเหตุผลที่ใช้นามสกุลไฟล์เมื่อตั้งชื่อไฟล์ (ในระบบปฏิบัติการบางระบบ) การ CP / M ส่วนขยายcomถูกใช้เพื่อแสดงถึงไฟล์เรียกทำงาน การ ส่วนขยายexeถูกเพิ่มโดย MS-DOS เพื่อแสดงถึงรูปแบบไฟล์ปฏิบัติการอื่น * nixes ใช้แอ็ตทริบิวต์ execute เพื่อแสดงว่าไฟล์ใดที่สามารถเรียกใช้งานได้แม้ว่ามันอาจเป็นสคริปต์และโค้ด

ตามที่ผู้อื่นกล่าวถึงแล้วไฟล์ไบนารีซึ่งมีตัวเลขควรดูได้โดยโปรแกรมถ่ายโอนข้อมูลฐานสิบหกหรือโปรแกรมแก้ไขฐานสิบหกและไม่ควรใช้โปรแกรมดูข้อความ

มีตัวอย่างของเนื้อหาของโปรแกรม ping.exe

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

"ไฟล์โปรแกรม" ที่คุณอาจนึกถึงเรียกว่าไฟล์ภาพไบนารีหรือดัมพ์หน่วยความจำของโปรแกรม ไฟล์ดังกล่าวจะมีเพียงรหัสเครื่องและข้อมูลโดยที่การอ้างอิงที่อยู่ทั้งหมดได้รับการตั้งค่าอย่างเหมาะสมเพื่อการปฏิบัติ

แม้ว่าพวกเขาจะรู้รหัสการประกอบ (ระดับต่ำสุดของภาษาเครื่อง)

ภาษา Assembly ไม่ได้เป็นเช่นเดียวกับภาษาเครื่อง ซีพียูทั่วไป (เพื่อยกเว้นคอมพิวเตอร์ภาษาระดับสูง) ซีพียูยอมรับรหัสเครื่องเป็นอินพุตหนึ่งคำสั่งในแต่ละครั้ง ตัวถูกดำเนินการเป็นรีจิสเตอร์หรือที่อยู่หน่วยความจำตัวเลข ภาษาแอสเซมบลีเป็นภาษาระดับสูงกว่าที่สามารถใช้เลเบลสัญลักษณ์สำหรับตำแหน่งคำสั่งและตัวแปรรวมถึงการแทนที่รหัสตัวเลขด้วยหน่วยความจำ โปรแกรมภาษาแอสเซมบลีต้องถูกแปลงเป็นภาษาเครื่อง / รหัสก่อนจึงจะสามารถดำเนินการได้จริง (โดยทั่วไปคือยูทิลิตี้ที่เรียกว่าแอสเซมเบลอร์แอสเซมเบลอร์

การดำเนินการย้อนกลับ disassemby สามารถดำเนินการในไฟล์โปรแกรมที่มีความสำเร็จและการสูญเสียข้อมูลสัญลักษณ์ การถอดชิ้นส่วนของการถ่ายโอนข้อมูลหน่วยความจำหรือไฟล์อิมเมจโปรแกรมเป็นการทดลอง & ข้อผิดพลาดมากกว่าเนื่องจากต้องระบุรหัสและที่ตั้งข้อมูลด้วยตนเอง

BTW มีบุคคลที่สามารถอ่านและรหัสรหัสเครื่อง (ตัวเลข) ได้ แน่นอนว่านี่เป็นสิ่งที่ง่ายกว่าสำหรับซีพียูหรือไมโครคอนโทรลเลอร์ 8 บิตมากกว่าโปรเซสเซอร์ CISC 32 บิตพร้อมโหมดที่อยู่หน่วยความจำโหล


3

คุณไม่สามารถดูการเข้ารหัสไบนารีไฟล์ที่เหมาะสมและตั้งใจผ่าน Notepad ได้ โปรดตรวจสอบสิ่งนี้สำหรับการอ้างอิงในอนาคต โปรแกรมแก้ไขข้อความส่วนใหญ่ไม่แยกวิเคราะห์รูปแบบการเข้ารหัสแบบไบนารีและคาดว่าจะแยกวิเคราะห์การจัดรูปแบบรหัสอักขระ ASCII

ดังนั้นการเปิดไฟล์ไบนารีในเท็กซ์เอดิเตอร์จะให้ผลตอบแทนอักขระ ASCII ที่เทียบเท่าซึ่งไม่สมเหตุสมผลกับรูปแบบดั้งเดิมของข้อมูลไบนารีที่แยกวิเคราะห์โดยเท็กซ์เอดิเตอร์ ตามที่กล่าวไว้แล้วโปรแกรมแก้ไขฐานสิบหกและบางส่วนมีคุณสมบัติไบนารีเพื่อดูเนื้อหาในรูปแบบไบนารีบริสุทธิ์

คุณไม่ถูกต้องที่เนื้อหาของไฟล์ไบนารีไม่สามารถเข้าใจได้ ในขณะที่พวกเขาจะยากและในสถาปัตยกรรมคอมพิวเตอร์สมัยใหม่ยากมากที่จะถอดแยกชิ้นส่วนจากไบนารีเพียงอย่างเดียวในคำแนะนำที่เหมาะสมได้รับการยอมรับโดย CPU สำหรับการดำเนินการ (หรือจำลอง / CPU เสมือน) ฯลฯ สามารถทำได้

คุณคิดว่าอีมูเลเตอร์ถูกโปรแกรมอย่างไร ผู้พัฒนาจะต้องรู้จัก opcodes เพื่อให้สามารถเขียนโปรแกรมระบบที่รู้จำได้เพื่อให้รู้จักและประพฤติตัวเหมือนฮาร์ดแวร์จริงในบางลักษณะ เอกสารอธิบายสถาปัตยกรรมของซีพียูจำนวนมากและแม้แต่ GPU ก็มีพวกเขา (แม้ว่าจะเป็นความลับมากกว่า)

สิ่งที่ควรทราบอีกประการหนึ่งคือในระดับต่ำสุดถึงแม้ว่าสหสัมพันธ์ "ข้อมูลไบนารี" ไม่ได้เป็นศูนย์และศูนย์ แต่แรงดันไฟฟ้าสูงและต่ำจะขยาย / เปลี่ยนผ่านวงจรไฟฟ้าเป็นกระแสไฟฟ้า

โดยปกติแล้วไบนารีคือ 1: 1 ด้วยสิ่งนี้ดังนั้นจึงเหมาะสมที่จะใช้ระบบตัวเลขสำหรับมัน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.