Làm thế nào tập tin xác định tập tin cụ thể này?


8

Tôi đang chạy filevới tệp Wallet.dat (Một tệp mà Bitcoin giữ khóa riêng của nó) và mặc dù dường như không có bất kỳ tiêu đề hoặc chuỗi nhận dạng nào, filevẫn có thể nói rằng đó là tệp Berkley DB, ngay cả khi tôi cắt nó xuống 16 byte.

Tôi biết rằng tập tin đã áp dụng một số loại quy tắc hoặc tìm kiếm một chuỗi để xác định nó. Tôi muốn biết quy tắc mà nó áp dụng ở đây là gì, để tôi có thể sao chép nó trong chương trình của riêng mình.


1
tập tin không thể sai được, nó chỉ đoán dựa trên nội dung của tập tin, "lỗi in thứ ba" là một ví dụ về việc nó đoán sai
Jasen

1
@Jasen filekhông sai trong trường hợp này.
Nick ODell

Câu trả lời:


16

Lấy nguồn của lệnh tập tin. Hầu hết nếu không phải tất cả các thông báo nguồn mở sử dụng cái này . Các filelệnh đi kèm với các magiccơ sở dữ liệu, đặt tên theo con số kỳ diệu mà nó mô tả. (Cơ sở dữ liệu này cũng được cài đặt trên hệ thống trực tiếp của bạn, nhưng ở dạng được biên dịch.) Tìm tệp chứa văn bản mô tả mà bạn thấy:

grep 'Berkeley DB' magic/Magdir/*

Các magictrang người đàn ông mô tả định dạng của tập tin. Các dòng kích hoạt cho Berkeley Berkeley DB 'là

0       long    0x00061561      Berkeley DB
0       belong  0x00061561      Berkeley DB
12      long    0x00061561      Berkeley DB
12      belong  0x00061561      Berkeley DB
12      lelong  0x00061561      Berkeley DB
12      long    0x00053162      Berkeley DB
12      belong  0x00053162      Berkeley DB
12      lelong  0x00053162      Berkeley DB
12      long    0x00042253      Berkeley DB
12      belong  0x00042253      Berkeley DB
12      lelong  0x00042253      Berkeley DB
12      long    0x00040988      Berkeley DB
12      belong  0x00040988      Berkeley DB 
12      lelong  0x00040988      Berkeley DB

Cột đầu tiên chỉ định phần bù mà tại đó một chuỗi byte nhất định sẽ được tìm thấy. Cột thứ ba chứa chuỗi byte. Cột thứ hai mô tả loại chuỗi byte: longcó nghĩa là 4 byte theo tuổi thọ của nền tảng ; lelongbelongcó nghĩa là 4 byte theo thứ tự ít endian và big endian tương ứng.

Thay vì sao chép các quy tắc, bạn có thể muốn gọi filetiện ích; nó được chỉ định bởi POSIX , nhưng các định dạng mà nó nhận ra và các mô tả mà nó đưa ra thì không. Ngoài ra, bạn có thể liên kết libmagicvà gọi magic_filehoặc magic_bufferchức năng.


10

Bạn có thể:

  1. Chạy filetừ trong chương trình của bạn

  2. Sử dụng thư viện cung cấp filechức năng của ngôn ngữ lập trình của bạn. ví dụ: libmagiccho C, File::Libmagichoặc File::MMagiccho perl, python-magiccho trăn, v.v.

BTW, các định nghĩa filesử dụng để xác định các tập tin được tìm thấy trong /etc/magic. Xem man 5 magicđể biết chi tiết định dạng tập tin.


1
Trên Linux /etc/magiccó xu hướng dành cho kiến ​​thức ma thuật địa phương của riêng bạn. Distros có xu hướng bật ma thuật chung của họ trong /usr/share/misc/magic.
steve

1
Cuối
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.