Archivos exe
Los programas .EXE es una extensión que se refiere a un archivo ejecutable de código reubicable y los programas.COM son es un tipo simple de fichero ejecutable EXE es la extensión de archivos que denota un archivo ejecutable (un programa) en los sistemas operativos MSDOS y Microsoft Windows. Una de las ventajas que tiene .EXE son dobles, nos permiten tener archivos reubicable y el uso de hasta cuatro segmentos (STACK, DATA, EXTRA y CODE) de hasta 64KBcada uno. Existen dos formas de crear un archivo de tipo EXE.
Una es usando un compilador que pueda crear este tipo de archivos. La otra forma es ensamblando un código fuente del lenguaje Assembler y luego enlazando el código objeto
Hay cuatro formatos de archivo tipo EXE principales:
Ejecutables en DOS: son los menos complejos y pueden funcionar en todos los sistemas operativos DOS y Windows. Ejecutables de 16-bits: no pueden funcionar en DOS pero pueden funcionar en todos los sistemas operativos de Windows. Ejecutables de 32-bits: pueden funcionar solamente en Windows 95 y superior. Ejecutables de 64-bits: pueden funcionar solamente en la sediciones de 64-bits de Microsoft Windows, tales como la edición 64-Bit de Windows XP o la edición 64Bits de Windows Server 2003.
Estructura de archivos exe Los ficheros EXE constan de una cabecera seguida de los segmentos definidos en el código fuente. Los datos de la cabecera son utilizados por el sistema operativo para realizar las inicializaciones necesarias para el correcto funcionamiento del programa, aunque dicha estructura no forma parte de la imagen final del programa en memoria. 1. Cabecera
El contenido de la cabecera de un fichero EXE es el siguiente:
Posición 0 (2 bytes): caracteres “MZ” o “ZM” identificativos del formato EXE.
Posición 2 (2 palabras): tamaño del fichero. La primera palabra es el número de bytes del último sector. La segunda palabra es el número de sectores que ocupa el fichero (cada sector ocupa 512 bytes). De esta forma, el tamaño del fichero en bytes se calcula como (nsectores-1)*512+nbytes. Posición 6 (1 palabra): número de reubicaciones a realizar. Esto es, número de referencias a segmentos reales que hay que modificar cuando el programa se cargue en memoria. Éste es el caso del segundo operando de la instrucción MOV AX, DATOS. DATOS. Las direcciones direcciones de dichas referencias referencias se se encuentran encuentran disponibles disponibles en la denominada tabla de reubicaciones, incluida en la cabecera de un fichero EXE. Posición 8 (1 palabra): tamaño de la cabecera en párrafos (1 párrafo = 16 bytes).
Posición 10 (1 palabra): mínima cantidad de memoria en párrafos requerida por el programa en adición a lo que ocupa en disco. Posición 12 (1 palabra): máxima cantidad de memoria requerida en párrafos. Posición 14 (2 palabras): valores iniciales de SS (primera palabra) y SP (segunda palabra). Posición 18 (1 palabra): palabra de comprobación. El DOS no suele utilizarla, de hecho la herramienta TLINK no la genera. Posición 20 (2 palabras): valores iniciales de CS (segunda palabra) e IP (primera palabra). Posición 24 (1 palabra): posición donde comienza la tabla de reubicación. Cada entrada de la tabla ocupa 4 bytes (desplazamiento y segmento) y contiene la dirección de las palabras a reubicar (a cada una hay que sumarle el valor de segmento en el que se cargue el programa). Posición 26 (1 palabra): número de overlay. Es 0 cuando se trata de un programa principal. Posición 28-61: valores desconocidos (dependientes del compilador).
2. Cuerpo
1. área de instrucciones Ejecutable En Windows, todos los segmentos de código residen en una sola sección llamada .text o .txt o el código. Dado que Windows utiliza un sistema de gestión de memoria virtual basada en páginas, teniendo una sección de código grandes es más fácil de manejar, tanto para el sistema operativo y el desarrollador de aplicaciones. Esta sección también contiene el punto de entrada (PE) y la tabla de saltos de procesador (si está presente), que apunta a la IAT. Nota:
EP es el punto de entrada desde donde empieza la sección de código en el archivo exe ofuscado. IAT: Representa la tabla de direcciones de importación, esto es una tabla de punteros de función rellenados por el gestor de ventanas como los archivos DLL se cargan.
2. Sección de Datos La sección .bss representa datos sin inicializar para la aplicación, incluyendo todas las variables declaradas como static dentro de un módulo de función y la fuente. La sección .rdata representa sólo lectura de datos, tales como cadenas literales, constantes y la información del directorio de depuración. Todas las demás variables (excepto variables automáticas, que aparecen en la pila) se almacenan en la sección .data. Estos son de aplicación o módulo de variables globales. 3. Sección de Recursos La sección .rsrc contiene información de recursos para un módulo. Hay muchos
editores de recursos disponibles en la actualidad que permite editar, añadir, eliminar, sustituir y recursos de la copia. 4. Exportación Sección de Datos La sección .edata contiene el directorio de exportación para una aplicación o DLL. Cuando está presente, esta sección contiene información sobre los nombres y direcciones de las funciones exportadas. 5. Sección de datos de importación La sección .idata contiene diversa información sobre las funciones importadas incluyendo la tabla de direcciones importación de directorios y de importación. La sección de importación contiene información acerca de todas las funciones importadas por el ejecutable a partir de DLL. Esta información se almacena en varias estructuras de datos. El más importante de estos son la importación de directorios y la importación de direcciones Tabla del que hablaremos a continuación. El cargador de Windows es responsable de cargar todos los archivos DLL que utiliza la aplicación y el mapeo de ellas en el espacio de direcciones del proceso. Se tiene que encontrar las direcciones de todas las funciones importadas en sus diversas DLL y ponerlos a disposición para que se carga el ejecutable. 6. Depurar Sección de Información La información de depuración se coloca inicialmente en la sección .debug. El formato de archivo PE también es compatible con archivos de depuración separados (normalmente identificados con una extensión .DBG) como un medio de recopilar información de depuración en una ubicación central. La sección de depuración contiene la información de depuración, pero los directorios de depuración viven en la sección .rdata se mencionó anteriormente. Cada uno de esos directorios referencias depurar la información en la sección .debug. 7. Sección de Base de Reubicación Por último, pero no menos la sección y lo más importante también para los hackers perspectiva. Cuando el enlazador crea un archivo EXE, se hace una suposición acerca de dónde la archivo será mapeado en memoria. En base a esto, el enlazador pone las direcciones reales de los elementos de código y datos en el archivo ejecutable. Si por cualquier razón el ejecutable termina siendo cargado en otra parte del espacio de direcciones virtuales, las direcciones del enlazador enchufado en la imagen están equivocados. La información almacenada en la sección .reloc permite al gestor de PE para fijar estas direcciones en la imagen cargada para que sean correctos de nuevo. Por otro lado, si el cargador fue capaz
de cargar el archivo en la dirección base asumido por el enlazador, los datos de la sección .reloc no es necesario y se ignora. https://www.hackingloops.com/reverse-engineering-tutorial-3-exe-file-structure/ http://www.idea2ic.com/File_Formats/DOS EXE File Structure.pdf