Diferencia entre revisiones de «Formato PE (Portable Executable)»

(Página creada con '== Introducción == Este artículo tratará del Formato PE en archivos ejecutables en el que se tocarán los conceptos mas fundamentalos que abarcan a los archivos con es…')
(Etiqueta: nuestro-nuestra)
 
(Introducción)
(Etiqueta: nuestro-nuestra)
Línea 3: Línea 3:
 
Este artículo tratará del Formato PE en archivos ejecutables en el que se tocarán los conceptos mas fundamentalos que abarcan a los archivos con este formato.
 
Este artículo tratará del Formato PE en archivos ejecutables en el que se tocarán los conceptos mas fundamentalos que abarcan a los archivos con este formato.
 
   
 
   
 +
'''Aclaraciones:'''
  
<br>
+
- A lo largo de este texto, todos los números que comiencen con 0x... son numero en base hexadecimal y deben ser interpretados como tales.
'''Aclaraciones:'''<br>- A lo largo de este texto, todos los números que comiencen con 0x... son numero en base hexadecimal y deben ser interpretados como tales.
 
 
  
Cuando se habla de memoria virtual, se refiere al bloque de memoria que asigna el Sistema Operativo en la Ram para trabajar con el programa. La direccion virtual no hace referencia a la direccion real de la memoria ram, solo a un bloque que el programa esta usando de ella. En win32 los programas pueden manejar direcciones de memoria de 0 a 232, esto no quiere decir que en memoria se cargue 4 GB, solo que el programa puede manejar direcciones de ese tamaño (0x00000000 - 0xFFFFFFFF).
+
-Cuando se habla de memoria virtual, se refiere al bloque de memoria que asigna el Sistema Operativo en la Ram para trabajar con el programa. La direccion virtual no hace referencia a la direccion real de la memoria ram, solo a un bloque que el programa esta usando de ella. En win32 los programas pueden manejar direcciones de memoria de 0 a 232, esto no quiere decir que en memoria se cargue 4 GB, solo que el programa puede manejar direcciones de ese tamaño (0x00000000 - 0xFFFFFFFF).
 
  
-Cuando se habla de direcciones, no siempre se refiere a la memoria, sino tambien a la posicion de los datos en el archivo. O sea, cuando se habla de direcciones en memoria, seran "direcciones virtuales", y cuando se habla de direcciones en el archivo, serán "direcciones fisicas".<br>
+
-Cuando se habla de direcciones, no siempre se refiere a la memoria, sino tambien a la posicion de los datos en el archivo. O sea, cuando se habla de direcciones en memoria, seran "direcciones virtuales", y cuando se habla de direcciones en el archivo, serán "direcciones fisicas".
 
  
 
== Estructura PE  ==
 
== Estructura PE  ==

Revisión del 11:35 27 sep 2010

Introducción

Este artículo tratará del Formato PE en archivos ejecutables en el que se tocarán los conceptos mas fundamentalos que abarcan a los archivos con este formato.

Aclaraciones:

- A lo largo de este texto, todos los números que comiencen con 0x... son numero en base hexadecimal y deben ser interpretados como tales.

-Cuando se habla de memoria virtual, se refiere al bloque de memoria que asigna el Sistema Operativo en la Ram para trabajar con el programa. La direccion virtual no hace referencia a la direccion real de la memoria ram, solo a un bloque que el programa esta usando de ella. En win32 los programas pueden manejar direcciones de memoria de 0 a 232, esto no quiere decir que en memoria se cargue 4 GB, solo que el programa puede manejar direcciones de ese tamaño (0x00000000 - 0xFFFFFFFF).

-Cuando se habla de direcciones, no siempre se refiere a la memoria, sino tambien a la posicion de los datos en el archivo. O sea, cuando se habla de direcciones en memoria, seran "direcciones virtuales", y cuando se habla de direcciones en el archivo, serán "direcciones fisicas".

Estructura PE

Un archivo ejectuable esta estructurado de la siguiente forma:

 Cabecera DOS

 

 Stub DOS
 Cabecera PE
 Tabla de secciones
 1 Sección
 2 Sección
 3 Sección
 N Sección
 Datos Extra
  •  Cabecera DOS: Es el comienzo del archivo, especifica las caracteristicas necesarias para ejecutar el programa cuando el Sistema Operativo es DOS. De lo contrario salta a la cabecera PE.
  • Stub Dos: Codigo que se ejecuta si el entorno es DOS. Por ej: El tipico cartel "This program cannot be run in DOS mode"
  • Cabecera PE: Estructura que contiene diversa informacion sobre el archivo ejectuable.
  • Tabla de secciones: Como es obvio, contiene el listado de las secciones del ejectuable, mas adelante se explicara su estructura.
  • Los datos extra, serian aquellos que no esten contemplados por la estructura del ejectuable, es decir, no pertenezcan a ninguna sección. Estos solo son apilados al final y quien entiende la estructura de esos datos es el programa.



Los primeros 2 bytes de la cabecera, corresponden a las letras "PE", asi a simple vista, con un editor hexadecimal, mirando el offset PE y yendo a la posicion, rapidamente encontramos el comienzo de la cabecera.

 

Machine (offset + 0x04)


Corresponde a la arquitectura para la cual esta "preparado" el archivo. Esto se indica por medio de Flags por lo cual con un editor solo veremos numeros, pero con un debugger como olly u otros programas podemos ver a cual arquitectura corresponde el valor (o buscando en la msdn), igual esto no es muy importante para nosotros.

 

 

