Como visualizar um arquivo binário?


45

Pelo que entendi, um compilador cria um arquivo binário que consiste em 1 e 0 que uma CPU pode ler. Eu tenho um arquivo binário, mas como faço para abri-lo para ver os 1 e 0 existentes? Um editor de texto diz que não pode abri-lo ...

PS Eu tenho um binário compilado assembly que deve ser um código binário simples de 1 e 0?


1
quando você exibir um arquivo binário, você vai vê-lo como caracteres ASCII
mazs


no - OP especificado "assembly compilado binário". Isso não aborda a questão. Por exemplo, não é um arquivo de música e possui estrutura. Sem o OP fornecer informações adicionais, uma ferramenta não estruturada é o ponto de partida.
Thomas Dickey

1
Veja minha resposta. E esteja avisado de que o termo binário é usado de duas maneiras totalmente diferentes na prática: "Um arquivo binário" significa um arquivo cujo contexto não é puro texto ASCII. "Um número binário" significa um número escrito usando sua forma binária.
Pierre-Olivier Vares

@mazs ASCII? Eu acho que UTF-8 é mais provável, ou alguma página de código, se o programa achar que parece ser codificado dessa maneira através de huristic.
JDługosz

Respostas:


99

De acordo com esta resposta da tiranídeo :

hexdump -C yourfile.bin 

a menos que você queira editá-lo, é claro. A maioria das distribuições Linux tem hexdumppor padrão (mas obviamente não todas).


Atualizar

De acordo com esta resposta de Emilio Bool :

xxd faz binário e hexadecimal

Para compartimento:

xxd -b file

Para hexadecimal:

xxd file

Isso realmente ajudou! Obrigado
Shravya Boggarapu

ver apenas head: xxd filename | head
Adam

45

Várias pessoas responderam a alguns aspectos da consulta, mas não a todas.

Todos os arquivos nos computadores são armazenados como 1 e 0. Imagens, arquivos de texto, música, aplicativos executáveis, arquivos de objetos etc.

Eles são todos os 0 e 1. A única diferença é que eles são interpretados de maneira diferente, dependendo do que os abre.

Quando você exibe um arquivo de texto usando cat, o executável ( catneste caso) lê todos os 1 e 0 e os apresenta a você, convertendo-os em caracteres do alfabeto ou idioma relevante.

Quando você visualiza um arquivo usando um visualizador de imagens, ele pega todos os 1 e 0 e os transforma em uma imagem, dependendo do formato do arquivo e de alguma lógica para resolver tudo isso.

Os arquivos binários compilados não são diferentes, eles são armazenados como 1 e 0.

A resposta do arzyfex fornece as ferramentas para visualizar esses arquivos de maneiras diferentes, mas a leitura de um arquivo como binário funciona para qualquer arquivo em um computador, assim como visualizá-lo como octal, hexadecimal ou mesmo ASCII, talvez não faça sentido em cada desses formatos.

Se você deseja entender o que um arquivo binário executável faz, é necessário visualizá-lo de uma maneira que mostre a linguagem do assembler (como início), que você pode fazer usando,

objdump -d /path/to/binary

que é um desmontador, pega o conteúdo binário e o converte novamente em assembler (que é uma linguagem de programação de nível muito baixo). objdumpnem sempre é instalado por padrão, portanto, pode ser necessário instalar, dependendo do seu ambiente Linux.

Alguma leitura externa.

Nota: como o @Wildcard indica, é importante observar que os arquivos não contêm os caracteres 1 e 0 (como você os vê na tela), eles contêm dados numéricos reais, bits individuais de informação que estão em (1) ou desligado (0). Mesmo essa descrição é apenas uma aproximação da verdade. O ponto principal é que, se você encontrar um visualizador que mostre o 1 e o 0, mesmo que ainda esteja interpretando os dados do arquivo e mostrando os caracteres ASCII para 0 e 1. Os dados são armazenados em um formato binário ( veja o link do número binário acima). A entrada no wiki da comunidade de Pierre-Olivier cobre isso com mais detalhes.


Boa exposição. Você pode adicionar que os caracteres que você vê em uma linha de texto como "1" ou "0" não são armazenados como um único "1" ou "0" pelo computador; o OP parece ter uma confusão sobre isso.
Wildcard

