Bí ẩn của tập tin nhị phân


7

Đây là về các tệp trực tiếp từ trình biên dịch, giả sử g ++ và -ocờ (outfile).

Nếu chúng là nhị phân, không phải chúng chỉ là một bó 0 và 1 sao?

Khi bạn mèo chúng, bạn nhận được đầu ra khó hiểu nhưng cũng có những từ còn nguyên vẹn.

Nếu bạn nộp chúng, bạn sẽ nhận được câu trả lời ngay lập tức - dường như không có tính toán. Các tập tin nhị phân trong thực tế có tiêu đề với loại thông tin này?

Tôi nghĩ rằng một tệp thực thi nhị phân chỉ là chương trình vừa được biên dịch, chỉ ở dạng hướng dẫn máy mà CPU của bạn có thể hiểu ngay lập tức và rõ ràng. Nếu vậy, không phải lệnh đó chỉ là các mẫu bit sao? Nhưng sau đó, tất cả những thứ khác trong nhị phân là gì? Làm thế nào để bạn hiển thị các bit?

Ngoài ra, nếu bạn bằng cách nào đó nắm được hướng dẫn sử dụng bộ xử lý của mình, bạn có thể viết nhị phân thủ công, một lệnh máy tại một thời điểm không? Điều đó sẽ vô cùng kém hiệu quả, nhưng sẽ rất hấp dẫn nếu bạn làm cho nó hoạt động ngay cả đối với một "Hello World!" bản giới thiệu.


2
Điểm mấu chốt là mỗi 1 và mỗi 0 trong cụm từ, "Chỉ có số 0 và số 0" chỉ các bit , không phải byte . Thông thường, các chương trình trình bày văn bản / dữ liệu theo byte. Ngay cả 10 này là một đại diện của một byte 8 bit, giữ các giá trị đúng 1 và 0 bên dưới.
Peter.O

2
Bạn có thể nhận được các bit với xxd -b file.
Emanuel Berg

Câu trả lời:


16

Câu hỏi siêu người dùng này: Tại sao bạn không thấy mã nhị phân khi mở tệp nhị phân bằng trình soạn thảo văn bản? giải quyết điểm đầu tiên của bạn khá tốt.

Dữ liệu nhị phân và văn bản không được tách riêng: Chúng chỉ đơn giản là dữ liệu. Nó phụ thuộc vào cách giải thích làm cho chúng cái này hay cái khác. Nếu bạn mở dữ liệu nhị phân (chẳng hạn như tệp hình ảnh) trong trình chỉnh sửa văn bản, phần lớn dữ liệu sẽ không có ý nghĩa, vì nó không phù hợp với cách hiểu của bạn (như văn bản).

Các tệp được lưu dưới dạng số không và số (ví dụ điện áp / không có điện áp trên bộ nhớ, từ hóa / không từ hóa trên ổ cứng). Bạn không nhìn thấy số không và số khi nhập catcác tệp vì các chuỗi 0/1 sẽ không được sử dụng nhiều cho con người; các ký tự có ý nghĩa hơn và hexdump tốt hơn cho hầu hết các mục đích (thử hexdumptrên một tệp).

Các tệp thực thi có một tiêu đề mô tả các tham số như kiến ​​trúc mà chương trình được xây dựng và các phần của tệp là mã và dữ liệu. Đây là những gì filesử dụng để xác định các đặc điểm của tệp nhị phân của bạn.

Cuối cùng: có, bạn có thể viết chương trình bằng ngôn ngữ lắp ráp bằng cách sử dụng trực tiếp CPU. Hãy xem Giới thiệu về lập trình lắp ráp UNIXtài liệu Intel x86 cho điểm khởi đầu.


9

Tất cả các tệp được lưu trữ dưới dạng 1 và 0, mèo chỉ cố gắng diễn giải mỗi BYTE (8 bit) là một ký tự, đó là lý do tại sao bạn thấy các ký tự không thể hiểu được.


4

Tất cả các tệp là nhị phân dưới mui xe: chúng được lưu trữ dưới dạng một chuỗi các bit .

Các bit của tập tin thực sự được nhóm theo byte . Mỗi tệp bao gồm một số nguyên byte. Tất cả các hệ thống unix và trên thực tế hầu hết tất cả các máy tính đều có byte gồm 8 bit (được gọi là octet trong thuật ngữ mạng). Có một cách tự nhiên để diễn giải các byte là số 8 bit, tức là các số từ 0 đến 2 8 -1 = 255.

