Executáveis
Normalmente, chamamos de arquivos executáveis os arquivos que quando clicados duas vezes (no caso do Windows) executam. Os mais famosos no Windows são os de extensão .exe
, que serão o foco do nosso estudo. Para entender como estes arquivos são criados, é preciso notar os passos:
Escrita do código-fonte na linguagem escolhida num arquivo de texto.
Compilação.
Linking.
O compilador cria os chamados arquivos objeto a partir do código-fonte (em texto). Estes objetos contém instruções de máquina e dados.
O linker serve para juntar todos os objetos num único arquivo, realocar seus endereços e resolver seus símbolos (nomes de função importadas, por exemplo).
O processo de compilação (transformação do código-fonte em texto em código de máquina) gera como saída um arquivo chamado de objeto.
No que diz respeito ao processo de linking, estes executáveis podem ser de dois tipos:
Estáticos
Todo o código das funções externas ao executável principal é compilado junto a ele. O resultado é um executável livre de dependências, porém grande. É raro encontrar executáveis assim para Windows.
Dinâmicos
O executável vai depender de bibliotecas externas (DLL's, no caso do Windows) para funcionar, como estudamos na seção Tabela de Importações.
O nosso binário CRACKME.EXE, que usamos em vários momentos deste livro é dinâmico. Nós já vimos isso ao analisar sua Imports Table com o DIE, mas agora vamos utilizar novamente a ferramenta dumpbin para checar suas dependências:
Existem vários parsers de executáveis alternativos ao dumpbin. Consulta o apêndice Ferramentas para ver uma lista.
Last updated