Como ler / escrever.código de máquina exe manualmente?
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! :)
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.
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.
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
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.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.
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.Se você lê coisas como CD 21, como você se lembra das diferentes combinações?