¿Cómo ver un archivo binario?


45

Por lo que entiendo, un compilador crea un archivo binario que consta de 1 y 0 que una CPU puede leer. Tengo un archivo binario, pero ¿cómo lo abro para ver los 1 y 0 que hay? Un editor de texto dice que no puede abrirlo ...

PD: ¿Tengo un ensamblado binario compilado que debería ser un código binario simple de 1 y 0?


1
cuando
muestres


no - OP especificó "ensamblado binario compilado". Eso no responde a la pregunta. Por ejemplo, no es un archivo de música, y tiene estructura. Sin que OP proporcione información adicional, una herramienta no estructurada es el lugar para comenzar.
Thomas Dickey

1
Mira mi respuesta. Y tenga en cuenta que el término binario se usa de dos maneras totalmente diferentes en la práctica: "Un archivo binario" significa un archivo cuyo contexto no es texto ASCII puro. "Un número binario" significa un número escrito usando su forma binaria.
Pierre-Olivier Vares

@mazs ASCII? Creo que UTF-8 es más probable, o alguna página de códigos si el programa cree que parece estar codificado de esa manera a través de la logística.
JDługosz

Respuestas:


99

De acuerdo con esta respuesta de tyranid :

hexdump -C yourfile.bin 

a menos que quieras editarlo, por supuesto. La mayoría de las distribuciones de Linux tienen hexdumppor defecto (pero obviamente no todas).


Actualizar

Según esta respuesta de Emilio Bool :

xxd funciona tanto binario como hexadecimal

Para bin:

xxd -b file

Para hex:

xxd file

Esto realmente ayudó! Gracias
Shravya Boggarapu

para ver solo head: nombre de archivo xxd | head
Adam

45

Varias personas han respondido algunos aspectos de la consulta, pero no todos.

Todos los archivos en las computadoras se almacenan como 1 y 0. Imágenes, archivos de texto, música, aplicaciones ejecutables, archivos de objetos, etc.

Todos son 0 y 1. La única diferencia es que se interpretan de manera diferente dependiendo de lo que los abra.

Cuando ve un archivo de texto usando cat, el ejecutable ( caten este caso) lee todos los 1 y 0 y se los presenta convirtiéndolos en caracteres de su alfabeto o idioma relevante.

Cuando ve un archivo usando un visor de imágenes, toma todos los 1 y 0 y los convierte en una imagen, dependiendo del formato del archivo y algo de lógica para resolverlo.

Los archivos binarios compilados no son diferentes, se almacenan como 1 y 0.

La respuesta de arzyfex le brinda las herramientas para ver esos archivos de diferentes maneras, pero leer un archivo como binario funciona para cualquier archivo en una computadora, al igual que verlo como octal, o hexadecimal, o de hecho ASCII, puede que no tenga sentido en cada uno de esos formatos.

Si desea comprender lo que hace un archivo binario ejecutable, debe verlo de una manera que le muestre el lenguaje del ensamblador (como inicio), que puede hacer usando,

objdump -d /path/to/binary

que es un desensamblador, toma el contenido binario y lo convierte de nuevo en ensamblador (que es un lenguaje de programación de muy bajo nivel). objdumpno siempre se instala de manera predeterminada, por lo que es posible que deba instalarse dependiendo de su entorno Linux.

Alguna lectura externa.

NB: como señala @Wildcard, es importante tener en cuenta que los archivos no contienen los caracteres 1 y 0 (como los ve en la pantalla), contienen datos numéricos reales, bits individuales de información que están en (1) o apagado (0). Incluso esa descripción es solo una aproximación de la verdad. El punto clave es que si encuentra un visor que le muestre los 1 y los 0, incluso eso sigue interpretando los datos del archivo y luego le muestra los caracteres ASCII para 0 y 1. Los datos se almacenan en formato binario ( ver el enlace del número binario arriba). La entrada wiki comunitaria de Pierre-Olivier cubre esto con más detalle.


