Como o arquivo identificou esse arquivo em particular?


8

Estou executando fileum arquivo wallet.dat (um arquivo em que o Bitcoin mantém suas chaves privadas) e mesmo que não pareça haver cabeçalho ou string identificável, fileainda posso dizer que é um arquivo Berkley DB, mesmo que eu reduza para 16 bytes.

Eu sei que o arquivo estava aplicando algum tipo de regra ou procurando alguma sequência para identificá-lo. Quero saber qual é a regra aplicada aqui, para que eu possa duplicá-la no meu próprio programa.


1
arquivo não é infalível, apenas faz suposições com base no conteúdo do arquivo, o "erro de impressão de terça-feira" é um exemplo de onde ele estava supondo que estava errado
Jasen

1
@ Jason filenão está errado nesta circunstância.
quer

Respostas:


16

Pegue a fonte do comando file. A maioria, senão todos os departamentos de código aberto, usam esse . O filecomando vem com o magicbanco de dados, nomeado após os números mágicos que ele descreve. (Esse banco de dados também é instalado no seu sistema ativo, mas em um formato compilado.) Procure o arquivo que contém o texto de descrição que você vê:

grep 'Berkeley DB' magic/Magdir/*

A magicpágina do manual descreve o formato do arquivo. As linhas de gatilho para "Berkeley DB" são

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

A primeira coluna especifica o deslocamento no qual uma determinada sequência de bytes deve ser encontrada. A terceira coluna contém a sequência de bytes. A segunda coluna descreve o tipo de sequência de bytes: longsignifica 4 bytes no endianness da plataforma ; lelonge belongsignifica 4 bytes em ordem little-endian e big-endian, respectivamente.

Em vez de replicar as regras, convém chamar o fileutilitário; é especificado pelo POSIX , mas os formatos que ele reconhece e as descrições que ele gera não são. Como alternativa, você pode vincular libmagice chamar a função magic_fileou magic_buffer.


10

Você poderia:

  1. Execute filede dentro do seu programa

  2. Use uma biblioteca que ofereça filefuncionalidade para sua linguagem de programação. por exemplo, libmagicpara C, File::Libmagicou File::MMagicpara perl, python-magicpara python, etc.

BTW, as definições fileusadas para identificar arquivos são encontradas em /etc/magic. Veja man 5 magicpara detalhes de formato de arquivo.


1
No Linux /etc/magictende a ser para o seu próprio conhecimento mágico local. As distros tendem a exibir sua mágica genérica /usr/share/misc/magic.
steve

1
Acabei lendo a fonte: github.com/file/file/blob/…
Nick ODell
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.