A Aldeia Numaboa ancestral ainda está disponível para visitação. É a versão mais antiga da Aldeia que eu não quis simplesmente descartar depois de mais de 10 milhões de pageviews. Como diz a Sirley, nossa cozinheira e filósofa de plantão: "Misericórdia, ai que dó!"

Se você tiver curiosidade, o endereço é numaboa.net.br.

Leia mais...

Informática Numaboa - Referências

O formato PE

Sab

11

Abr

2009


11:01

(10 votos, média 5.00 de 5) 


Diretório de dados

Cabeçalho MZ do DOS
Fragmento (stub) do DOS
Cabeçalho do Arquivo
Cabeçalho Opcional
Diretório de Dados
Cabeçalhos das Seções
Seção 1
Seção 2
...
Seção n

Imediatamente após o cabeçalho opcional vêm os diretórios de dados. Os diretórios são um array de IMAGE_NUMBEROF_DIRECTORY_ENTRIES (16) IMAGE_DATA_DIRECTORY. Cada um destes diretórios descreve a localização (um RVA de 32 bits denominado 'VirtualAddress') e o tamanho (também de 32 bits, chamado 'Size') de uma peça de informação que está localizada em uma das seções que seguem as entradas de diretório.

Por exemplo, o diretório de segurança (security directory) se encontra no RVA e tem o tamanho indicado no índice 4. Os índices definidos para os diretórios são:

NomeÍndiceDiretório
IMAGE_DIRECTORY_ENTRY_EXPORT0É o diretório de funções exportadas, usado principalmente para DLLs.
IMAGE_DIRECTORY_ENTRY_IMPORT1Diretório de símbolos importados.
IMAGE_DIRECTORY_ENTRY_RESOURCE2Diretório de recursos (resources).
IMAGE_DIRECTORY_ENTRY_EXCEPTION3Diretório de exceções - estrutura e aplicação ignorada.
IMAGE_DIRECTORY_ENTRY_SECURITY4Diretório de segurança - estrutura e aplicação ignorada.
IMAGE_DIRECTORY_ENTRY_BASERELOC5Tabela da base de remanejamento.
IMAGE_DIRECTORY_ENTRY_DEBUG6Diretório de debug, cujo conteúdo depende do compilador. De qualquer forma, muitos compiladores colocam as informações de debug na seção de código e não criam uma seção separada.
IMAGE_DIRECTORY_ENTRY_COPYRIGHT7String de descrição com alguns comentários de copyright ou coisa parecida.
IMAGE_DIRECTORY_ENTRY_GLOBALPTR8Valor de Máquina (MIPS GP) - estrutura e aplicação ignorada.
IMAGE_DIRECTORY_ENTRY_TLS9Diretório de armazenamento local de thread - estrutura desconhecida. Contém variáveis que são declaradas "__declspec(thread)", isto é, variáveis globais per-thread.
IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG10Diretório de configuração de carregamento - estrutura e aplicação ignorada.
IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT11Diretório de importação casada (bound import).
IMAGE_DIRECTORY_ENTRY_IAT12Tabela de endereços de importação (IAT - Import Address Table).

Como exemplo, se encontrarmos 2 duplo-words no índice 7, cujos valores sejam 12000 e 33, e o endereço de carregamento for 10000, sabemos que os dados de copyright estão no endereço 10000 + 12000 (independentemente da seção em que possam estar) e que o comentário de copyright tem 33 bytes de comprimento.

Se algum diretório de um tipo em particular não for usado no binário, o tamanho (Size) e o endereço virtual (VirtualAddress) são zero.

Offset 01234 56789 ABCDE F
0000 00C0 50 45 00 00 4C010300 A377553C 00000000
...
0000 0130 00000000 10 00 00 00 00 00 00 00 00 00 00 00
0000 0140 40 20 00 00 3C 00 00 00 00 40 00 00 60 09 00 00
0000 0150 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0000 0160 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0000 0170 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0000 0180 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0000 0190 00 00 00 00 00 00 00 00

No nosso exemplo, no array de 12 elementos destacados em verde e vermelho, apenas os diretórios de índice 1 e 2 possuem referências.

O diretório de índice 1 refere-se aos símbolos importados: seu RVA é 0000 2040 e seu tamanho é 0000 003C. Portanto, os dados referentes aos símbolos importados estarão deslocados em 8.256 bytes (2040h = 8256d) e ocupam 60 bytes (3Ch = 60d).

O diretório de índice 2 refere-se aos recursos: seu RVA é 0000 4000 e seu tamanho é 0000 0960. Portanto, os dados referentes aos recursos estarão deslocados 16.384 bytes (4000h = 16384d) e ocupam 2400 bytes (0960h = 2400d).

:anota: Exercício proposto

Para este módulo, tente o seguinte:

  1. A esta altura do campeonato você já deve ter uma verdadeira coleção de executáveis no formato PE. Faça uma tabela com os 12 tipos possíveis de diretórios de dados de acordo com os programas analisados. Tente descobrir quais diretórios de dados são os mais comuns.

Informações adicionais