วิธีดูไฟล์ไบนารี


45

จากสิ่งที่ฉันเข้าใจคอมไพเลอร์สร้างไฟล์ไบนารีที่ประกอบด้วย 1 และ 0 ที่ CPU สามารถอ่านได้ ฉันมีไฟล์ไบนารี แต่ฉันจะเปิดมันเพื่อดู 1 และ 0 ที่มีได้อย่างไร เครื่องมือแก้ไขข้อความบอกว่าไม่สามารถเปิดได้ ...

ป.ล. ฉันมีไบนารีที่รวบรวมแอสเซมบลีที่ควรเป็นรหัสไบนารีธรรมดาของ 1 และ 0 หรือไม่


1
เมื่อคุณแสดงแฟ้มไบนารีคุณจะเห็นว่ามันเป็นตัวอักษร ASCII
mazs


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

1
ดูคำตอบของฉัน และควรได้รับการเตือนว่ามีการใช้คำไบนารีในสองวิธีที่แตกต่างกันโดยสิ้นเชิงในทางปฏิบัติ: "ไฟล์ไบนารี" หมายถึงไฟล์ที่บริบทไม่บริสุทธิ์ ASCII- ข้อความ "เลขฐานสอง" หมายถึงตัวเลขที่เขียนโดยใช้รูปแบบไบนารี
Pierre-Olivier Vares

@mazs ASCII? ฉันคิดว่า UTF-8 มีโอกาสมากขึ้นหรือหน้ารหัสบางส่วนหากโปรแกรมคิดว่าดูเหมือนว่าจะถูกเข้ารหัสด้วยวิธีนี้ผ่านทางความวุ่นวาย
JDługosz

คำตอบ:


99

ตามคำตอบของtyranid นี้ :

hexdump -C yourfile.bin 

นอกจากว่าคุณต้องการแก้ไขแน่นอน Linux distros ส่วนใหญ่มีhexdumpค่าเริ่มต้น (แต่เห็นได้ชัดว่าไม่ใช่ทั้งหมด)


ปรับปรุง

ตามคำตอบนี้โดยEmilio Bool :

xxd ทำทั้งไบนารีและเลขฐานสิบหก

สำหรับถังขยะ:

xxd -b file

สำหรับ hex:

xxd file

สิ่งนี้ช่วยได้จริงๆ! ขอบคุณ
Shravya Boggarapu

45

คนหลายคนได้ตอบคำถามในบางแง่มุม แต่ไม่ใช่ทั้งหมด

ไฟล์ทั้งหมดในคอมพิวเตอร์ถูกจัดเก็บเป็น 1 และ 0 รูปภาพไฟล์ข้อความเพลงแอปพลิเคชั่นที่ใช้งานได้ไฟล์วัตถุ ฯลฯ

พวกเขาทั้งหมด 0 และ 1 ความแตกต่างเพียงอย่างเดียวคือพวกเขาตีความแตกต่างกันไปขึ้นอยู่กับสิ่งที่เปิดพวกเขา

เมื่อคุณดูไฟล์ข้อความโดยใช้ไฟล์catปฏิบัติการ ( catในกรณีนี้) จะอ่าน 1 และ 0 ทั้งหมดและจะแสดงไฟล์เหล่านั้นให้คุณโดยแปลงเป็นอักขระจากตัวอักษรหรือภาษาที่เกี่ยวข้อง

เมื่อคุณดูไฟล์โดยใช้โปรแกรมดูรูปภาพระบบจะใช้ทั้ง 1 และ 0 ทั้งหมดและเปลี่ยนเป็นรูปภาพขึ้นอยู่กับรูปแบบของไฟล์และตรรกะบางอย่างที่จะทำให้มันหมด

ไฟล์ไบนารีที่คอมไพล์แล้วจะไม่แตกต่างกันจะถูกเก็บเป็น 1 และ 0

คำตอบของ arzyfex ให้เครื่องมือในการดูไฟล์เหล่านั้นในรูปแบบที่แตกต่างกัน แต่การอ่านไฟล์ในรูปแบบไบนารี่สามารถทำงานกับไฟล์ใด ๆ บนคอมพิวเตอร์ได้เช่นเดียวกับการดูว่าเป็นเลขฐานแปดหรือฐานสิบหกหรือ ASCII จริง ๆ ของรูปแบบเหล่านั้น

หากคุณต้องการที่จะเข้าใจว่าไฟล์ไบนารีที่ปฏิบัติการได้ทำอะไรคุณต้องดูด้วยวิธีที่แสดงภาษาแอสเซมเบลอร์ (เริ่มต้น) ซึ่งคุณสามารถทำได้

objdump -d /path/to/binary

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

