Pergunta

Data é muitas vezes armazenados em arquivos binários específicos dos programas para os quais há pouca ou nenhuma documentação. Um exemplo típico em nosso campo são dados que vem de um instrumento, mas eu suspeito que o problema é geral. Que métodos existem para tentar compreender e interpretar os dados?

Para definir alguns limites. Os arquivos não são criptografados e não há DRM. O tipo e formato do arquivo é específico para o autor do programa (ou seja, não é um "arquivo padrão" - como * .tar - cuja identidade foi perdida). Há (provavelmente) não ofuscação deliberada, mas pode haver alguns esforços amadores para economizar espaço. Podemos supor que temos um conhecimento geral do que os dados são e podemos reconhecer alguns, mas provavelmente não todos, dos campos e matrizes.

Assume-se que a maior parte dos dados é numérico, com escalares, e matrizes (provavelmente 1- e 2- dimensional e, por vezes, irregular ou triangular). Haverá também algumas cadeias de caracteres, provavelmente nomes de pessoas, locais, datas e talvez algumas palavras-chave. Haverá código no programa que lê o arquivo binário, mas não temos acesso à fonte ou o assembler. Como um exemplo, pode ter sido escrito por um programa VAX Fortran ou algum início de Unix ou Windows como objetos OLE. Os números podem ser grande- ou little-endian (o que não é conhecido no início), mas é provavelmente consistente. Nós podem ter diferentes versões de máquinas diferentes (por exemplo Cray).

Podemos supor que temos um razoavelmente grande corpus de arquivos -. Algumas centenas, digamos

Podemos assumir dois cenários:

  1. Podemos voltar a executar o programa com entradas diferentes para que possamos fazer experimentos.
  2. Não podemos voltar a executar o programa - temos um conjunto fixo de documentos. Isto tem uma semelhança suave para decodificação de documentos históricos em uma língua desconhecida (por exemplo Linear B).

Uma solução parcial pode ser aceitável -. Ou seja, pode haver alguns campos que nenhuma pessoa viva agora entende, mas a maioria dos outros são interpretáveis ??

Eu só estou interessado em Open Source se aproxima.

Atualizar Não é uma questão SO relacionada ( Como reverter formatos de arquivo engenheiro binário para fins de compatibilidade ), mas a ênfase é um pouco diferente. Atualizar sugestão inteligente de @brianegge ao endereço (1). Use truss (ou possivelmente strace no Linux) para despejar todo write () e chamadas semelhantes do programa. Isso deve permitir que pelo menos a coleção de discos gravados no disco.

Foi útil?

Solução

Esta é uma pergunta interessante, acho que a resposta é que a engenharia reversa formatos binários é uma habilidade aquired, mas existem ferramentas para fora lá que podem ajudar.

Uma ferramenta é WinOLS , que é projetado para interpretar e edição de imagens binárias motor do veículo de computador gestão (principalmente os dados numéricos nas suas tabelas de pesquisa). Tem suporte para vários formatos endian (embora não PDP, eu acho) e visualização de dados em várias larguras e offsets, definindo áreas de matriz (mapas) e visualizá-los em 2D ou 3D com todos os tipos de escalonamento e opções de offset. Ele também tem a / estatística localizador automática do mapa heurística, que pode funcionar para você.

É uma ferramenta comercial, mas a demo gratuita vai deixar você fazer tudo, mas salvar as alterações no gerenciamento de binário e uso do motor características que você não precisa. Você disse que você está interessado apenas em soluções de código aberto, mas esta é Stackoverflow e outra pessoa pode não ser tão exigente.

Outras dicas

todos os arquivos têm um cabeçalho. Iniciar a partir daí, ver Que semelhanças você tem entre 2 arquivos, eliminar "assinaturas" comuns e trabalhar com as diferenças. Eles devem marcar o número de registros, data de exportação e coisas semelhantes.

peças comuns entre os dois cabeçalhos pode apenas ser considerado assinaturas gerais e eu acho que você pode ignorá-los

Se você estiver em um sistema que oferece treliça , simplesmente assistir suas chamadas sistema para escrever e você provavelmente vai ter uma boa idéia. Também é possível que o programa vai mmap um arquivo e copiar diretamente da memória, mas isso é menos comum.