NumberOfSections (offset + 0x06)


En este WORD (2 bytes) se indica la cantidad de secciones que contiene el archivo, En el caso de que agreguemos una sección este sera uno de los tantos valores a modificar.

 

 

SizeOfOptionalHeader (offset + 0x14)


Es un WORD (2 bytes) que nos dice el tamaño de la cabecera opcional, en la mayoria de los archivos esta cabecera existe, y aca esta  

Characteristics (offset + 0x16)


Contiene informacion sobre las caracteristicas de la imagen (si es ejecutable, si es 32 bits, etc). No es muy importante para nosotros, asi que solo lo mencionamos.
SizeOfCode (offset + 0x1C)


Es un entero (4 bytes) que contiene la suma de los tamaños de todas las secciones de "codigo".     

SizeOfInitializedData (offset + 0x20) Es un entero (4 bytes) que contiene la suma de los tamaños de todas las secciones de que tiene datos inicializados.    

SizeOfUninitializedData (offset + 0x24) Es un entero (4 bytes) que contiene la suma de los tamaños de todas las secciones de que tiene datos NO inicializados.   

AddressOfEntryPoint (offset + 0x28)


Es un entero (4 bytes) que contiene el offset virtual donde comienza a ejecutar codigo. La direccion virtual seria este OEP + ImageBase. 

BaseOfCode (offset + 0x2C)


Es un entero (4 bytes) que contiene el offset virtual donde se va a alojar la sección de codigo. Para tener la direccion virtual hay que sumarle la ImageBase.  

BaseOfData (offset + 0x30)


Es un entero (4 bytes) que contiene el offset virtual donde se va a alojar la sección de datos. Para tener la direccion virtual hay que sumarle la ImageBase.

 

 

ImageBase (offset + 0x34)


Esta es la ImageBase de la que hablabamos en los 3 Itemos anteriores, Es un entero que contiene la direccion Virtual sobre la cual se va a cargar las secciones en memoria. Por eso de dice que es la Base, por que todos los  offset estan haciendo referencia a una direccion virtual empezando desde esa posicion.  

SectionAlignment (offset + 0x38) Al alojar memoria, se hace con un criterio, se reserva memoria de a "bloques", estos bloques deben ser multipos de este valor, generalmente es 0x1000. En pocas palabras cuando se reserva memoria se lo hace de a bloques de 0x1000 bytes. No importa si a la sección a cargar le va a sobrar espacio, se redonde a ese numero, siempre para arriba claro. FileAlignment (offset + 0x3C)

Igual que el Item anterior, solo que aca se habla sobre los bloques en el archivo, los datos estan agrupados por bloques de un tamaño "FileAlignment", y al cargarlos en memoria el SO respeta esta alineacion. Esto es muy importante a considerar cuando vamos a agregar una nueva sección, de tener en cuenta de que nuestros datos esten alineados en el archivo, de lo contrario no se van a cargar Correctamente en memoria.  
 

SizeOfImage (offset + 0x50)


Es un entero (4 bytes) que nos dice el tamaño de memoria virtual total que utiliza el archivo para luego volcar las secciones, es decir, la cantidad de memoria virtual que utilizara el archivo. Es otro de los valores que vamos a modificar al agregar una sección.


NumberOfRvaAndSizes (offset + 0x74)


Contiene el numero de "bloques de tablas" que hay en la cabecera opcional. El segundo "bloque" contiene informacion sobre donde se aloja en memoria virtual la Import Table, y el tamaño de ella. Este Bloque, si existe, esta en el offset 0x80 de la cabecera. Digo si existe por que si NumberOfRvaAndSizes es 0, ese "bloque" no queda definido. Al final de estos bloques, comienza a especificarse las secciones mediante una estructura de datos (IMAGE_SECTION_HEADER) que tiene un tamaño de 0x28 bytes, al final de esta comienza la proxima y asi hasta la ultima.   

Con un editor hexadecimal se ven facilmente el nombre de la sección, x ej  

".text", ".data", ".rcsc", "idata", etc.


A continuacion se describen los miembros mas importantes de la estructura (IMAGE_SECTION_HEADER) 

Ahora el offset es diferente al anterior, este corresponde a la direccion donde comienza la estructura que define a la sección.   

Name (offset + 0x00) (8 bytes)
Nombre corto de la sección, por ej ".code", ".data", el nombre es solo para identificar a la sección, no describre si esta es de codigo, de datos, etc, eso lo hace el miembro Characteristics de la estructura. (ver mas abajo).    

VirtualSize (offset + 0x08) (4 bytes)

VirtualAddress (offset + 0x0C) (4 bytes)
Es la direccion virtual que se reserva para cargar la sección.    

SizeOfRawData (offset + 0x10) (4 bytes) Tamaño que ocupa la sección en el archivo    

PointerToRawData (offset + 0x14) (4 bytes)
Direccion fisica que indica donde comienzan el contenido de la sección en el archivo. Recordar que esta direccion debe ser multiplo de FileAlignment, que generalmente es 0x200.    

Characteristics (offset + 0x24) (4 bytes)

En este miembro se indican las caracteristicas de la sección mediante flags. Si en la sección esta permitido escribir, leer, executar, si la sección es de codigo, datos inicializados, datos no inicializados, etc.

Fuentes

Manual "Peering Inside the PE"Enlaces Internos


Enlaces Internos

Ciencia de la Información


Crack Informático


Enlaces Externos 

foro.elhacker.net


msdn2.microsoft.com/en-us/library/ms680341.aspx