ฉันต้องการแยกชิ้นส่วน MBR (512 ไบต์แรก) ของดิสก์ x86 ที่สามารถบู๊ตได้ที่ฉันมี ฉันคัดลอก MBR ไปยังไฟล์โดยใช้
dd if=/dev/my-device of=mbr bs=512 count=1
ข้อเสนอแนะสำหรับยูทิลิตี้ Linux ที่สามารถแยกไฟล์ได้mbrหรือไม่?
ฉันต้องการแยกชิ้นส่วน MBR (512 ไบต์แรก) ของดิสก์ x86 ที่สามารถบู๊ตได้ที่ฉันมี ฉันคัดลอก MBR ไปยังไฟล์โดยใช้
dd if=/dev/my-device of=mbr bs=512 count=1
ข้อเสนอแนะสำหรับยูทิลิตี้ Linux ที่สามารถแยกไฟล์ได้mbrหรือไม่?
คำตอบ:
คุณสามารถใช้ objdump ตามบทความนี้ไวยากรณ์คือ:
objdump -D -b binary -mi386 -Maddr16,data16 mbr
--target คือ "แยกส่วนเนื้อหาของทุกส่วน"; หรือจะบังคับให้อ่านเป็นรูปแบบรหัสวัตถุที่ระบุ (ไม่ใช่เอลฟ์ แต่เป็นไบนารีดิบในกรณีของเรา); จะระบุสถาปัตยกรรมที่จะใช้ (ในไฟล์ของเราไม่มีส่วนหัวที่มีข้อมูลส่วนโค้ง) เป็นตัวเลือกของ disassembler; ใช้เพื่อ "ระบุขนาดแอดเดรสเริ่มต้นและขนาดตัวถูกดำเนินการ" (ปฏิบัติกับรหัสเป็น i8086 หนึ่งในเอนจินดิสซึม x86 สากล)-b-D-b bfdname--target=bfdname-m machine-M optionsaddr16,data16
เครื่องมือ GNU เรียกว่าobjdumpตัวอย่างเช่น:
objdump -D -b binary -m i8086 <file>
-m i386หรือ-Mintel,x86-64. i8086เป็นสถาปัตยกรรมเก่าและการใช้โค้ดสมัยใหม่อาจให้ผลลัพธ์ที่ไม่คาดคิด นอกจากนี้การระบุx86-64ว่า-Mอาจเป็นความคิดที่ดีในปัจจุบันเนื่องจากเครื่องจำนวนมากเป็น 64 บิต ส่งintelต่อเพื่อ-Mเปลี่ยนไวยากรณ์เป็นสไตล์ Intel แทนที่จะเป็นสไตล์ AT&T เริ่มต้นซึ่งคุณอาจต้องการหรือไม่ก็ได้
ฉันชอบndisasmเพื่อจุดประสงค์นี้ มาพร้อมกับแอสเซมเบลอร์ NASM ซึ่งฟรีและโอเพ่นซอร์สและรวมอยู่ในที่เก็บแพ็คเกจของ linux distros ส่วนใหญ่
ndisasm -b16 -o7c00h -a -s7c3eh mbr
คำอธิบาย - จาก ndisasm manpage
-b= ระบุโหมด 16-, 32- หรือ 64 บิต ค่าเริ่มต้นคือโหมด 16 บิต-o= ระบุที่อยู่ในการโหลดตามสัญญาสำหรับไฟล์ ตัวเลือกนี้ทำให้ ndisasm รับแอดเดรสที่แสดงไว้ที่ขอบด้านซ้ายมือและที่อยู่เป้าหมายของการกระโดดและการโทรที่สัมพันธ์กับพีซี-a = เปิดใช้งานโหมดการซิงค์อัตโนมัติ (หรืออัจฉริยะ) ซึ่ง ndisasm จะพยายามเดาว่าควรจะทำซิงโครไนซ์ที่ใดโดยการตรวจสอบที่อยู่เป้าหมายของการกระโดดแบบสัมพัทธ์และเรียกมันว่าแยกชิ้นส่วน-s= ระบุแอดเดรสการซิงโครไนซ์ด้วยตนเองดังนั้น ndisasm จะไม่ส่งออกคำสั่งเครื่องใด ๆ ซึ่งครอบคลุมไบต์ทั้งสองด้านของแอดเดรส ดังนั้นคำสั่งที่เริ่มต้นที่ที่อยู่นั้นจะถูกถอดประกอบอย่างถูกต้องmbr = ไฟล์ที่จะถอดประกอบ-b specifies 16-, 32- or 64-bit mode. The default is 16-bit mode. -o is the notional load address for the file. This option causes ndisasm to get the addresses it lists down the left hand margin, and the target addresses of PC-relative jumps and calls, right. -s specifies a synchronisation address, such that ndisasm will not output any machine instruction which encompasses bytes on both sides of the address. Hence the instruction which starts at that address will be correctly disassembled.
starblueและhlovdalทั้งสองมีส่วนของคำตอบที่เป็นที่ยอมรับ หากคุณต้องการแยกส่วนโค้ด i8086 ดิบคุณมักต้องการไวยากรณ์ของ Intel ไม่ใช่ไวยากรณ์ AT&T ด้วยดังนั้นให้ใช้:
objdump -D -Mintel,i8086 -b binary -m i386 mbr.bin
objdump -D -Mintel,i386 -b binary -m i386 foo.bin # for 32-bit code
objdump -D -Mintel,x86-64 -b binary -m i386 foo.bin # for 64-bit code
หากรหัสของคุณคือ ELF (หรือ a.out (หรือ (E) COFF)) คุณสามารถใช้รูปแบบย่อ:
objdump -D -Mintel,i8086 a.out # disassembles the entire file
objdump -d -Mintel,i8086 a.out # disassembles only code sections
สำหรับรหัส 32 บิตหรือ 64 บิตให้ละเว้น,8086; ส่วนหัวของ ELF มีข้อมูลนี้อยู่แล้ว
ndisasmตามที่แนะนำโดยjameslinก็เป็นทางเลือกที่ดีเช่นกัน แต่objdumpโดยปกติแล้วจะมาพร้อมกับระบบปฏิบัติการและสามารถจัดการกับสถาปัตยกรรมทั้งหมดที่ GNU binutils รองรับ (ส่วนเหนือของที่รองรับโดย GCC) และโดยปกติเอาต์พุตจะสามารถป้อนเข้า GNU ได้as(โดยปกติแล้ว ndisasm สามารถ จะถูกป้อนเข้าไปnasmแน่นอน)
Peter Cordesแนะนำว่า“ objconv ของ Agner Fogนั้นดีมาก ทำให้ป้ายกำกับเป้าหมายสาขาทำให้ง่ายต่อการเข้าใจว่าโค้ดทำอะไร สามารถแยกส่วนออกเป็นไวยากรณ์ NASM, YASM, MASM หรือ AT&T (GNU)”
มัลติมีเดียไมค์แล้วพบข้อมูลเกี่ยวกับ--adjust-vma; สิ่งที่ndisasmเทียบเท่าคือ-oตัวเลือก
ในการแยกชิ้นส่วนให้พูดsh4รหัส (ฉันใช้หนึ่งไบนารีจาก Debian เพื่อทดสอบ) ใช้สิ่งนี้กับ GNU binutils (ตัวแยกชิ้นส่วนอื่น ๆ เกือบทั้งหมดถูก จำกัด ไว้ที่แพลตฟอร์มเดียวเช่น x86 พร้อมndisasmและobjconv):
objdump -D -b binary -m sh -EL x
-mเป็นเครื่องและ-ELหมายเล็ก ๆ น้อย ๆ Endian (สำหรับsh4ebใช้-EBแทน) ซึ่งมีความเกี่ยวข้องสำหรับสถาปัตยกรรมที่มีอยู่ใน endianness อย่างใดอย่างหนึ่ง
gcc -O3 -masm=intel -fverbose-asm -S -o- | lessเนื่องจากฉันมักจะพยายามปรับแต่งแหล่งที่มา C เพื่อรวบรวมเป็น asm ที่ดี
ลองใช้คำสั่งนี้:
sudo dd if=/dev/sda bs=512 count=1 | ndisasm -b16 -o7c00h -