Bagaimana file mengidentifikasi file khusus ini?

8

Saya menjalankan filefile wallet.dat (File tempat Bitcoin menyimpan kunci privatnya) dan meskipun sepertinya tidak ada header atau string yang filedapat diidentifikasi, masih dapat mengatakan bahwa itu adalah file Berkley DB, bahkan jika saya kurangi menjadi 16 byte.

Saya tahu file itu menerapkan semacam aturan atau mencari beberapa urutan untuk mengidentifikasinya. Saya ingin tahu aturan apa yang diterapkan di sini, sehingga saya bisa menduplikasinya di program saya sendiri.

Nick ODell
sumber
1
file tidak sempurna, itu hanya membuat tebakan berdasarkan pada isi file, "selasa pencetakan bug 'adalah salah satu contoh di mana itu menebak salah
Jasen
1
@ Yasen filetidak salah dalam situasi ini.
Nick ODell

Jawaban:

16

Ambil sumber perintah file. Sebagian besar, jika tidak, semua sumber open unices menggunakan ini . The fileperintah datang dengan magicdatabase bernama setelah nomor ajaib yang menggambarkan. (Basis data ini juga diinstal pada sistem langsung Anda, tetapi dalam bentuk yang dikompilasi.) Cari file yang berisi teks deskripsi yang Anda lihat:

grep 'Berkeley DB' magic/Magdir/*

The magichalaman manual menggambarkan format file. Garis pemicu untuk "Berkeley DB" adalah

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

Kolom pertama menentukan offset di mana urutan byte tertentu dapat ditemukan. Kolom ketiga berisi urutan byte. Kolom kedua menjelaskan jenis urutan byte: longberarti 4 byte di endianness platform ; lelongdan belongberarti 4 byte masing-masing dalam urutan little-endian dan big-endian.

Daripada meniru aturan, Anda mungkin ingin memanggil fileutilitas; itu ditentukan oleh POSIX , tetapi format yang dikenali dan deskripsi yang dihasilkannya tidak. Atau, Anda dapat menautkan libmagicdan memanggil fungsi magic_fileatau magic_buffer.

Gilles 'SANGAT berhenti menjadi jahat'
sumber
10

Anda bisa:

  1. Jalankan filedari dalam program Anda

  2. Gunakan perpustakaan yang menyediakan filefungsionalitas untuk bahasa pemrograman Anda. misalnya libmagicuntuk C, File::Libmagicatau File::MMagicuntuk perl, python-magicuntuk python, dll.

BTW, definisi yang filedigunakan untuk mengidentifikasi file ditemukan di /etc/magic. Lihat man 5 magicdetail format file.

cas
sumber
1
Di Linux /etc/magiccenderung untuk pengetahuan sihir lokal Anda sendiri. Distro cenderung menampilkan sihir generik mereka /usr/share/misc/magic.
steve
1
Saya akhirnya hanya membaca sumber: github.com/file/file/blob/…
Nick ODell