¿Que es el formato PE?
Si echamos un vistazo a la Wikipedia nos dice lo siguiente:
The Portable Executable (PE) format is a file format for executables, object code, and DLLs, used in 32-bit and 64-bit versions of Windows operating systems. The term "portable" refers to the format's portability across all 32-bit (and by extension 64-bit) Windows operating systems. The PE format is basically a data structure that encapsulates the information necessary for the Windows OS loader to manage the wrapped executable code. This includes dynamic library references for linking, API export and import tables, resource management data and thread-local storage (TLS) data. On NT operating systems, the PE format is used for EXE, DLL, OBJ, SYS (device driver), and other file types.
Como casi todo lo bueno que hay por internet esta en ingles, "in spanish" hay poca cosa...
http://www.perantivirus.com/sosvirus/pregunta/portable.htmEl archivo "por excelencia" es el siguiente:
http://www.microsoft.com/whdc/system/platform/firmware/PECOFF.mspxEchenle una buena ojeada y luego continuen con este texto
Bien, antes de empezar a explicar las partes mas importantes que vamos a tocar les dire las herramientas necesarias para hacer las practicas. Son 4:
- OllyDbg: Para mi el mejor debugger que hay a ring 3, lo vamos a necesitar bastante
- Hex Workshop: o cualquier otro editor hexadecimal
- PEiD: para ver unas cuantas cosas.
- Dumpbin: Esta en la carpeta del VC++, se lo subire por si alguien no lo tiene.
Bien, abrimos un exe cualquiera y las 2 priemras "letras" que encontramos es MZ, que significa eso?? pues es una marca que indica que es un archivo DOS. Esas marcas vienen de Mark Zbikowski, uno de los creadores del MS-DOS.
Despues, no nos interesa nada mas, hasta llegar aqui:
PE..L
Bien, ese PE es la marca del formato PE, es donde se inicia la lectura.
Los primeros bytes que le siguien son 4C01 si lo leen desde el editor hexadecimal, pero recuerden que estamos en un Endian (para mas info sobre eso busquen en la Wiki), asi que el numero real es 14C, que es para indicar que este archivo correra sobre un i386. Justo después de ese numero hay otro numero, en mi caso, en un archivo de VB habrá el numero 3, que indica el numero de secciones que contiene el archivo.
Siguiendo este numero le toca el turno de otro numero de 4 bytes, que indica la fecha en que fue creado, ese numero es simplemente una anecdota, ya que no nos sirve.
En el offset nº CC tenemos otro numero que nos interesa, que en mi caso es E0, que es el tamaño del Optional Header (o cabecera opcional).
Bueno, ahora ya no nos interesa nada mas de aqui, vamonos al Optional Header.
Esta situado en D0, y lo primero que nos encontramos es lo siguiente: 0B01 en Endian, lo que equivale a 10B en Hexa. Este es el Magic Number, es una mera anecdota, ya que tampoco lo vamos a tocar.
A partir de ahora no voy a explicarlo tanto, les dire lo que es, en que dirección y cuanto ocupa
- En el offset D2 tenemos la version del Linker (2 bytes = 0600)
- En D4 tenemos el Tamaño del codigo de 2 bytes
- En E0 tenemos el RVA o lo que es lo mismo, el Entry Point, de 2b
- En EE tenemos la Imagen Base que suele ser 40000, es la posición de memoria donse se empeiza a cargar (Como curiosidad les dire que si cambian ese dato a 5000 por ejemplo algunos antivirus no detectaran lagunos archivos que sean sospechosos xDDD)
- En F0 tenemos la alineación de la sección (Esto es importante, ya lo verenos)
- En F4 tenemos la alineación del archivo
- En 108 tenemos el tamaño de la imagen, tambien es immportante si tenemos que inyectar codigo
- En 10C tenemos el tamaño de las cabeceras
Bueno, hasta aqui lo mas "importante", quedan otras cosas como donde esta la IAT y cosas de esas que lo explicare con un log del dumpbin delante

Ahora explicare las partes de las que se compone una sección en la cabecera (ya que se declara hay).
Nos vamos en donde dice .text (sección de codigo ejecutable, todo el codigo de los programas suele estar en esta sección, mucha gente cree que todo el codigo que hay por debajo de la cabecera es ejecutable, y no es así.). En el editor nos vamos hay y empezare a explicar.
Vemos lo siguiente en la parte del texto:
.text............................... ..`
Lo que equivale en hexa a esto:
2E74657874000000FC0E000000100000001000000010000000000000000000000000000020000060
Paso a explicar eso
- Lo que esta en Rojo: Es el nombre de .text en hexa
- Lo que esta en Azul: Es el tamaño virtual
- Lo que esta en Rosa: Es la dirección virtual
- Lo que esta en Verde: Es el tamaño de los datos
- Lo que esta en Naranja: Es el "file pointer to raw data"
- Lo que esta en Púrpura: Que en Hexa es 60000020 son los flags, que indican que es una sección de codigo, que es ejecutable y que se puede leer.
Si lo metemos en el Olly, esta sección empeiza en 00401000 (el 004 es del 400000 que dije antes que si lo cambiabas los AV's no lo pillaban, y el 1000 de la dirección Virtual) y termina en 00401EF0 (este EFO es el del tamaño virtual).
Hay que andar con ojo con eso, no vayamos a meter dos secciones en el mismo espacio (evidentemente nos daria error antes de iniciar

).
Creo que hasta aqui ya vale, no me quiero adelantar, asi que solo les dire que al final de esta sección se encuentra la IAT.
En en próximo capítulo vamos a cmabiar el entry point y a meter algunos opcodes para hacer pequeños experimentos como un loop infinito o algunas cosas de estas

Como tarea (si la quieren hacer) es que carguen elgun programa con el olly y miren que efectivamente, el entry point nos dice que esta en 117C y el olly carga en 0040117C (recuerden que se carga en la memoria virtual, y por eso deben de agregarle el 0040 delante o lo que haya en la dirección EE del archivo.
Me despido, Un Saludo
Edit:
Se me olvidó subir el Dumpbin.
jueguen un rato con este archivo, es bastante interesate.
Si quieren sacar un log completo hagan lo siguiente:
dumpbin /all archivo.exe > log.txt
Si quieren ver solamente las cabeceras:
dumpbin /headers archivo.exe
Hay muchas otras opciones.