Buena exposición. Es posible que desee agregar que los caracteres que ve en una línea de texto como "1" o "0" no están almacenados como un solo "1" o "0" por la computadora; el OP parece tener una confusión al respecto.
Comodín

1
Quibble (es decir, no estoy de acuerdo) con su afirmación: "Cuando ve un archivo de texto usando cat, el ejecutable ( caten este caso) lee todos los 1 y 0 y se los presenta convirtiéndolos en caracteres de su alfabeto o idioma." catno hace eso; lo único que cathace es escribir bytes en la salida estándar (a menos que esté usando las opciones "dañinas" ). El programa del terminal (y / o el hardware del terminal, si corresponde, es decir, su firmware) determina cómo representar los bytes como caracteres, posiblemente con la ayuda del controlador TTY.
G-Man dice 'Restablecer a Mónica'

No estoy en desacuerdo, pero en algún momento, todas las descripciones simples se descomponen, la pregunta es qué tan lejos vas por el agujero del conejo antes de que dejes de describir las cosas simplemente.
EightBitTony

14

A bajo nivel, un archivo se codifica como una secuencia de 0 y 1.

Pero incluso los programadores rara vez van allí en la práctica.

Primero (y más importante que esta historia de 0 y 1), debes entender que todo lo que la computadora manipula está codificado con números .

  • Un carácter se codifica con un número, usando tablas de juego de caracteres. Por ejemplo, la letra 'A' tiene un valor de 65 cuando se codifica utilizando ASCII. Ver http://www.asciitable.com

  • Un píxel se codifica con uno o más números (hay muchos formatos gráficos). Por ejemplo, en el formato estándar de 3 colores, un píxel amarillo se codifica como: 255 para rojo, 255 para verde, 0 para azul. Consulte http://www.quackit.com/css/css_color_codes.cfm (elija un color y vea las celdas R, G y B)

  • Un archivo ejecutable binario se escribe en ensamblador; cada instrucción de ensamblaje se codifica como números. Por ejemplo, la instrucción de ensamblaje MOVB $0x61,%alestá codificada por dos números: 176,97 Consulte http://www.sparksandflames.com/files/x86InstructionChart.html (Cada instrucción tiene un número asociado de 00 a FF, porque se usa la notación hexadecimal, vea abajo)

En segundo lugar : cada número puede tener múltiples representaciones o anotaciones .

Digamos que tengo 23 manzanas.

  • Si hago grupos de diez manzanas, obtendré: 2 grupos de diez y 3 manzanas solitarias. Eso es exactamente lo que queremos decir cuando escribimos 23: un 2 (decenas), luego un 3 (unidades).
  • Pero también puedo hacer grupos de 16 manzanas. Así que obtendré un grupo de 16 y 7 manzanas solitarias. En notación hexadecimal (así se llama la raíz 16), escribiré: 17 (16 + 7). Para distinguir de la notación decimal, la notación hexadecimal generalmente se observa con un prefijo o sufijo: 17h, # 17 o $ 17. Pero, ¿cómo representar más de 9 grupos de 16 o más de 9 manzanas solas? Simplemente, usamos letras de A (10) a F (15). El número 31 (como en 31 manzanas) se escribe como # 1F en hexadecimal.

  • En la misma línea, podemos hacer un grupo de dos manzanas. (Y grupo de dos manzanas de grupo de dos, es decir, grupo de manzanas de 2x2, y así sucesivamente). Entonces 23 es: 1 grupo de 2x2x2x2 manzanas, 0 grupo de 2x2x2 manzanas, 1 grupo de 2x2 manzanas, 1 grupo de 2 manzanas y 1 manzana solitaria.

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

Físicamente, los mecanismos que permiten dos estados (conmutadores) son fáciles de hacer, también en el disco que en el almacenamiento de memoria.

Es por eso que los datos y programas, vistos como números, se escriben y manipulan en su forma binaria.

Luego se traducen, según el tipo de datos, a su forma apropiada (letra A, píxel amarillo) o se ejecutan (instrucción MOV).

