# Visão geral do formato PE

O formato PE (Portable Executable) é o padrão para arquivos executáveis utilizados nos sistemas MS-Windows atuais. Faremos um breve resumo sobre sua estrutura, mas a documentação completa (em inglês) pode ser obtida aqui.

Quando um programador escreve um programa e o compila, não é somente o código escrito por ele que vai para o executável. O compilador adiciona todas as estruturas e informações necessárias para este executável seja devidamente carregado pelo sistema operacional, utilize funções de bibliotecas externas etc. Essas adição de informações precisa obedecer um padrão, uma especificação, e é exatamente aí que o formato PE entra.

## Cabeçalhos

Os primeiros bytes de um arquivo PE são elementos de vários cabeçalhos diferentes. Estes bytes são na realidade os valores dos vários campos dos cabeçalhos do PE. Um cabeçalho é um conjunto de campos e seus respectivos valores. Vamos analisar o primeiro cabeçalho do PE, ou seja, o que está logo no início de um arquivo PE.

O primeiro cabeçalho num arquivo PE é o chamado Cabeçalho do DOS, ou no inglês, DOS Header. Este cabeçalho possui a seguinte estrutura:

## Cabeçalho do DOS

Posição | Tamanho | Nome | Descrição
Total | 64 |
0x00 | 2 | e_magic | Magic Number - para executáveis PE deve ser sempre 0x5a4d
0x02 | 2 | e_cblp |
0x04 | 2 | e_cp |
0x06 | 2 | e_crlc |
0x08 | 2 | e_cparhdr |
0x0a | 2 | e_minalloc |
0x0c | 2 | e_maxalloc |
0x0e | 2 | e_ss |
0x10 | 2 | e_sp |
0x12 | 2 | e_csum |
0x14 | 2 | e_ip |
0x16 | 2 | e_cs |
0x18 | 2 | e_lfarlc |
0x1a | 2 | e_ovno |
0x1c | 8 | e_res |
0x24 | 2 | e_oemid |
0x26 | 2 | e_oeminfo |
0x28 | 20 | e_res2 |
0x3c | 4 | e_lfanew | Posição no arquivo da assinatura PE

Perceba que o valor presente nos dois primeiro bytes representa o campo de nome e_magic. A posição do início do campo está representada em hexadecimal para facilitar.

Podemos então dizer que os primeiros 64 bytes de um arquivo PE definem o cabeçalho do DOS. O formato especifica que o valor do último campo, chamado e_lfanew, é na verdade o endereço de uma assinatura PE. Esta assinatura possui 4 bytes e deve ser o número 0x4550, do contrário, o arquivo não é um PE válido.

Existem outros cabeçalhos no arquivo PE. Por favor, leia a documentação oficial para maiores detalhes sobre este e outros cabeçalhos existentes.

## Seções

Uma outra região do PE muito importante são as sessões. Tratam-se de áreas delimitadas dentro do PE para abrigar certos tipos de dados. Cada seção tem uma posição dentro do arquivo PE, ou seja, onde ela começa, e um tamanho, que torna possível saber em qual byte ela termina.

Se você imaginar um executável PE como um criado-mudo, as seções seriam as gavetas. E como todo criado-mudo organizado, cada gaveta possui um tipo de roupa (uma para calças, outra para camisas e assim por diante), mas nada impede de separar duas ou mais gavetas só para camisas. O que não se pode fazer, pelo menos no PE, é misturar as coisas.

O código executável fica numa seção de código. Já dados do tipo texto utilizados pelo programador para criar o programa, ficam em outra seção, que não possui código executável e sim dados.

As seções possuem um nome, apesar de não ser regra. Outro atributo importante são as permissões da seção. Ela pode ser executável, legível e/ou gravável. Abaixo uma lista de de seções normalmente encontradas em executáveis PE sadios:

.text / .code

- Seção de código executável, normalmente a primeira a ser executada (mas não é regra). Precisa de permissão de leitura e execução.

.data

- Seção para dados (variáveis e outros). Precisa de permissão de leitura e gravação.

.rdata

- Seção para dados somente para leitura. Precisa de permissão de leitura somente.

As seções podem conter qualquer configuração. Inclusive a partir destas configurações, podemos inferir que estamos tratando de uma seção de um PE onde o criador utilizou técnicas para evitar o trabalho de analistas de malware.