การอ่านภายนอกบางอย่าง

หมายเหตุ: เนื่องจาก @Wildcard ชี้ให้เห็นจึงเป็นสิ่งสำคัญที่จะต้องทราบว่าไฟล์ไม่มีตัวอักษร 1 และ 0 (ตามที่คุณเห็นบนหน้าจอ) พวกเขามีข้อมูลตัวเลขจริงบิตข้อมูลแต่ละบิตซึ่งอยู่บน (1) หรือปิด (0) แม้แต่คำอธิบายนั้นก็เป็นเพียงการประมาณความจริงเท่านั้น ประเด็นสำคัญคือถ้าคุณค้นหาผู้ชมที่แสดง 1 และ 0 ของคุณแม้จะยังคงตีความข้อมูลจากไฟล์จากนั้นแสดงอักขระ ASCII สำหรับ 0 และ 1 ข้อมูลจะถูกเก็บไว้ในรูปแบบไบนารี ( ดูลิงค์เลขฐานสองด้านบน) รายการวิกิชุมชนของ Pierre-Olivierครอบคลุมรายละเอียดเพิ่มเติมนี้


ดีexposé คุณอาจต้องการเพิ่มว่าอักขระที่คุณเห็นในบรรทัดข้อความเป็น "1" หรือ "0" ไม่ได้ถูกจัดเก็บเป็นคอมพิวเตอร์ "1" หรือ "0" เดียว OP ดูเหมือนจะมีความสับสนเกี่ยวกับเรื่องนี้
สัญลักษณ์ตัวแทน

1
ฉันจะเล่นลิ้น (เช่นไม่เห็นด้วย) กับคำสั่งของคุณ "เมื่อคุณดูไฟล์ข้อความที่ใช้catปฏิบัติการ ( catในกรณีนี้) อ่าน 1 และ 0 ทั้งหมดและมันนำเสนอให้คุณโดยการแปลงเป็นตัวอักษรจากตัวอักษรที่เกี่ยวข้องหรือ ภาษา." catไม่ทำอย่างนั้น ทั้งหมดcatจะเขียนข้อมูลไปยังเอาต์พุตมาตรฐาน (เว้นแต่คุณจะใช้ตัวเลือก"เป็นอันตราย" ) โปรแกรมเทอร์มินัล (และ / หรือฮาร์ดแวร์เทอร์มินัลถ้ามีเช่นเฟิร์มแวร์ของมัน) กำหนดวิธีการแสดงผลไบต์เป็นตัวอักษรอาจมีความช่วยเหลือจากไดรเวอร์ TTY
G-Man กล่าวว่า 'Reinstate Monica'

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

14

ที่ระดับต่ำไฟล์จะถูกเข้ารหัสเป็นลำดับของ 0 และ 1

แต่โปรแกรมเมอร์ก็ไม่ได้ไปที่นั่นในทางปฏิบัติ

ครั้งแรก (และสิ่งที่สำคัญกว่าเรื่องของ 0 และ 1 นี้) คุณต้องเข้าใจสิ่งที่ปรุงแต่งที่คอมพิวเตอร์จะถูกเข้ารหัสด้วยตัวเลข

  • อักขระถูกเข้ารหัสด้วยตัวเลขโดยใช้ตารางชุดอักขระ ตัวอย่างเช่นตัวอักษร 'A' มีค่า 65 เมื่อเขียนโค้ดโดยใช้ ASCII ดูhttp://www.asciitable.com

  • พิกเซลถูกเข้ารหัสด้วยตัวเลขอย่างน้อยหนึ่งหมายเลข (มีรูปแบบกราฟิกจำนวนมาก) ตัวอย่างเช่นในรูปแบบ 3 สีมาตรฐานพิกเซลสีเหลืองจะถูกเข้ารหัสเป็น: 255 สำหรับสีแดง, 255 สำหรับสีเขียว, 0 สำหรับ Blue ดูhttp://www.quackit.com/css/css_color_codes.cfm (เลือกสีและดูเซลล์ R, G & B)

  • ไฟล์ binary-executable ถูกเขียนใน Assembly; แต่ละชุดคำสั่งจะมีรหัสเป็นตัวเลข ตัวอย่างเช่นคำสั่งแอสเซมบลีMOVB $0x61,%alถูกเข้ารหัสด้วยตัวเลขสองตัว: 176,97 ดูhttp://www.sparksandflames.com/files/x86InstructionChart.html (แต่ละคำสั่งมีหมายเลขที่เกี่ยวข้องจาก 00 ถึง FF เนื่องจากมีการใช้สัญลักษณ์เลขฐานสิบหก ดูด้านล่าง)

ประการที่สอง : หมายเลขแต่ละคนสามารถมีหลายตัวแทนหรือสัญลักษณ์

