Articulo de referencia

Ejecutable portátil

[[.exe]] , .com , [[Dynamic-link library|.dll]] , [[.sys]] , .acm , .ax , .cpl , .drv , .efi , .ime , .mui , .ocx , .scr , .tsp , .msstyles "},"mime":{"wt":"application/vnd.micr...

Portable Executable ( PE ) es un formato de archivo para código ejecutable nativo en sistemas operativos Windows de 32 y 64 bits , así como en entornos UEFI . [ 2 ] Se utiliza para ejecutables nativos ( .exe , .com ), bibliotecas de vínculos dinámicos ( .dll , .ocx ), controladores del sistema ( .sys , .drv ) y muchos otros tipos de archivos. El formato PE admite el almacenamiento de los datos necesarios para cargar e iniciar un proceso del sistema operativo , incluidas referencias a bibliotecas de vínculos dinámicos , tablas para importar y exportar funciones de la interfaz de programación de aplicaciones (API), datos de administración de recursos e información de almacenamiento local de subprocesos (TLS).

Según la especificación de la Interfaz de Firmware Extensible Unificada (UEFI) , el formato PE también es el estándar aceptado para ejecutables en entornos EFI. [ 3 ] En sistemas Windows NT, actualmente admite una variedad de conjuntos de instrucciones , incluidos IA-32 , x86-64 (AMD64/Intel 64), IA-64 , ARM y ARM64 . Antes de la llegada de Windows 2000 , Windows NT (y por extensión el formato PE) también admitía las arquitecturas MIPS , Alpha y PowerPC . Además, gracias a su uso en Windows CE , PE ha mantenido la compatibilidad con varias variantes de MIPS, ARM (incluido Thumb ) y SuperH . [ 4 ]

Funcionalmente, el formato PE es similar a otros formatos ejecutables específicos de la plataforma, como el formato ELF utilizado en Linux y la mayoría de los sistemas tipo Unix , y el formato Mach-O que se encuentra en macOS e iOS .

Historia

Microsoft introdujo por primera vez el formato PE con Windows NT 3.1 , reemplazando el formato anterior de 16 bits New Executable (NE). Poco después, Windows 95, 98, ME y la extensión Win32s para Windows 3.1x adoptaron la estructura PE. Cada archivo PE incluye un encabezado ejecutable de DOS, que generalmente muestra el mensaje "Este programa no se puede ejecutar en modo DOS". Sin embargo, esta sección de DOS se puede reemplazar por un programa de DOS completamente funcional, como se demuestra en el instalador de Windows 98 SE. Los desarrolladores pueden agregar dicho programa usando el /STUBmodificador con el enlazador de Microsoft, creando así un binario de gran capacidad . [ 5 ]

Con el tiempo, el formato PE ha evolucionado junto con la plataforma Windows. Entre las extensiones más destacadas se incluyen el formato .NET PE para código administrado , PE32+ para compatibilidad con espacios de direcciones de 64 bits y una versión especializada para Windows CE .

Para determinar si un archivo PE está destinado a arquitecturas de 32 o 64 bits, se puede examinar el campo Machine en IMAGE_FILE_HEADER. [ 6 ] Los valores comunes de machine son 0x014cpara procesadores Intel de 32 bits y 0x8664para procesadores x64. Además, el campo Magic en IMAGE_OPTIONAL_HEADERrevela si las direcciones son de 32 o 64 bits. Un valor de 0x10Bindica un archivo de 32 bits (PE32), mientras que 0x20Bindica un archivo de 64 bits (PE32+). [ 7 ]

Detalles técnicos

Disposición

Estructura de un ejecutable portátil de 32 bits

Un archivo PE consta de varias cabeceras y secciones que indican al enlazador dinámico cómo asignar el archivo a la memoria. Una imagen ejecutable consta de varias regiones diferentes, cada una de las cuales requiere distintos atributos de protección de memoria . Para garantizar una alineación correcta, el inicio de cada sección debe alinearse con un límite de página. [ 8 ] Por ejemplo, la sección .text , que contiene el código del programa, se asigna normalmente como de solo lectura/ejecución. Por el contrario, la sección .data , que contiene variables globales, se asigna como de lectura/escritura sin ejecución. Sin embargo, para ahorrar espacio, las secciones no se alinean en el disco de esta manera. El enlazador dinámico asigna cada sección a la memoria individualmente y asigna los permisos correctos en función de la información de las cabeceras. [ 9 ]

