Se você é um especialista em segurança e está fazendo uma investigação forense, ou análise de Malware é importante entender como é a estrutura de um arquivo executável no Windows. O formato de arquivo executável portátil Portable executable (PE) é um tipo de formato usado no Windows (x86 e x64).
No Linux temos o formato Executable Link File (ELF).
O formato de arquivo PE é uma estrutura de dados que contém as informações necessárias para que o o sistema operacional Windows gerencie o código executável encapsulado. Antes do arquivo PE havia um formato chamado COFF usado em sistemas Windows NT.
As estruturas de arquivos PE incluem DOS Header, DOS Stub, PE File Header, Image Optional Header, Section Table, e Sections.
DOS header – O cabeçalho do DOS começa com os primeiros 64 bytes de cada arquivo PE.
DOS Stub – O stub do DOS geralmente apenas imprime uma string, algo como a mensagem “Este programa não pode ser executado no modo DOS”. Este arquivo é mantido no endereço 0x3c, que é deslocado para a próxima seção do cabeçalho PE.
PE file header – O cabeçalho PE principal é uma estrutura do tipo IMAGE_NT_HEADERS e contém principalmente SIGNATURE, IMAGE_FILE_HEADER e IMAGE_OPTIONAL_HEADER. Um arquivo PE possui uma coleção de campos que definem a aparência do restante do arquivo.
Uma boa fonte de leitura é o https://tech-zealots.com/malware-analysis/pe-portable-executable-structure-malware-analysis-part-2/
Image Optional Header – Este não é um cabeçalho opcional e não relevante. ste cabeçalho contém algumas informações críticas que estão além das informações básicas contidas na estrutura de dados.
Section Table – A localização desta tabela de seção é determinada pelo cálculo da localização dos primeiros bytes após o cabeçalho. Para isso, temos que usar o tamanho do cabeçalho opcional. Cada cabeçalho de seção tem pelo menos 40 bytes de entrada. Abaixo ,algumas das entradas importantes?
- Name1: uma string de codificação UTF8 com preenchimento nulo de 8 bytes. Isso pode ser nulo.
- VirtualSize: O tamanho real dos dados da seção em bytes. Isso pode ser menor que o tamanho da seção no disco.
- SizeOfRawData: O tamanho dos dados da seção no arquivo no disco.
- PointerToRawData: Isso é muito útil porque é o deslocamento do início do arquivo para os dados da seção.
- Characteristics: Descreve as características da seção.
Sections – Os cabeçalhos de seção PE também especificam o nome da seção usando um campo de matriz de caracteres simples chamado Name. Abaixo estão os vários nomes de seções comuns disponíveis em um arquivo executável:
- .text: Esta é normalmente a primeira seção e contém o código executável para o aplicativo. Dentro desta seção há também um ponto de entrada da aplicação: o endereço da primeira instrução da aplicação que será executada. Um aplicativo pode ter mais de uma seção com o código executável.
- .data: Esta seção contém dados inicializados de um aplicativo, como strings.
- .rdata ou .idata: Normalmente, esses nomes de seção são usados para as seções onde a tabela de importação está localizada. Esta é a tabela que lista a API do Windows usada pelo aplicativo (junto com os nomes de suas DLLs associadas). Usando isso, o carregador do Windows conhece a API para localizar em qual DLL do sistema recuperar seu endereço.
- .reloc: contém informações de realocação.
- .rsrc: Este é o nome comum para a seção resource-container, que contém coisas como imagens usadas para a interface do usuário do aplicativo.
- .debug: contém informações de depuração.
Fontes:
Ótimo conteúdo, direto e de fácil entendimento.
Parabéns.