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?
Respostas:
De acordo com esta resposta da tiranídeo :
Atualizar
De acordo com esta resposta de Emilio Bool :
fonte
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 (cat
neste 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).
objdump
nem 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.
fonte
cat
, o executável (cat
neste caso) lê todos os 1 e 0 e os apresenta a você, convertendo-os em caracteres do seu alfabeto relevante ou língua."cat
não faz isso; tudo o quecat
faz é 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.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.
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).
hexdump
lista 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.fonte
Eu começaria com
od
(octal dump) e, dependendo do sistema, pode encontrar ferramentas comoobjdump
úteis.fonte
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?
fonte
bvi
é um editor visual binário com combinações de teclas vim. Está disponível na maioria dos sistemas Linux.fonte
O comando Linux strings imprime as strings de caracteres imprimíveis em arquivos, por exemplo:
etc ... é bem mais legível que o binário.
fonte
strings
comando retira a maioria dos bytes que ele deseja ver.strings
comando - especialmente com um tamanho maiorstrings -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.strings
utilidade do comando, apenas o fato de não responder à pergunta do OP aqui.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:
35 e 32 em decimal
Também 35 e 32 em decimal
fonte
vim
instalado para usarxxd
.Você pode visualizar o arquivo em binário em
vim
:vim
:% !xxd -b
O
xxd
comando pode ser alterado ainda mais, por exemplo:-g4
, o que agrupará os bits em pacotes de 32 bits-c4
, o que formatará a saída, para ter 4 bytes por linhaA adição dos dois sinalizadores acima fornecerá um número inteiro de 32 bits por linha.
fonte
Você pode fazer isso com, por exemplo, este ruby one-liner:
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.
fonte
%08b
faz com que agrupe a saída em bytes.GHex é seu amigo :)
Você pode instalá-lo usando a linha de comando
Ubuntu:
Fedora:
fonte