Como ler / escrever.código de máquina exe manualmente?

Não conheço bem a magia do compilador. O ato de transformar o código legível pelo homem (ou o não realmente Instruções de montagem legíveis) em código de máquina é, para mim, ciência de foguetes combinada com feitiçaria.

Vou limitar o assunto desta pergunta aos executáveis Win32 (.exe). Quando eu abrir esses arquivos em um visualizador especializado, eu posso encontrar strings (geralmente 16b por personagem) espalhados em vários lugares, mas o resto é apenas lixo. Suponho que ... parte ilegível (maioria) é o código da máquina (ou talvez recursos, tais como imagens etc...).

Há alguma forma simples de ler o código da máquina? Abrindo o exe como um fluxo de arquivo e lendo-o byte por byte, como se poderia transformar estes bytes individuais em conjunto? Existe um mapeamento direto entre estes bytes de Instrução e a instrução de montagem?

Como está o ... exe escrito? Quatro bytes por instrução? Mais? Menos? Eu notei alguns as aplicações podem criar arquivos executáveis assim: por exemplo, no ACD See você pode exportar uma série de imagens para uma apresentação. Mas isso não necessariamente tem que ser um slideshow SWF, ACD See também é capaz de produzir apresentações executáveis. Como se faz isso?

Como posso entender o que se passa dentro de um ficheiro EXE?

12 answers

OllyDbg é uma ferramenta incrível que desmonta um EXE em instruções legíveis e lhe permite executar as instruções um a um. Ele também lhe diz que funções API o programa usa e, se possível, os argumentos que ele fornece (desde que os argumentos são encontrados na pilha).

De um modo geral, as instruções da CPU são de comprimento variável, algumas são de um byte, outras são duas, algumas três, algumas quatro etc. Depende principalmente do tipo de dados que o instruções esperam. Algumas instruções são generalizadas, como" mov", que diz à CPU para mover os dados de um registro CPU para um lugar na memória, ou vice-versa. Na realidade, existem muitas instruções "mov" diferentes, umas para lidar com dados de 8 bits, 16 bits, 32 bits, outras para mover dados de diferentes registros e assim por diante.

O que é um livro de nível de entrada livre que fala sobre montagem e como a Intel 386 CPU opera. A maior parte é aplicável até mesmo aos CPUs Intel modernos.

O formato EXE é específico do Windows. O ponto de entrada (ou seja, a primeira instrução executável) é normalmente encontrado no mesmo local dentro do ficheiro EXE. É tudo um pouco difícil de explicar tudo de uma vez, mas os recursos que eu forneci devem ajudar a curar pelo menos alguma da sua curiosidade! :)

 15
Author: dreamlax, 2009-04-16 14:33:34
Precisas de um desmontador que transforme o código da máquina em linguagem de montagem. Este Link da Wikipédia descreve o processo e fornece links para desmontadores livres. É claro que, como você diz que não entende a linguagem de montagem, isso pode não ser muito informativo - o que exatamente você está tentando fazer aqui?
 6
Author: , 2009-04-16 14:30:57

O ficheiro executável que vê é o formato Microsofts PE (executável portátil). É essencialmente um container, que contém alguns dados específicos do sistema operacional sobre um programa e os próprios dados do programa se dividem em várias seções. Por exemplo, código, recursos, dados estáticos são armazenados em seções separadas.

O formato da secção depende do que contém. A seção de código contém o código da máquina de acordo com a arquitetura alvo executável. Nos casos mais Intel x86 ou AMD-64 (o mesmo que EM64T) para os binários da Microsoft PE. O formato do Código da máquina é CISC e se origina de volta para o 8086 e mais cedo. O aspecto importante do CISC é que seu tamanho de instrução não é constante, você tem que começar a ler no lugar certo para obter algo valioso dele. A Intel publica bons manuais sobre o conjunto de instruções x86/x64.

Pode usar um desmontador para ver o código da máquina directamente. Em combinação com os manuais você pode adivinhar a fonte código a maior parte do tempo.

E depois há o MSIL EXE: os executáveis. net com Microssofts na linguagem intermediária, estes não contêm código específico da máquina, mas o código.net CIL. As especificações para isso estão disponíveis on-line no ECMA.

Estes podem ser vistos com uma ferramenta como o Reflector.

 5
Author: grover, 2009-04-16 14:36:02

O conteúdo do ficheiro EXE está descrito em executável portátil. Ele contém Código, dados e instruções para SO sobre como carregar o arquivo.

Existe um mapeamento 1: 1 entre o código da máquina e a montagem. Um programa de desmontagem irá realizar a operação reversa.

Não há um número fixo de bytes por instrução em i386. Alguns são um único byte, outros são muito mais longos.

 5
Author: MaxVT, 2009-04-16 14:38:33

Pode usar a depuração a partir da linha de comandos, mas isso é difícil.

