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) 


Cabeçalho MZ do DOS

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

Os primeiros dois bytes de qualquer executável em formato PE constituem a assinatura do DOS. Você sabe que dois bytes formam uma palavra (WORD). O word da assinatura SEMPRE é a sequência "MZ", ou seja, 4D 5A em hexadecimal. Portanto, pode-se reconhecer o fragmento do DOS pela sua assinatura. Este reconhecimento é chamado de validação do cabeçalho DOS.

Se abrirmos nosso executável exemplo (o tutNB03.exe) - ou qualquer outro executável no formato PE - num editor hexadecimal, os primeiros 32 bytes serão os seguintes:

Offset 0 1 2 3 4 5 6 7 8 9 A B C D E F ASCII
0000 0000 4D 5A 90 00 03 00 00 00 04 00 00 00 FF FF 00 00 MZ..........ÿÿ..
0000 0010 B8 00 00 00 00 00 00 00 40 00 00 00 00 00 00 00 ¸.......@.......

Agora dê uma olhada nos bytes das posições 18 a 1B, marcados em verde. 4 bytes são 2 word, e 2 word são um DWORD. Lemos 40 00 00 00. Acontece que os processadores Intel (e compatíveis) guardam os bytes em ordem inversa. Então, lendo da direita para a esquerda, o valor encontrado é 0000 0040. Este valor indica o quanto devemos nos deslocar (offset) para encontrar o stub do DOS.

Fragmento (stub) do DOS

Seguindo a primeira pista, encontramos o executável DOS. A área destacada em azul é o stub do DOS. Uma parte dos valores tem o correspondente em ASCII de "This program cannot be run in DOS mode", que é a string que será mostrada caso se tente executar este programa a partir do DOS. Geralmente o código usa o serviço 9 da interrupção 21 do DOS para imprimir uma string e o serviço 4C da interrupção 21 para voltar ao ambiente DOS. A instrução de interrupção é CD 21 e as instruções estão destacadas em azul mais claro.

Offset 0 1 2 3 4 5 6 7 8 9 A B C D E F ASCII
0000 0000 4D 5A 90 00 03 00 00 00 04 00 00 00 FF FF 00 00 MZ..........ÿÿ..
0000 0010 B8 00 00 00 00 00 00 00 40 00 00 00 00 00 00 00 ¸.......@.......
0000 0020 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
0000 0030 00 00 00 00 00 00 00 00 00 00 00 00 C0 00 00 00 ............À...
0000 0040 0E 1F BA 0E 00 B4 09 CD 21 B8 01 4C CD 21 54 68 ..º..´.Í!Th
0000 0050 69 73 20 70 72 6F 67 72 61 6D 20 63 61 6E 6E 6F is program canno
0000 0060 74 20 62 65 20 72 75 6E 20 69 6E 20 44 4F 53 20 t be run in DOS
0000 0070 6D 6F 64 65 2E 0D 0D 0A 24 00 00 00 00 00 00 00 mode....$.......

No offset 3C encontra-se a segunda pista: C0 00 00 00. Já sabemos que corresponde a 0000 00C0. É onde se encontra a assinatura PE.

A assinatura PE

Seguindo a segunda pista, encontramos a assinatura PE que indica o início do cabeçalho do arquivo. Pressupõem-se que todo arquivo que contenha uma assinatura PE seja um arquivo PE válido - pelo menos o Windows "pensa" assim.

Offset 0 1 2 3 4 5 6 7 8 9 A B C D E F ASCII
0000 0000 4D 5A 90 00 03 00 00 00 04 00 00 00 FF FF 00 00 MZ..........ÿÿ..
0000 0010 B8 00 00 00 00 00 00 00 40 00 00 00 00 00 00 00 ¸.......@.......
0000 0020 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
0000 0030 00 00 00 00 00 00 00 00 00 00 00 00 C0 00 00 00 ............À...
0000 0040 0E 1F BA 0E 00 B4 09 CD 21 B8 01 4C CD 21 54 68 ..º..´.Í!Th
0000 0050 69 73 20 70 72 6F 67 72 61 6D 20 63 61 6E 6E 6F is program canno
0000 0060 74 20 62 65 20 72 75 6E 20 69 6E 20 44 4F 53 20 t be run in DOS
0000 0070 6D 6F 64 65 2E 0D 0D 0A 24 00 00 00 00 00 00 00 mode....$.......
0000 0080 E3 E2 11 DB A7 83 7F 88 A7 83 7F 88 A7 83 7F 88 ãâ.Û§ƒ.ˆ§ƒ.ˆ§ƒ.ˆ
0000 0090 A7 83 7F 88 B4 83 7f 88 5B A3 6D 88 A6 83 7F 88 §ƒ.ˆ´ƒ.ˆ[£mˆ¦ƒ.ˆ
0000 00A0 60 85 79 88 A6 83 7F 88 52 69 63 68 A7 83 7F 88 `…yˆ¦ƒ.ˆRich§ƒ.ˆ
0000 00B0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
0000 00C0 50 45 00 00 4C 01 03 00 A3 77 55 3C 00 00 00 00 PE..L...yxU<....

Para tirar a cisma, vamos usar nosso visualizador on line para dar uma olhada num executável que é um velho conhecido: o bloco de notas (notepad.exe). O visualizador é um objeto flash. Caso seu browser não esteja habilitado para rodar flash, habilite-o. Se você não tiver o plugin do flash instalado, faça o download na Macromedia.

Como dito acima, os primeiros dois bytes correspondem à assinatura do DOS. Os valores 4D e 5A são "M" e "Z" em ASCII. Os bytes seguintes, até o offset 78, compõem o stub.

  1. Clique na linha 0000 0000, espere os bytes correspondentes entrarem e mova o cursor do mouse sobre o conteúdo: os words 4D e 5A são transformados nos ASCII correspondentes.
    O que nos interessa particularmente é o DWORD no offset 3C. Este campo nos indica a posição da assinatura do PE. Encontramos os bytes 80 00 00 00 que, anotados no sentido inverso, indicam um offset de 0000 0080. É onde se encontra a assinatura PE.
  2. Clique na linha 0000 0030, espere os bytes correspondentes entrarem e mova o cursor do mouse sobre o conteúdo. Aguarde enquanto os bytes do offset 3C são invertidos e o offset correspondente é destacado. Se você clicar na linha indicada, a 0000 0080, entram novamente os bytes correspondentes e, movendo o cursor sobre o conteúdo, os bytes 50 e 45 são transformados nos ASCII correspondentes "P" e "E".

É evidente que a mensagem que o DOS dá em caso de incompatibilidade precisa estar dentro do fragmento do DOS. Se você tiver curiosidade, siga o passo 3:

  1. Clique sobre a linha 0000 0040 (também na 50, 60 e 70 se você quiser), espere os bytes entrarem e descanse o cursor sobre eles. Os valores hexadecimais serão transformados nos ASCII da mensagem.

:anota: Exercícios propostos

Se você for iniciante no assunto e estiver lendo este texto para aprender, então sugiro que não tenha pressa. O assunto é longo, os conceitos precisam ser bem entendidos e as informações precisam de tempo para se fixarem. Além disto, a prática só se adquire após algum treinamento. Para cada assunto abordado haverá sempre uma proposta de exercícios.

Para este primeiro módulo, tente o seguinte:

  1. Abra um monte de executáveis no seu editor hexa preferido e localize a assinatura PE.
  2. Treine inverter os bytes de um valor de 32 bits. Primeiro use lápis papel, depois tente inverter "de cabeça".

Informações adicionais