Então, se eu entendi tudo corretamente
Nem tanto.
É um arquivo binário e seus dados são incompreensíveis para nós humanos
Normalmente, um arquivo binário é incompreensível para humanos e máquinas, especialmente quando o objetivo do arquivo é desconhecido. Observe que nem todos os arquivos binários são executáveis. Muitos arquivos binários são arquivos de dados que não contêm nenhuma instrução da máquina. É por isso que as extensões de arquivo são usadas ao nomear arquivos (em alguns sistemas operacionais). O . A extensão com foi usada pelo CP / M para indicar um arquivo executável. O . A extensão exe foi adicionada pelo MS-DOS para indicar outro formato de arquivo executável. * nixes usam o atributo execute para indicar quais arquivos podem ser executados, embora possam ser tanto scripts quanto códigos.
Como já mencionado por outros, os arquivos binários, que contêm números, devem ser visualizados por um programa hex dump ou editor hexadecimal e não por um visualizador de texto.
existe um exemplo do conteúdo do programa ping.exe
Na verdade, esse arquivo é um programa realocável e nem todos os dados nesse arquivo representam código de máquina. Há informações sobre o programa, como quais bibliotecas dinâmicas ele precisa, quais rotinas precisam ser vinculadas, requisitos para pilha e memória de programa e dados e o ponto de entrada do programa. Os operandos de endereço no arquivo podem ser valores relativos que precisam ser calculados para valores absolutos ou referências que precisam ser resolvidas.
O "arquivo de programa" no qual você provavelmente está pensando é chamado de arquivo de imagem binária ou despejo de memória de programa. Esse arquivo conteria apenas código e dados da máquina, com todas as referências de endereço definidas corretamente para execução.
mesmo se eles souberem o código Assembly (o nível mais baixo da linguagem de máquina).
A linguagem assembly não é igual à linguagem de máquina . A CPU típica (como para excluir computadores de linguagem de alto nível) aceita código de máquina como entrada, uma instrução por vez. Os operandos são registradores ou endereços de memória numérica. A linguagem Assembly é uma linguagem de nível superior que pode usar etiquetas simbólicas para locais e variáveis de instruções, além de substituir códigos operacionais numéricos por mnemônicos. Um programa em linguagem assembly deve ser convertido em código / idioma da máquina antes de poder ser executado (normalmente por utilitários chamados assembler, linker e loader).
A operação reversa, desmontagem, pode ser realizada em arquivos de programa com algum sucesso e perda de informações simbólicas. A desmontagem de um despejo de memória ou arquivo de imagem de programa é mais tentativa e erro, pois os locais de código e dados precisam ser identificados manualmente.
BTW, existem pessoas que podem ler e codificar o código de máquina (numérico). É claro que isso é muito mais fácil em uma CPU ou microcontrolador de 8 bits do que em um processador CISC de 32 bits com uma dúzia de modos de endereço de memória.