Tabla de importación

La tabla de direcciones de importación (IAT) se utiliza como tabla de búsqueda cuando la aplicación llama a una función en un módulo diferente. Las importaciones se pueden especificar por ordinal o por nombre. Dado que un programa compilado no puede conocer de antemano las ubicaciones de memoria de sus bibliotecas dependientes, es necesario un salto indirecto para las llamadas a la API. A medida que el enlazador dinámico almacena los módulos y resuelve las dependencias, rellena las ranuras de la IAT con las direcciones reales de las funciones de biblioteca correspondientes. Aunque esto añade un salto adicional, lo que conlleva una penalización de rendimiento en comparación con las llamadas intermodulares, minimiza el número de páginas de memoria que requieren cambios de copia en escritura , conservando así memoria y E/S de disco. Si se sabe de antemano que una llamada es intermodular (si lo indica un atributo dllimport ), el compilador puede generar código optimizado con un simple código de operación de llamada indirecta . [ 9 ]

Aleatorización del diseño del espacio de direcciones (ASLR)

Los sistemas operativos modernos utilizan la aleatorización del espacio de direcciones (ASLR), un proceso que hace que la disposición en memoria de un archivo PE sea impredecible y, por lo tanto, más difícil de explotar. Durante la ASLR, el cargador aleatoriza las direcciones virtuales donde residen los componentes clave. Esto incluye la base del ejecutable, las bibliotecas compartidas , el montón y la pila . La mayoría de los archivos PE no son independientes de la posición porque los compiladores convencionales generan algunas referencias absolutas relativas a una base supuesta. Para lidiar con la rebase aleatoria, el enlazador almacena una tabla .reloc que permite al cargador ajustar esas referencias en el momento de la carga.

.NET, metadatos y el formato PE

En un ejecutable .NET, la sección de código PE contiene un fragmento que invoca la entrada de inicio de la máquina virtual CLR , _CorExeMaino _CorDllMainen mscoree.dll, de forma muy similar a como ocurría en los ejecutables de Visual Basic . La máquina virtual entonces utiliza los metadatos .NET presentes, cuya raíz, IMAGE_COR20_HEADER(también llamada "encabezado CLR"), es apuntada por IMAGE_DIRECTORY_ENTRY_COMHEADERla entrada (la entrada se utilizaba anteriormente para metadatos COM+ en aplicaciones COM+, de ahí el nombre ) en el directorio de datos del encabezado PE. se asemeja mucho al encabezado opcional de PE, desempeñando esencialmente su función para el cargador CLR. [ 4 ]IMAGE_COR20_HEADER

Los datos relacionados con CLR, incluida la estructura raíz, suelen estar contenidos en la sección de código común .text. Esta se compone de varios directorios: metadatos, recursos incrustados, nombres seguros y algunos para la interoperabilidad con código nativo. El directorio de metadatos es un conjunto de tablas que enumeran todas las entidades .NET distintas en el ensamblado, incluidos tipos, métodos, campos, constantes, eventos, así como referencias entre ellos y a otros ensamblados.

Uso en otros sistemas operativos

El formato PE también lo utiliza ReactOS , un sistema operativo de código abierto creado para ser compatible binariamente con Windows. Históricamente, también lo han utilizado otros sistemas operativos como SkyOS y BeOS R3. Sin embargo, tanto SkyOS como BeOS finalmente migraron a ELF .

La plataforma de desarrollo Mono , que pretende ser compatible a nivel binario con Microsoft .NET Framework , utiliza el mismo formato PE que la implementación de Microsoft. Lo mismo ocurre con .NET Core, la propia plataforma multiplataforma de Microsoft .