1
Eu discordaria (ou seja, discordo) da sua afirmação: "Quando você exibe um arquivo de texto usando cat, o executável ( catneste caso) lê todos os 1 e 0 e os apresenta a você, convertendo-os em caracteres do seu alfabeto relevante ou língua." catnão faz isso; tudo o que catfaz é gravar bytes na saída padrão (a menos que você esteja usando as opções "prejudiciais" ). O programa do terminal (e / ou o hardware do terminal, se aplicável, ou seja, seu firmware) determina como renderizar bytes como caracteres, possivelmente com a ajuda do driver TTY.
G-Man diz 'Reinstate Monica'

Não discordo, mas, em algum momento, todas as descrições simples se quebram, a questão é até que ponto você vai descer a toca do coelho antes de parar de descrever as coisas simplesmente.
EightBitTony

14

Em nível baixo, um arquivo é codificado como uma sequência de 0 e 1.

Mas mesmo programadores raramente vão lá na prática.

Primeiro (e mais importante que essa história de zeros e zeros), você precisa entender que tudo o que o computador manipula é codificado com números .

  • Um caractere é codificado com um número, usando tabelas de conjuntos de caracteres. Por exemplo, a letra 'A' tem um valor de 65 quando codificada usando ASCII. Consulte http://www.asciitable.com

  • Um pixel é codificado com um ou mais números (existem muitos formatos gráficos). Por exemplo, no formato padrão de três cores, um pixel amarelo é codificado como: 255 para vermelho, 255 para verde, 0 para azul. Consulte http://www.quackit.com/css/css_color_codes.cfm (escolha uma cor e veja as células R, G & B)

  • Um arquivo executável binário é gravado em Assembly; cada instrução de montagem é codificada como números. Por exemplo, a instrução de montagem MOVB $0x61,%alé codificada por dois números: 176,97 Consulte http://www.sparksandflames.com/files/x86InstructionChart.html (Cada instrução tem um número associado de 00 a FF, porque a notação hexadecimal é usada, ver abaixo)

Segundo : cada número pode ter múltiplas representações ou notações .

Digamos que tenho 23 maçãs.

  • Se eu fizer grupos de dez maçãs, receberei: 2 grupos de dez e 3 maçãs solitárias. É exatamente isso que queremos dizer quando escrevemos 23: a 2 (dezenas) e depois 3 (unidades).
  • Mas também posso fazer grupos de 16 maçãs. Então eu vou pegar um grupo de 16 e 7 maçãs solitárias. Na notação hexadecimal (é assim que se chama raiz de 16), escreverei: 17 (16 + 7). Para distinguir da notação decimal, a notação hexadecimal geralmente é anotada com um prefixo ou sufixo: 17h, # 17 ou $ 17. Mas como representar mais de 9 grupos de 16 ou mais de 9 maçãs isoladas? Simplesmente, usamos letras de A (10) a F (15). O número 31 (como em 31 maçãs) é escrito como # 1F em hexadecimal.

  • Na mesma linha, podemos fazer um grupo de duas maçãs. (E grupo de duas maçãs de grupo de duas, ou seja, grupo de maçãs de 2x2, e assim por diante). Então 23 é: 1 grupo de 2 x 2 x 2 x 2 maçãs, 0 grupo de 2 x 2 x 2 maçãs, 1 grupo de 2 x 2 maçãs, 1 grupo de 2 maçãs e 1 maçã solitária.