บอกว่าฉันมีแอปเปิ้ล 23 ชิ้น

  • ถ้าฉันสร้างแอปเปิ้ลสิบกลุ่มฉันจะได้รับ: แอปเปิ้ลสิบสองกลุ่มและแอปเปิ้ลสองกลุ่ม นั่นคือสิ่งที่เราหมายถึงเมื่อเราเขียน 23: a 2 (หลักสิบ) และ 3 (หน่วย)
  • แต่ฉันสามารถสร้างกลุ่มแอปเปิ้ลได้ 16 กลุ่ม ดังนั้นฉันจะได้รับหนึ่งในกลุ่ม -16-และ 7 แอปเปิ้ลคนเดียว ในสัญลักษณ์เลขฐานสิบหก (นั่นคือวิธีที่เรียกว่า 16 radix) ฉันจะเขียน: 17 (16 + 7) ในการแยกความแตกต่างจากสัญกรณ์ทศนิยมโดยทั่วไปสัญกรณ์เลขฐานสิบหกจะถูกบันทึกด้วยคำนำหน้าหรือคำต่อท้าย: 17h, # 17 หรือ $ 17 แต่จะเป็นตัวแทนแอปเปิ้ลมากกว่า 9 กลุ่มมากกว่า 16 กลุ่มหรือมากกว่า 9 แอปเปิ้ลได้อย่างไร เพียงแค่เราใช้ตัวอักษรจาก A (10) ถึง F (15) หมายเลข 31 (ดังใน 31 แอปเปิ้ล) เขียนเป็น # 1F เป็นเลขฐานสิบหก

  • ในบรรทัดเดียวกันเราสามารถทำ group-of-two-apples (และกลุ่มแอปเปิ้ลกลุ่มสองกลุ่มสองกลุ่มคือกลุ่มแอปเปิ้ล 2x2 และอื่น ๆ ) จากนั้น 23 คือ: 1 กลุ่มของ 2x2x2x2 แอปเปิ้ล, 0 กลุ่มของ 2x2x2- แอปเปิ้ล, 1 กลุ่มของ 2x2x2- แอปเปิ้ล, 1 กลุ่มของแอปเปิ้ล 2 เท่า, 1 กลุ่ม 2 แอปเปิ้ลและ 1 แอปเปิ้ลโลน

(ดูhttps://en.wikipedia.org/wiki/Radix )

กลไกที่อนุญาตให้สองสถานะ (สวิตช์) นั้นทำได้ง่ายเช่นเดียวกับดิสก์ที่อยู่ในหน่วยความจำ

นั่นเป็นเหตุผลที่ข้อมูลและโปรแกรมซึ่งถูกมองว่าเป็นตัวเลขถูกเขียนและจัดการในรูปแบบไบนารี

แปลแล้ว - ขึ้นอยู่กับประเภทข้อมูล - ลงในแบบฟอร์มที่เหมาะสม (ตัวอักษร A, พิกเซลสีเหลือง) หรือดำเนินการ (คำสั่ง MOV)

hexdumpแสดงรายการหมายเลขที่เข้ารหัสข้อมูล (หรือแอสเซมบลีโปรแกรม) ในรูปแบบเลขฐานสิบหก จากนั้นคุณสามารถใช้เครื่องคิดเลขเพื่อรับรูปแบบไบนารีที่สอดคล้องกัน



4

คุณสามารถเปิดในโปรแกรมแก้ไขฐานสิบหกซึ่งแสดงเป็นชุดของค่าเลขฐานสิบหก xxd file

คุณพยายามทำอะไรให้สำเร็จ


แต่ฉันคิดว่าคอมพิวเตอร์สามารถอ่าน 1 และ 0 ได้เท่านั้น ฉันเห็นสิ่งนั้นได้ไหม ฉันพยายามที่จะเข้าใจว่าคอมพิวเตอร์ทำงานอย่างไร
Martin Zeltin

2
เพียงอย่างเดียวนั่นไม่ช่วยคุณมาก หากคุณต้องการที่จะเรียนรู้วิธีการว่ามันทำงานแล้วในกล่อง Linux ได้ดูที่รูปแบบไฟล์เอลฟ์และen.wikipedia.org/wiki/X86_instruction_listings หากคุณเพียงต้องการดูรหัสที่สร้างโดยคอมไพเลอร์ให้ดูที่การรันด้วย gdb เนื่องจากคุณต้องการได้รับ "ระดับต่ำ" เพิ่มเติมลองดู nand2tetris.org เช่นกัน สำหรับภาษาแอสเซมบลีฉันได้ยินว่า 6502 และแอสเซมบลี mips มากดีกว่า x86_64 / x86 แอสเซมบลี
theblazehen

@theblazehen ผู้ประกอบ x86 ครอบครัวที่ทันสมัยเป็นสัตว์ร้าย 8086 สามารถจัดการได้และฉันคิดว่าซีพียูใด ๆ จากยุคนั้น (ช่วงปลายทศวรรษ 1970 ถึงครึ่งแรกของปี 1980) น่าจะทนได้ตราบใดที่แอสเซมเบลอร์ไป
CVn


3

คำสั่งLinux stringsพิมพ์สตริงของอักขระที่พิมพ์ได้ในไฟล์เช่น:

$ strings /usr/bin/gnome-open 
/lib64/ld-linux-x86-64.so.2
3;o:)
libgnome-2.so.0
_ITM_deregisterTMCloneTable
g_object_unref
gmon_start__
g_dgettext
_Jv_RegisterClasses
g_strdup
_ITM_registerTMCloneTable
g_error_free
gnome_program_init
libgnome_module_info_get
libgio-2.0.so.0
g_ascii_strncasecmp

