Entonces, si he entendido todo correctamente
No exactamente.
Es un archivo binario y sus datos son incomprensibles para nosotros los humanos.
Por lo general, un archivo binario es incomprensible para humanos y máquinas, especialmente cuando se desconoce el propósito del archivo. Tenga en cuenta que no todos los archivos binarios son archivos ejecutables. Muchos archivos binarios son archivos de datos que no contienen instrucciones de la máquina. Es por eso que las extensiones de archivo se usan al nombrar archivos (en algunos sistemas operativos). Los . La extensión com fue utilizada por CP / M para denotar un archivo ejecutable. Los . MS-DOS agregó la extensión exe para indicar otro formato de archivo ejecutable. * nixes usa el atributo execute para denotar qué archivos se pueden ejecutar, aunque podría ser script y código.
Como ya mencionaron otros, los archivos binarios, que contienen números, deben ser vistos por un programa de volcado hexadecimal o un editor hexadecimal y no por un visor de texto.
hay un ejemplo del contenido del programa ping.exe
Ese archivo es en realidad un programa reubicable, y no todos los datos en ese archivo representan el código de la máquina. Hay información sobre el programa, como qué bibliotecas dinámicas necesita, qué rutinas deben vincularse, los requisitos para la pila y la memoria de programa y datos, y el punto de entrada del programa. Los operandos de dirección en el archivo pueden ser valores relativos que deben calcularse a valores absolutos o referencias que deben resolverse.
El "archivo de programa" en el que probablemente esté pensando se llama un archivo de imagen binario o un volcado de memoria de programa. Dicho archivo contendría solo código y datos de la máquina, con todas las referencias de dirección configuradas correctamente para la ejecución.
incluso si conocen el código de ensamblaje (el nivel más bajo de lenguaje de máquina).
El lenguaje ensamblador no es lo mismo que el lenguaje máquina . La CPU típica (como para excluir computadoras de lenguaje de alto nivel) acepta el código de máquina como entrada, una instrucción a la vez. Los operandos son registros o direcciones de memoria numérica. El lenguaje ensamblador es un lenguaje de nivel superior que puede usar etiquetas simbólicas para ubicaciones y variables de instrucciones, así como también para reemplazar los códigos de operación numéricos con mnemónicos. Un programa de lenguaje ensamblador tiene que convertirse a lenguaje / código de máquina antes de que pueda ejecutarse realmente (generalmente por utilidades llamadas ensamblador, enlazador y cargador).
La operación inversa, desensamblaje, se puede realizar en archivos de programa con cierto éxito y pérdida de información simbólica. El desmontaje de un archivo de volcado de memoria o imagen de programa es más prueba y error, ya que las ubicaciones de código y datos deben identificarse manualmente.
Por cierto, hay personas que pueden leer y codificar el código de máquina (numérico). Por supuesto, esto es mucho más fácil en una CPU o microcontrolador de 8 bits que en un procesador CISC de 32 bits con una docena de modos de dirección de memoria.