En sistemas operativos tipo Unix x86 (-64) , los binarios de Windows (en formato PE) se pueden ejecutar usando Wine . El HX DOS Extender también usa el formato PE para binarios nativos de DOS de 32 bits y puede ejecutar algunos binarios de Windows en DOS, actuando así como un equivalente de Wine para DOS.

Mac OS X 10.5 tiene la capacidad de cargar y analizar archivos PE, aunque no mantiene la compatibilidad binaria con Windows. [ 10 ]

UEFI y el firmware UEFI utilizan archivos PE, así como la ABI relacionada con la plataforma y la convención de llamada (ABI x64 para dispositivos PC típicos) para las aplicaciones .

Véase también

Referencias

  1. Andersson, Henrik (23-04-2015). "application/vnd.microsoft.portable-executable" . IANA . Consultado el 26-03-2017 .
  2. "Ejecutable portátil (PE) - Definición - Trend Micro IN" . www.trendmicro.com . Consultado el 10 de noviembre de 2022 .
  3. "Especificación UEFI, versión 2.8B" (PDF) .En una nota en la página 15, se indica que "este tipo de imagen se elige para permitir que las imágenes UEFI contengan instrucciones Thumb y Thumb2, al tiempo que se define que las interfaces EFI estén en modo ARM".
  4. 1 2 "Formato PE (Windows)" . Recuperado el 21-10-2017 .
  5. "/STUB (Nombre del archivo stub de MS-DOS)" . 3 de agosto de 2021.
  6. Truco de PE explicado: Cómo distinguir entre 32 y 64 bits a simple vista por Karsten Hahn
  7. Formato PE en Microsoft.com
  8. "El archivo ejecutable portátil de arriba a abajo" . Archivado del original el 20/10/2017 . Consultado el 21/10/2017 .
  9. 1 2 "Echando un vistazo al interior del PE: Un recorrido por el archivo ejecutable portátil de Win32" . 30 de junio de 2010. Recuperado el 21 de octubre de 2017 .
  10. Chartier, David (30 de noviembre de 2007). "Descubierto: Evidencia de que Mac OS X podría ejecutar aplicaciones de Windows pronto" . Ars Technica . Recuperado el 3 de diciembre de 2007. ... Steven Edwards describe el descubrimiento de que Leopard aparentemente contiene un cargador no documentado para ejecutables portátiles, un tipo de archivo utilizado en versiones de 32 y 64 bits de Windows. Una investigación más profunda reveló que el propio cargador de Leopard intenta encontrar archivos DLL de Windows cuando intenta cargar un binario de Windows. 
  • Formato PE (documento en línea más reciente, sujeto a cambios)
  • Especificación del formato de archivo ejecutable portátil y de objeto común de Microsoft. Revisión 11.0, enero de 2017 ; Revisión 10.0, junio de 2016 ; Revisión 8.3, febrero de 2013 ; Revisión 8.2, septiembre de 2010 ; Revisión 8.1, febrero de 2008 ; Revisión 8.0, mayo de 2006 ; Revisión 6.0, febrero de 1999 ; Revisión 5.0, octubre de 1997 ; Revisión 4.1, agosto de 1994 ; Revisión 4.0, septiembre de 1993
  • Especificaciones de formato del estándar de interfaz de herramientas (TIS) para Windows, versión 1.0 (Número de pedido de Intel 241597, Comité TIS, febrero de 1993)
  • Formato ejecutable portátil (Michael J. O'Leary, Soporte para desarrolladores de Microsoft)
  • Echando un vistazo al interior del PE: Un recorrido por el formato de archivo ejecutable portátil Win32 . Matt Pietrek , Microsoft Systems Journal, marzo de 1994.
  • Un análisis exhaustivo del formato de archivo ejecutable portátil Win32. Matt Pietrek , revista MSDN . Parte I, febrero de 2002 ; Parte II, marzo de 2002.
  • El formato de archivo .NET por Daniel Pistelli
  • Blog de Ero Carrera que describe el encabezado PE y cómo recorrerlo.
  • PE Internals ofrece una manera sencilla de aprender el formato de archivo ejecutable portátil.
  • Explorador PE