Informática Numaboa - Referências
O formato PE
Sab 11 Abr 2009 11:01 |
- Detalhes
- Categoria: Formatos padrão
- Atualização: Sábado, 11 Abril 2009 23:44
- Autor: vovó Vicki
- Acessos: 14446
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 | Índice | Diretório |
IMAGE_DIRECTORY_ENTRY_EXPORT | 0 | É o diretório de funções exportadas, usado principalmente para DLLs. |
IMAGE_DIRECTORY_ENTRY_IMPORT | 1 | Diretório de símbolos importados. |
IMAGE_DIRECTORY_ENTRY_RESOURCE | 2 | Diretório de recursos (resources). |
IMAGE_DIRECTORY_ENTRY_EXCEPTION | 3 | Diretório de exceções - estrutura e aplicação ignorada. |
IMAGE_DIRECTORY_ENTRY_SECURITY | 4 | Diretório de segurança - estrutura e aplicação ignorada. |
IMAGE_DIRECTORY_ENTRY_BASERELOC | 5 | Tabela da base de remanejamento. |
IMAGE_DIRECTORY_ENTRY_DEBUG | 6 | Diretó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_COPYRIGHT | 7 | String de descrição com alguns comentários de copyright ou coisa parecida. |
IMAGE_DIRECTORY_ENTRY_GLOBALPTR | 8 | Valor de Máquina (MIPS GP) - estrutura e aplicação ignorada. |
IMAGE_DIRECTORY_ENTRY_TLS | 9 | Diretó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_CONFIG | 10 | Diretório de configuração de carregamento - estrutura e aplicação ignorada. |
IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT | 11 | Diretório de importação casada (bound import). |
IMAGE_DIRECTORY_ENTRY_IAT | 12 | Tabela 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 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | A | B | C | D | E | F |
0000 00C0 | 50 | 45 | 00 | 00 | 4C | 01 | 03 | 00 | A3 | 77 | 55 | 3C | 00 | 00 | 00 | 00 |
... | ||||||||||||||||
0000 0130 | 00 | 00 | 00 | 00 | 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:
- 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.