Jump to content

ImageBase


HelderPereira

Recommended Posts

Onde se encontra, quando visualizado por editor hexadecimal, o endereço para onde será carregado a imagem do executável na memória? Ou isso é definido pelo loader em tempo de carga? No caso do windows se uso o Detect It Easy ele mostra o endereço de carga do executável na memória, mas encontrar esta informação quando  visualizo o código via um editor hexadecimal.  Alguém poderia me ajudar?

Link to comment
Share on other sites

  • Moderators

Fala Helder, blz?

Isso é definido pelo próprio formato do arquivo e é possível sim achar só olhando pro dump em hexa. Da certo "trabalho" ficar procurando os campos olhando direto pro hexa, mas tenho que dizer, é super divertido e se aprende muito ?.

Bom, olhando para o dump do arquivo em hexa a primeira coisa que vemos é o DOS Header, que representa os primeiros 64 bytes do arquivo e nele há um campo chamado e_lfanew, que define o offset para a assinatura PE. Esta assinatura é o primeiro campo de outro header chamado NT Header:

typedef struct _IMAGE_NT_HEADERS {
  DWORD                                         Signature;
  IMAGE_FILE_HEADER             FileHeader;
  IMAGE_OPTIONAL_HEADER OptionalHeader;
} IMAGE_NT_HEADERS, *PIMAGE_NT_HEADERS;

Como podemos ver a assinatura PE tem o tamanho de uma DWORD, isto é, 4 bytes de acordo com a Microsoft e os campos seguintes são: um outro cabeçalho completo (os bytes dele em si) chamado File Header:

typedef struct _IMAGE_FILE_HEADER {
  WORD  Machine;
  WORD  NumberOfSections;
  DWORD TimeDateStamp;
  DWORD PointerToSymbolTable;
  DWORD NumberOfSymbols;
  WORD  SizeOfOptionalHeader;
  WORD  Characteristics;
} IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER;

E logo depois um cabeçalhado chamado Optional Header, que é um dos mais importantes do formato PE. Este cabeçalho possui dentro dele um campo chamado ImageBase, que é justamente o que você está procurando.
 

Eu lembro que você parecia estar estudando pelo tutorial que eu fiz sobre o formato PE aqui, certo? No post de número 3 do tutorial eu falo sobre os campos do NT Header e do Optional Header. De qualquer forma, saiba que é sim possível, é só questão de ler o formato da struct na documentação e ir contando byte a byte até chegar lá!!

Abs

Link to comment
Share on other sites

Archived

This topic is now archived and is closed to further replies.

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...