Để xem chúng là nhị phân, bạn cần một công cụ viết chúng ra theo ký hiệu nhị phân. Con người không phù hợp với ký hiệu nhị phân: mất quá nhiều thời gian để viết bất cứ điều gì. Thông thường hơn là sử dụng ký hiệu thập lục phân , với 16 chữ số khác nhau. Ví dụ: 41(sáu mươi lăm trong thập lục phân) thoải mái hơn để đọc hơn 01000001(sáu mươi lăm trong nhị phân). Bạn có thể sử dụng một lệnh, chẳng hạn như od(bát bát bát bát) hexdumphoặc hdđể liệt kê một tệp có ký hiệu bát phân hoặc thập lục phân cho mỗi byte ( od -t x1chuyển sang thập lục phân).

Byte có thể đại diện cho các ký tự. Có một số mã hóa ký tự được sử dụng trong thế giới unix. Tất cả đều dựa trên ASCII , định nghĩa việc giải thích các byte trong khoảng từ 0 đến 127. Lưu ý rằng điều này chỉ xác định một ý nghĩa cho một nửa các giá trị byte có thể. Ví dụ: 65 đại diện cho chữ in hoa A, 97 đại diện cho chữ thường a, 30 đại diện cho chữ số 0, v.v. Một số mã hóa ký tự đại diện cho mỗi ký tự bằng một byte; ví dụ: trong mã hóa Latin-1 , 163 đại diện £, 241 đại diệnñvà như thế. Số lượng ký tự tối đa mà một người có thể đại diện theo cách này là 256, không nhiều; do đó, có các bảng mã khác sử dụng nhiều hơn một byte cho mỗi ký tự. Mã hóa tiêu chuẩn thực tế trong thế giới unix hiện nay là UTF-8 , là mã hóa có độ dài thay đổi (các ký tự khác nhau chiếm số byte khác nhau) cho bộ ký tự Unicode .

Một tệp văn bản là một tệp nhị phân xảy ra để chứa văn bản dễ hiểu. Trong thực tế, đối với các chương trình unix, một tệp là một tệp văn bản miễn là nó tuân thủ hai điều kiện:

  • Một tệp văn bản có thể không chứa bất kỳ byte null nào (một byte có giá trị bằng 0). Byte này không đại diện cho bất kỳ ký tự nào và được sử dụng như một điểm đánh dấu đặc biệt trong nội bộ trong nhiều chương trình thao tác văn bản.
  • Một tệp văn bản bao gồm một chuỗi các dòng và mỗi dòng được kết thúc bởi một tự dòng mới (có giá trị số 10).

Máy thực thi là một loại tệp nhị phân cụ thể. Nếu bạn chạy catlệnh trên chúng, bạn sẽ thấy rác với một chút văn bản. Các tệp này cũng có thể chứa các lệnh cho thiết bị đầu cuối của bạn. Bạn có thể sử dụng chương trình stringsđể xem tất cả các đoạn văn bản trong tệp nhị phân, bỏ qua các ký tự không in được.

Các tệp thực thi của máy không chính xác là một chuỗi các hướng dẫn máy: chúng cũng chứa một ít thông tin bổ sung cho hệ điều hành biết cách tải tệp vào bộ nhớ, thường là một số dữ liệu được sử dụng bởi chương trình và tùy chọn gỡ lỗi thông tin. Hầu hết các hệ thống unix sử dụng định dạng ELF cho các máy thực thi. Định dạng này chỉ định cách chia tệp chứa mã máy thành các phần và phần đó độc lập với kiến ​​trúc máy; một số phần chứa mã và ý nghĩa của mã đó là dành riêng cho một kiến ​​trúc máy cụ thể.

Bạn có thể sử dụng lệnh objdump -D /path/to/machine-executableđể hiển thị danh sách thực thi dưới dạng có thể đọc được: ngôn ngữ hợp ngữ . Vâng, dù sao cũng có thể đọc được bởi một người được đào tạo. Ngôn ngữ hội dành riêng cho kiến ​​trúc bộ xử lý và ánh xạ trực tiếp tới các hướng dẫn máy.

Có thể viết một chương trình hoàn chỉnh bằng ngôn ngữ lắp ráp, nhưng điều này hiếm khi được thực hiện cho các chương trình không tầm thường, bởi vì nó mất nhiều thời gian. Nếu bạn thực sự điên, bạn có thể viết chương trình của mình trực tiếp dưới dạng nhị phân. Một số người đã cố gắng đưa ra chương trình ngắn nhất có thể in raHello world ; Ryan Henszey giải thích cách viết ELF thực thi 142 byte cho bộ xử lý PC ; Brian Raiter đã phân tích định dạng ELF và đưa ra một chương trình 45 byte mà Linux sẵn sàng thực hiện (chương trình đó không in gì cả).

Ngoài ra còn có các tệp thực thi không phải là tệp nhị phân; chúng được gọi là kịch bản . Và ngược lại, có nhiều tệp nhị phân không thể thực thi được: hình ảnh, video, tệp nén, tài liệu xử lý văn bản, thư viện mã không có điểm vào , tệp thực thi cho các kiến ​​trúc bộ xử lý khác,

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.