hexdumpenumera los números que codifican los datos (o el programa de ensamblaje) en su forma hexadecimal. Luego puede usar una calculadora para obtener la forma binaria correspondiente.



4

Puede abrirlo en un editor hexadecimal que lo muestra como una serie de valores hexadecimales. xxd file

¿Qué está tratando de lograr?


Pero pensé que la computadora solo puede leer 1 y 0. ¿Puedo ver eso? Estoy tratando de entender cómo funcionan las computadoras
Martin Zeltin

2
Eso solo no te ayudará mucho. Si desea aprender cómo funciona exactamente, entonces, en una caja de Linux, eche un vistazo al formato de archivo ELF y en.wikipedia.org/wiki/X86_instruction_listings . Si solo desea ver el código que genera el compilador, eche un vistazo para ejecutarlo con gdb. Como desea obtener más "nivel bajo", visite también nand2tetris.org. Para el lenguaje ensamblador, escuché que el ensamblaje 6502 y mips es mucho mejor que el ensamblado x86_64 / x86
theblazehen

@theblazehen El ensamblador familiar moderno x86 es una bestia. 8086 era manejable, y creo que casi cualquier CPU de esa época (finales de los 70 hasta la primera mitad de los 80) debería ser tolerable en lo que respecta al ensamblador.
un CVn

4

bvies un editor visual binario con combinaciones de teclas vim. Está disponible en la mayoría de los sistemas Linux.

ingrese la descripción de la imagen aquí


3

El comando de cadenas de Linux imprime las cadenas de caracteres imprimibles en archivos, por ejemplo:

$ 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 ... es bastante más legible que binario.


El OP preguntó ¿cómo lo abro para ver los 1 y 0 que hay? pero el stringscomando eliminará la mayoría de los bytes que quiere ver.
jlliagre

@jlliagre: si bien tiene razón, el stringscomando, especialmente con una longitud más larga como strings -n 6, realmente ayuda a descubrir qué tiene un archivo binario si contiene constantes de cadena, etc. Esta respuesta debería haber sido un comentario, entonces sería han estado bien
Joe

@ Joe Sí, no cuestiono la stringsutilidad del comando, solo el hecho de que no responde la pregunta OP aquí.
jlliagre

3

Una parte importante sobre la que aún parece confundido: los valores hexadecimales son solo una representación diferente de los valores binarios. La mayoría de los editores hexadecimales o hexdumps mostrarán valores en la base hexadecimal, porque es más legible que en la base binaria.

P.ej:

Binario:

xxd -b README.md                                                                
00000000: 00100011 00100000

Que es 35 y 32 en decimal

xxd README.md                                                                   
00000000: 2320

También 35 y 32 en decimal


Otras personas han mencionado esto. Sin embargo, este es un buen resumen. Puede editar su respuesta si desea cambiar el primer párrafo.
wizzwizz4

Muy bien, no he visto a nadie mencionarlo, podría haberlo extrañado.
Jueves el próximo

Tenga en cuenta que necesita viminstalar para usar xxd.
starbeamrainbowlabs

2

Puede ver el archivo en binario en vim:

  • Abrir el archivo en vim
  • Entrando :% !xxd -b

El xxdcomando se puede modificar aún más, por ejemplo:

  • Al agregar -g4, que agrupará los bits en paquetes de 32 bits
  • Al agregar -c4, que formateará la salida, para tener 4 bytes por línea

Si agrega los dos indicadores anteriores, obtendrá un número entero de 32 bits por línea.


1

Puedes hacerlo con, por ejemplo, este rubí de una sola línea:

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

El sistema tradicional basado en C tiene un pésimo soporte para generar cosas en binario, AFAIK. Por lo general, no es muy útil, ya que es bastante difícil de leer a diferencia de los volcados hexadecimales.


¡Gracias! Agregar un espacio directamente después %08bhace que agrupe la salida en bytes.
starbeamrainbowlabs

0

GHex es tu amigo :)
Puedes instalarlo usando la línea de comandos

Ubuntu:

sudo apt-get install ghex

Fedora

sudo yum instalar ghex

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.