$ truss -t write echo foo
foowrite(1, " f o o", 3)                                = 3
write(1, "\n", 1)                               = 1

Ele também pode fazer sentido para dar uma olhada no binário. Em sistemas Unix, você pode usar objdump para ver o layout do binário. Isto irá apontar para as seções do código e dados. Você pode então abrir o binário é um editor hexadecimal e ir para os deslocamentos específicos. Você pode estar interessado na minha dicas para Solaris arquivos binários .

  • Diff 2 ou mais arquivos para procurar semelhanças. Isso muitas vezes ajuda a identificar blocos de cabeçalho e diferentes seções do arquivo.

  • Endianness é geralmente muito fácil de trabalhar fora - bytes mais significativos tendem a ser zero com muito mais freqüência do que os menos significativos, por isso, se você vê um padrão como "00 78" ou "78 00" você pode fazer um bom palpite em que byte é o MSB. No entanto, esta é apenas de alguma ajuda quando você tem trabalhado para fora (aproximadamente) que são os dados anteriores, para que você saiba como os dados são alinhados.

  • Procure dados facilmente identificados - cordas são o primeiro lugar para começar, porque você pode identificá-los facilmente. Estes, muitas vezes lhe dar pistas, como eles são geralmente incorporado perto de dados relacionados, usados ??como itens stanadard em cabeçalhos, etc. Se as cordas são unicode, em seguida, normalmente você vai ver as letras do texto separado por zero bytes, o que o ajudará a identificar endianness e alinhamento de dados naquele ponto em que os dados.

  • Uma abordagem formato comum (como IFF) é para guardar blocos de dados, cada um com um pequeno cabeçalho (por exemplo, um ID de 2 ou 4 bytes, em seguida, um tamanho de 2 ou 4 bytes para o bloco, em seguida, os dados de o bloco). Em geral as pessoas usam significativa (para eles) IDs do pedaço, para que possam ser fácil identificá-las - Se você encontrar o que se parece com uma tag, verifique os seguintes dados para ver se ele se parece com um comprimento (olhar que muitos bytes no nos dados para ver se ele parece que há outro cabeçalho). Se você pode identificar esse formato, você quebrar o problema "um arquivo grande" para baixo em um problema "muitos arquivos pequenos" whichmakes muito mais fácil. (No entanto, uma grande quantidade de dados do dispositivo tende a ser "otimizado" para torná-lo compacto, em que os programadores caso, muitas vezes jogar formatos extensíveis longe convenientes e empinar tudo juntos, pedaços de embalagem e geralmente fazendo coisas muito mais difícil para você)

  • Procure valores conhecidos. Se o dispositivo está exibindo "temperatura: 40", então é possível que você vai achar que o valor diretamente armazenadas no arquivo. (Também é comum a utilização de factores de escala ou valores de ponto fixo, de modo 40 pode ser representada como (por exemplo) 40 * 10 = 400 ou 40 * 256 = 10240 embora)

  • Se você pode controlar o suficiente dispositivo: criar alguns arquivos simples. O que você está tentando alcançar é a menor arquivos que você pode sair do dispositivo para minimizar os dados que você tem que examinar. Em seguida, fazer uma mudança no dispositivo que faz com que o arquivo para a mudança - para tentar minimizar o número de alterações - e pegue o arquivo novamente. Se o formato do arquivo é "aberta" (não compactados ou criptografados), então você deve ser capaz de identificar os bytes que foram alterados.

  • Se você pode arquivos "carga" de volta para o dispositivo também pode ser capaz de criar seus próprios arquivos, mudando apenas um valor para ver se você pode notar qualquer mudança de comportamento no dispositivo. Se você conseguir acertar valores simples isso pode funcionar bem, mas muitas vezes você pode achar que você acabou de quebrar o formato de arquivo e o dispositivo não será capaz de ler utras dados em tudo.

Eu estava esperando que houvesse um utilitário de mágica que poderia trabalhar para fora padrões, tente diferente endianness etc. Mas isso não parece ser!

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top