Como o arquivo identificou esse arquivo em particular?

8

Estou executando file em um arquivo wallet.dat (Um arquivo no qual o Bitcoin mantém suas chaves privadas) e mesmo que não pareça haver nenhum cabeçalho ou string identificável, file ainda pode dizer que é um arquivo DB Berkley, mesmo se eu cortar para 16 bytes.

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

    
por Nick ODell 21.11.2015 / 00:21

2 respostas

16

Agarre a fonte do comando do arquivo. A maioria, se não todas, as fontes abertas usam este . O comando file vem com o banco de dados magic , nomeado após os números mágicos descritos por ele. (Este banco de dados também está instalado em seu sistema ativo, mas em um formato compilado.) Procure o arquivo que contém o texto descritivo que você vê:

grep 'Berkeley DB' magic/Magdir/*

A magic man page descreve o formato do arquivo. As linhas de disparo 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 certa seqüência de bytes deve ser encontrada. A terceira coluna contém a seqüência de bytes. A segunda coluna descreve o tipo de seqüência de bytes: long significa 4 bytes na endianness da plataforma; lelong e belong significam 4 bytes na ordem little-endian e big-endian, respectivamente.

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

    
por 21.11.2015 / 01:32
10

Você poderia:

  1. Execute file no seu programa

  2. Use uma biblioteca que forneça a funcionalidade de file à sua linguagem de programação. por exemplo. libmagic para C, File::Libmagic ou File::MMagic para perl , python-magic para python, etc.

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

    
por 21.11.2015 / 00:27