ฯลฯ ... มันสามารถอ่านได้มากกว่าไบนารี


OP ถามว่าฉันจะเปิดมันเพื่อดู 1 และ 0 ที่มีได้อย่างไร แต่stringsคำสั่งจะตัดส่วนใหญ่ของไบต์ที่เขาต้องการดู
jlliagre

@jlliagre - ในขณะที่คุณถูกต้องstringsคำสั่ง - โดยเฉพาะอย่างยิ่งที่มีความยาวอีกต่อไปเช่นstrings -n 6- จริง ๆ ช่วยหาสิ่งที่ไฟล์ไบนารีมีอยู่ในนั้นถ้ามันมีค่าคงที่สตริงใด ๆ ฯลฯ คำตอบนี้ควรได้รับการแสดงความคิดเห็นแล้วมันจะ ได้ดี
Joe

@ โจใช่ฉันไม่ได้ถามถึงstringsประโยชน์ของคำสั่งเพียงข้อเท็จจริงที่ว่าไม่ได้ตอบคำถาม OP ที่นี่
jlliagre

3

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

เช่น:

เลขฐานสอง:

xxd -b README.md                                                                
00000000: 00100011 00100000

ซึ่งคือ 35 และ 32 เป็นทศนิยม

xxd README.md                                                                   
00000000: 2320

35 และ 32 เป็นทศนิยม


คนอื่น ๆได้กล่าวถึงนี้ อย่างไรก็ตามนี่เป็นบทสรุปที่ดี คุณสามารถแก้ไขคำตอบหากคุณต้องการเปลี่ยนย่อหน้าแรก
wizzwizz4

ดีมากฉันไม่ได้เห็นใครพูดถึงฉันอาจจะพลาด
วันพฤหัสบดีถัดไป

ทราบว่าคุณต้องติดตั้งเพื่อใช้งานvim xxd
starbeamrainbowlabs

2

คุณสามารถดูไฟล์ในรูปแบบไบนารี่vimโดย:

  • เปิดไฟล์ใน vim
  • เข้าสู่ :% !xxd -b

xxdคำสั่งสามารถ tweaked ต่อไปตัวอย่างเช่น:

  • โดยการเพิ่ม-g4ซึ่งจะจัดกลุ่มบิตในแพ็ค 32 บิต
  • โดยการเพิ่ม-c4ซึ่งจะจัดรูปแบบผลลัพธ์ให้มี 4 ไบต์ต่อบรรทัด

การเพิ่มค่าสถานะทั้งสองด้านบนจะทำให้คุณมีจำนวนเต็ม 32 บิตต่อหนึ่งบรรทัด


1

คุณสามารถทำได้ด้วยเช่น ruby ​​one-liner:

$ ruby -e 'while c=STDIN.read(1); printf "%08b" % c.bytes.first; end'

ระบบตาม C แบบดั้งเดิมมีการสนับสนุนหมัดสำหรับการแสดงผลสิ่งในไบนารี AFAIK ปกติแล้วมันจะไม่ค่อยมีประโยชน์เพราะค่อนข้างอ่านยากซึ่งแตกต่างจากการทิ้งเลขฐานสิบหก


ขอบคุณ! การเพิ่มช่องว่างโดยตรงหลังจาก%08bทำให้กลุ่มจัดกลุ่มเอาต์พุตเป็นไบต์
starbeamrainbowlabs

0

GHex เป็นเพื่อนของคุณ :)
คุณสามารถติดตั้งได้โดยใช้บรรทัดคำสั่ง

Ubuntu:

sudo apt-get ghex install

Fedora:

sudo yum ติดตั้ง ghex

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