(Veja https://en.wikipedia.org/wiki/Radix )

Fisicamente, os mecanismos que permitem dois estados (comutadores) são fáceis de executar, assim como no disco que no armazenamento de memória.

É por isso que dados e programas, vistos como números, são escritos e manipulados em sua forma binária.

Em seguida, traduzido - dependendo do tipo de dados - em sua forma apropriada (letra A, pixel amarelo) ou executado (instrução MOV).

hexdumplista os números que codificam os dados (ou o programa de montagem) em sua forma hexadecimal. Você pode usar uma calculadora para obter a forma binária correspondente.



4

Você pode abri-lo em um editor hexadecimal que o mostra como uma série de valores hexadecimais. xxd file

O que você está tentando realizar?


Mas eu pensei que o computador só pode ler 1 e 0. Posso ver aqueles? Eu estou tentando entender como funcionam os computadores
Martin Zeltin

2
Só isso não vai te ajudar muito. Se você quiser saber exatamente como isso funciona, em uma caixa do Linux, verifique o formato do arquivo ELF e en.wikipedia.org/wiki/X86_instruction_listings . Se você quiser apenas ver o código que é gerado pelo compilador, veja como executá-lo com o gdb. Como você deseja obter mais "nível baixo", visite o nand2tetris.org também. Para linguagem assembly Ouvi dizer que 6502 e MIPS assembly é uma agradável monte de x86_64 / x86 montagem
theblazehen

@theblazehen O moderno montador da família x86 é um monstro. O 8086 era gerenciável e acho que praticamente qualquer CPU da época (final da década de 1970 até a primeira metade da década de 1980) deve ser tolerável no que diz respeito à montagem.
um CVn

4

bvié um editor visual binário com combinações de teclas vim. Está disponível na maioria dos sistemas Linux.

insira a descrição da imagem aqui


3

O comando Linux strings imprime as strings de caracteres imprimíveis em arquivos, por exemplo:

$ strings /usr/bin/gnome-open 
/lib64/ld-linux-x86-64.so.2
3;o:)
libgnome-2.so.0
_ITM_deregisterTMCloneTable
g_object_unref
gmon_start__
g_dgettext
_Jv_RegisterClasses
g_strdup
_ITM_registerTMCloneTable
g_error_free
gnome_program_init
libgnome_module_info_get
libgio-2.0.so.0
g_ascii_strncasecmp

etc ... é bem mais legível que o binário.


O OP perguntou como eu o abro para ver os 1 e 0 que existem? mas o stringscomando retira a maioria dos bytes que ele deseja ver.
Jlliagre

@ jlliagre - enquanto você estiver correto, o stringscomando - especialmente com um tamanho maior strings -n 6- realmente ajuda a descobrir o que um arquivo binário possui se contiver constantes de seqüência de caracteres, etc. Essa resposta deveria ter sido um comentário; estiveram bem.
Joe

@ Joe Sim, eu não questiono a stringsutilidade do comando, apenas o fato de não responder à pergunta do OP aqui.
Jlliagre

3

Uma parte importante sobre a qual você ainda parece confuso: os valores hexadecimais são apenas uma representação diferente dos valores binários. A maioria dos editores hexadecimais ou hexdumps exibirá valores na base hexadecimal, porque é mais legível do que na base binária.

Por exemplo:

Binário:

xxd -b README.md                                                                
00000000: 00100011 00100000

35 e 32 em decimal

xxd README.md                                                                   
00000000: 2320

Também 35 e 32 em decimal


Outras pessoas têm mencionado isso. No entanto, este é um bom resumo. Você pode editar sua resposta se quiser alterar o primeiro parágrafo.
Wizzwizz4

Muito bem, eu não vi ninguém mencionando, eu posso ter perdido.
Quinta

Observe que você precisa estar viminstalado para usar xxd.
Starbeamrainbowlabs

2

Você pode visualizar o arquivo em binário em vim:

  • Abrindo o arquivo em vim
  • Entrando :% !xxd -b

O xxdcomando pode ser alterado ainda mais, por exemplo:

  • Adicionando -g4, o que agrupará os bits em pacotes de 32 bits
  • Adicionando -c4, o que formatará a saída, para ter 4 bytes por linha

A adição dos dois sinalizadores acima fornecerá um número inteiro de 32 bits por linha.


1

Você pode fazer isso com, por exemplo, este ruby ​​one-liner:

$ ruby -e 'while c=STDIN.read(1); printf "%08b" % c.bytes.first; end'

O sistema tradicional baseado em C possui um péssimo suporte para a saída de coisas no AFAIK binário. Geralmente não é muito útil, pois é muito difícil de ler, diferentemente dos dumps hexadecimais.


Obrigado! Adicionar um espaço diretamente depois %08bfaz com que agrupe a saída em bytes.
Starbeamrainbowlabs

0

GHex é seu amigo :)
Você pode instalá-lo usando a linha de comando

Ubuntu:

sudo apt-get install ghex

Fedora:

sudo yum install ghex

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.