Quindi, se ho capito tutto correttamente
Non proprio.
È un file binario e i suoi dati sono incomprensibili per noi umani
In genere un file binario è incomprensibile per uomo e macchina, specialmente quando lo scopo del file è sconosciuto. Si noti che non tutti i file binari sono file eseguibili. Molti file binari sono file di dati che non contengono istruzioni per la macchina. Questo è il motivo per cui le estensioni dei file vengono utilizzate durante la denominazione dei file (in alcuni sistemi operativi). Il . l' estensione CP è stata utilizzata da CP / M per indicare un file eseguibile. Il . MS-DOS ha aggiunto l'estensione exe per indicare un altro formato di file eseguibile. * nix utilizza l'attributo execute per indicare quali file possono essere eseguiti, sebbene possano essere sia script che codice.
Come già accennato da altri, i file binari, che contengono numeri, dovrebbero essere visualizzati da un programma di dump esadecimale o da un editor esadecimale e non da un visualizzatore di testo.
c'è un esempio del contenuto del programma ping.exe
Quel file è in realtà un programma trasferibile e non tutti i dati in quel file rappresentano il codice macchina. Ci sono informazioni sul programma come quali librerie dinamiche di cui ha bisogno, quali routine devono essere collegate, requisiti per stack e memoria del programma e dei dati, e il punto di ingresso del programma. Gli operandi di indirizzo nel file potrebbero essere valori relativi che devono essere calcolati in valori assoluti o riferimenti che devono essere risolti.
Il "file di programma" a cui probabilmente stai pensando è chiamato un file di immagine binario o un dump della memoria del programma. Tale file conterrebbe solo codice e dati macchina, con tutti i riferimenti di indirizzo impostati correttamente per l'esecuzione.
anche se conoscono il codice assembly (il livello più basso del linguaggio macchina).
Il linguaggio assembly non è lo stesso del linguaggio macchina . La CPU tipica (per escludere i computer di linguaggio di alto livello) accetta il codice macchina come input, un'istruzione alla volta. Gli operandi sono registri o indirizzi di memoria numerici. Il linguaggio assembly è un linguaggio di livello superiore che può utilizzare etichette simboliche per posizioni e variabili delle istruzioni, oltre a sostituire i codici operativi numerici con mnemonici. Un programma di linguaggio assembly deve essere convertito in linguaggio / codice macchina prima di poter essere effettivamente eseguito (in genere da utility chiamate assembler, linker e loader).
L'operazione inversa, lo smontaggio, può essere eseguita su file di programma con esito positivo e perdita di informazioni simboliche. Il disassemblaggio di un dump della memoria o di un file di immagine del programma comporta ulteriori tentativi ed errori, poiché i percorsi di codice e dati devono essere identificati manualmente.
A proposito ci sono persone che possono leggere e codificare il codice macchina (numerico). Naturalmente questo è molto più semplice su una CPU o microcontrollore a 8 bit rispetto a un processore CISC a 32 bit con una dozzina di modalità di indirizzo di memoria.