C:\WINDOWS>debug taskman.exe
-u
0D69:0000 0E            PUSH    CS
0D69:0001 1F            POP     DS
0D69:0002 BA0E00        MOV     DX,000E
0D69:0005 B409          MOV     AH,09
0D69:0007 CD21          INT     21
0D69:0009 B8014C        MOV     AX,4C01
0D69:000C CD21          INT     21
0D69:000E 54            PUSH    SP
0D69:000F 68            DB      68
0D69:0010 69            DB      69
0D69:0011 7320          JNB     0033
0D69:0013 7072          JO      0087
0D69:0015 6F            DB      6F
0D69:0016 67            DB      67
0D69:0017 7261          JB      007A
0D69:0019 6D            DB      6D
0D69:001A 206361        AND     [BP+DI+61],AH
0D69:001D 6E            DB      6E
0D69:001E 6E            DB      6E
0D69:001F 6F            DB      6F
 4
Author: Dead account, 2009-04-16 14:29:23

Se é tão estranho para você como parece, eu não acho que um depurador ou desmontador vai ajudar - você precisa aprender montagem programação primeiro; estudar a arquitetura do processador (abundância de documentação transferível a partir da Intel). E então, uma vez que a maioria do Código da máquina é gerada por compiladores, você precisa entender como compiladores geram código - a maneira mais simples de escrever muitos programas pequenos e depois desmontá-los para ver em que o seu C/C++ é transformado.

Um casal de livros que te ajudarão a entender.
 2
Author: U62, 2009-04-16 14:50:56
Para ter uma ideia, definir um ponto de paragem num código interessante e depois ir à janela da CPU.

Se você está interessado em mais, é mais fácil compilar fragmentos curtos com o Free Pascal usando o parâmetro-al.

FPC permite a saída da montagem gerada em uma infinidade de formatos de montagem (TASM,MASM,GAS ) usando o parâmetro-A, e você pode ter o código pascal original intercalado em comentários (e muito mais) para fácil cruzamento.

Porque é compilador montador gerado, em vez de montador desmontado .exe, é mais simbólico e mais fácil de seguir.

 2
Author: Marco van de Voort, 2009-05-08 13:58:32

Formato Win32 exe no MSDN

Eu sugeria pegar um pouco do Código Fonte do Windows C e construir e começar a debugá-lo em Visual Studio. Muda para a vista de desmontagem e passa por cima dos comandos. Você pode ver como o código C foi compilado em código de máquina - e vê-lo executar passo a passo.
 1
Author: Aardvark, 2009-04-16 14:35:59
Apenas em relação a esta pergunta, qualquer um ainda lê coisas como: CD 21? Lembrei-me da Sandra Bullock num programa, a ler uma tela cheia de números hex e a descobrir o que o programa faz. Como a versão actual do código de matriz de leitura.

Se você lê coisas como CD 21, como você se lembra das diferentes combinações?

 1
Author: zeroin23, 2009-04-16 16:53:56
A tua curiosidade e o teu nível de compreensão estão exactamente onde eu estava. I altamente recomendo Código: a linguagem escondida do Hardware e Software de computador . Isto não vai responder a todas as perguntas que fazem aqui, mas vai lançar luz sobre alguns dos aspectos totalmente negros da magia dos computadores. É um livro espesso, mas altamente legível.
 1
Author: Dinah, 2009-04-16 17:59:37
O ACD See deve estar a aproveitar-se disso .Os arquivos EXE não fazem nenhuma verificação de erro no comprimento do arquivo ou qualquer coisa além do comprimento da parte esperada do arquivo. Por causa disto, podes fazer um.Ficheiro EXE que irá abrir o seu eu e carregar tudo para além de um determinado ponto como dados. Isto é útil porque você pode então fazer um .EXE que funciona em um determinado conjunto de dados, apenas empilhando esses dados na extremidade de um adequadamente escrito .EXE Não faço ideia do que é exactamente o ACD See. tome isso com um grande grão de sal, mas eu sei que algum programa são gerados dessa forma.)
 1
Author: BCS, 2009-04-17 18:55:34
Familiaridade com a montagem de baixo nível (e quero dizer montagem de baixo nível, não "macros" e esse touro) é provavelmente uma necessidade. Se você realmente quiser ler o código da máquina raw diretamente, normalmente você usaria um editor hex para isso. A fim de entender o que as instruções fazem, no entanto, a maioria das pessoas usaria um desmontador para converter isso nas instruções de montagem apropriadas. Se você é uma das minorias que quer entender a linguagem da máquina em si, eu acho que você iria querer o Intel® 64 e manuais de desenvolvimento de software para arquitecturas IA-32. O Volume 2 cobre especificamente o conjunto de instruções, que se relaciona com a sua consulta sobre como ler o código da máquina em si e como o conjunto se relaciona com ele.
 1
Author: Coding With Style, 2009-09-25 05:15:38