Misterio de los archivos binarios

Misterio de los archivos binarios

Se trata de archivos directamente del compilador, digamos g++, y el -oindicador (archivo de salida).

Si son binarios, ¿no deberían ser simplemente un montón de 0 y 1?

Cuando los atrapas, obtienes resultados ininteligibles pero también palabras intactas.

Si los archivas, obtienes la respuesta inmediatamente; parece que no hay ningún cálculo. ¿Los archivos binarios tienen encabezados con este tipo de información?

Pensé que un ejecutable binario era simplemente el programa recién compilado, solo en forma de instrucciones de máquina que su CPU puede entender de manera instantánea y sin ambigüedades. Si es así, ¿ese conjunto de instrucciones no es solo patrones de bits? Pero entonces, ¿qué son todas las demás cosas en los binarios? ¿Cómo se muestran los bits?

Además, si de alguna manera consigue el manual de su procesador, ¿podría escribir un binario manualmente, una instrucción de máquina a la vez? Sería terriblemente ineficaz, peromuyfascinante si logras que funcione incluso para un "¡Hola mundo!" manifestación.

Respuesta1

Esta pregunta de superusuario:¿Por qué no ves el código binario cuando abres un archivo binario con el editor de texto?Aborda bastante bien su primer punto.

Los datos binarios y de texto no están separados: son simplemente datos. Depende de la interpretación que haga de ellos uno u otro. Si abre datos binarios (como un archivo de imagen) en un editor de texto, muchos de ellos no tendrán sentido porque no se ajustan a la interpretación elegida (como texto).

Los archivos se almacenan como ceros y unos (por ejemplo, voltaje/sin voltaje en la memoria, magnetización/sin magnetización en el disco duro). No ve ceros y unos al catprocesar los archivos porque las secuencias 0/1 no serán de mucha utilidad para un humano; los caracteres tienen más sentido y un volcado hexadecimal es mejor para la mayoría de los propósitos (pruebe hexdumpcon un archivo).

Archivos ejecutablestiene un encabezadoque describe parámetros como la arquitectura para la cual se creó el programa y qué secciones del archivo son código y datos. Esto es lo que filese utiliza para identificar las características de su archivo binario.

Finalmente: sí, puedes escribir programas en lenguaje ensamblador usando códigos de operación de CPU directamente. Echa un vistazo aIntroducción a la programación ensambladora de UNIXy elDocumentación Intel x86como punto de partida.

Respuesta2

Todos los archivos se almacenan como 1 y 0, cat simplemente intenta interpretar cada BYTE (8 bits) como un carácter, es por eso que ves caracteres ininteligibles.

Respuesta3

Todos los archivos son binarios en el fondo: se almacenan como una secuencia debits.

Los bits de archivos en realidad están agrupados enbytes. Cada archivo consta de un número entero de bytes. Todos los sistemas Unix, y de hecho casi todos los ordenadores, tienen bytes compuestos por 8 bits (conocidos comooctetosen terminología de redes). Existe una forma natural de interpretar los bytes como números de 8 bits, es decir, números entre 0 y 2 8 -1 = 255.

Para verlos como binarios, necesita una herramienta que los escriba en notación binaria. Los humanos no están muy preparados para la notación binaria: se necesita demasiado tiempo para escribir algo. Es más común utilizarhexadecimalnotación, con 16 dígitos diferentes. Por ejemplo, 41(sesenta y cinco en hexadecimal) es más cómodo de leer que 01000001(sesenta y cinco en binario). Puedes usar un comando comood(“volcado octal”) o hexdumpo hdpara enumerar un archivo con notación octal o hexadecimal para cada byte ( od -t x1cambia a hexadecimal).

Los bytes pueden representar caracteres. Hay varioscodificaciones de caracteresutilizado en el mundo Unix. Todos ellos se basan enASCII, que define la interpretación de bytes entre 0 y 127. Tenga en cuenta que esto solo define un significado para la mitad de los posibles valores de bytes. Por ejemplo, 65 representa la letra mayúscula A, 97 representa la letra minúscula a, 30 representa el dígito 0, y así sucesivamente. Algunas codificaciones de caracteres representan cada carácter mediante un byte; por ejemplo, en ellatino-1codificación, 163 representa £, 241 representa ñy así sucesivamente. El número máximo de caracteres que se pueden representar de esta manera es 256, lo cual no es mucho; por lo tanto, existen otras codificaciones que utilizan más de un byte por carácter. La codificación estándar de facto en el mundo Unix hoy en día esUTF-8, que es una codificación de longitud variable (diferentes caracteres ocupan diferentes números de bytes) para elconjunto de caracteres Unicode.

Un archivo de texto es un archivo binario que contiene texto inteligible. De hecho, para los programas Unix, un archivo es un archivo de texto siempre que respete dos condiciones:

  • Un archivo de texto no puede contener ningún byte nulo (un byte con un valor numérico de 0). Este byte no representa ningún carácter y se utiliza como marcador especial internamente en muchos programas de manipulación de texto.
  • Un archivo de texto consta de una secuencia de líneas y cada línea termina con unnueva líneacarácter (que tiene el valor numérico 10).

Los ejecutables de máquina son un tipo particular de archivo binario. Si ejecuta el catcomando en ellos, verá basura con algún fragmento de texto ocasional. Estos archivos también pueden contener comandos para su terminal. Puede utilizar el programa stringspara ver todos los fragmentos de texto en un archivo binario, omitiendo los caracteres no imprimibles.

Los ejecutables de máquina no son exactamente una secuencia de instrucciones de máquina: también contienen un poco de información adicional que le indica al sistema operativo cómo cargar el archivo en la memoria, generalmente también algunos datos utilizados por el programa y, opcionalmente, información de depuración. La mayoría de los sistemas Unix utilizan elDUENDEformato para ejecutables de máquina. Este formato especifica cómo un archivo que contiene código de máquina se divide en secciones, y esa parte es independiente de la arquitectura de la máquina; Algunas secciones contienen código y el significado de ese código es específico de una arquitectura de máquina en particular.

Puede utilizar el comando objdump -D /path/to/machine-executablepara mostrar una lista del ejecutable en un formato legible por humanos:lenguaje ensamblador. Bueno, legible por un humano capacitado de todos modos. El lenguaje ensamblador es específico de la arquitectura de un procesador y se asigna directamente a las instrucciones de la máquina.

Es posible escribir un programa completo en lenguaje ensamblador, pero esto rara vez se hace para programas no triviales, porque lleva mucho tiempo. Si estás realmente loco, puedes escribir tu programa directamente en binario. Algunas personas han tratado de idear laprograma más corto posible que imprimeHello world; Ryan Henszey explica cómo escribir unEjecutable ELF de 142 bytes para procesadores de PC; Brian Raiteranalizó el formato ELF y creó un programa de 45 bytesque Linux está dispuesto a ejecutar (ese programa no imprime nada).

También hay ejecutables que no son archivos binarios; son conocidos comoguiones. Y a la inversa, hay muchos archivos binarios que no son ejecutables: imágenes, vídeos, archivos comprimidos, documentos de procesadores de texto, bibliotecas de códigos sin formato.punto de entrada, ejecutables para otras arquitecturas de procesador,…

información relacionada