stringtranslate.com

Archivo COM

Varios archivos COM en IBM PC DOS 1.0

Un archivo COM es un tipo de archivo ejecutable simple . En los sistemas operativos VAX de Digital Equipment Corporation (DEC) de la década de 1970, se utilizó como extensión de nombre de archivo para archivos de texto que contenían comandos que se debían emitir al sistema operativo (similar a un archivo por lotes ). [1] Con la introducción de CP/M (un sistema operativo de microcomputadoras ) de Digital Research , el tipo de archivos comúnmente asociados con la extensión COM cambió al de archivos ejecutables. Esta convención se trasladó más tarde a DOS . Incluso cuando se complementó con el formato de archivo EXE más general para ejecutables, los archivos COM compactos siguieron siendo viables y se usaron con frecuencia en DOS. .COM

La .COMextensión del nombre del archivo no tiene relación con el nombre de dominio de Internet de nivel superior .com (que significa "comercial"). Sin embargo, esta similitud en el nombre ha sido explotada por los creadores de malware .

Formato binario DOS

El formato COM es el formato binario ejecutable original utilizado en CP/M (incluyendo SCP y MSX-DOS ) así como en DOS . Es muy simple; no tiene encabezado (con la excepción de los archivos CP/M 3), [2] y no contiene metadatos estándar , solo código y datos. Esta simplicidad tiene un precio: el binario tiene un tamaño máximo de 65.280 (FF00 h ) bytes (256 bytes menos que 64 KB) y almacena todo su código y datos en un segmento .

Como carece de información de reubicación , el sistema operativo lo carga en una dirección preestablecida, en el desplazamiento 0100h inmediatamente después del PSP , donde se ejecuta (de ahí la limitación del tamaño del ejecutable): el punto de entrada está fijado en 0100h. [nb 1] Esto no era un problema en las máquinas de 8 bits, ya que pueden abordar 64k de memoria como máximo, pero las máquinas de 16 bits tienen un espacio de direcciones mucho más grande, por lo que el formato cayó en desuso.

En la arquitectura de la CPU Intel 8080 , solo se podían direccionar 65.536 bytes de memoria (rango de direcciones de 0000h a FFFFh). Bajo CP/M, los primeros 256 bytes de esta memoria, de 0000h a 00FFh, estaban reservados para el uso del sistema por la página cero , y cualquier programa de usuario tenía que cargarse exactamente a las 0100h para ser ejecutado. [nb 1] Los archivos COM se ajustan perfectamente a este modelo. Antes de la introducción de MP/M y Concurrent CP/M , no había posibilidad de ejecutar más de un programa o comando a la vez: se ejecutaba el programa cargado a las 0100h, y ningún otro.

Aunque el formato de archivo es el mismo en DOS y CP/M, los archivos .COM de los dos sistemas operativos no son compatibles; los archivos COM de DOS contienen instrucciones x86 y posiblemente llamadas al sistema DOS , mientras que los archivos COM de CP/M contienen instrucciones 8080 y llamadas al sistema CP/M (los programas restringidos a ciertas máquinas también podrían contener instrucciones adicionales para 8085 o Z80 ).

Los archivos .COM en DOS establecen todos los registros de segmento x86 con el mismo valor y el registro SP (puntero de pila) en el desplazamiento de la última palabra disponible en el primer segmento de 64 KB (normalmente FFFEh) o el tamaño máximo de memoria disponible en el bloque en el que se carga el programa para ambos, el programa más al menos 256 bytes de pila, lo que sea más pequeño, por lo tanto, la pila comienza en la parte superior del segmento de memoria correspondiente y avanza hacia abajo desde allí. [3] [4]

En la API original de DOS 1.x , que era un derivado de la API CP/M, la terminación de un programa de un archivo .COM se realizaba llamando a la función INT 20h (Terminar programa) o bien a la función INT 21h Función 0, que cumplían la misma función, y el programador también tenía que asegurarse de que los registros de segmento de código y de datos contuvieran el mismo valor al finalizar el programa para evitar un posible fallo del sistema. Aunque esto se podía utilizar en cualquier versión de DOS, Microsoft recomendaba el uso de la función INT 21h Función 4Ch para la terminación de programas a partir de DOS 2.x, que no requería que el segmento de datos y de código se establecieran con el mismo valor.

Es posible crear un archivo .COM para que funcione en ambos sistemas operativos en forma de un binario completo . No existe una compatibilidad real a nivel de instrucciones; las instrucciones en el punto de entrada se eligen para que tengan la misma funcionalidad pero sean diferentes en ambos sistemas operativos, y hacen que la ejecución del programa salte a la sección del sistema operativo en uso. Básicamente, se trata de dos programas diferentes con la misma funcionalidad en un solo archivo, precedidos por un código que selecciona el que se va a utilizar.

En CP/M 3, si el primer byte de un archivo COM es C9h, hay un encabezado de 256 bytes; [2] dado que C9h corresponde a la instrucción 8080RET , esto significa que el archivo COM terminará inmediatamente si se ejecuta en una versión anterior de CP/M que no admita esta extensión. (Dado que los conjuntos de instrucciones del 8085 y Z80 son superconjuntos del conjunto de instrucciones del 8080, esto funciona en los tres procesadores). C9h es un código de operación no válido en el 8088/8086 y provocará una excepción de interrupción 6 generada por el procesador en modo v86 en los chips 386 y x86 posteriores. Dado que C9h es el código de operación para LEAVE desde el 80188/80186 y , por lo tanto, no se usa como la primera instrucción en un programa válido, el cargador ejecutable en algunas versiones de DOS rechaza los archivos COM que comienzan con C9h, evitando un bloqueo.

Los archivos pueden tener nombres que terminen en .COM, pero no estar en el formato simple descrito anteriormente; esto se indica mediante un número mágico al comienzo del archivo. Por ejemplo, el archivo COMMAND.COM en DR DOS 6.0 está en realidad en formato ejecutable DOS , lo que se indica mediante los dos primeros bytes que son MZ (4Dh 5Ah), las iniciales de Mark Zbikowski .

Programas grandes

En el sistema DOS no existe una gestión de memoria para los archivos COM por parte del cargador o del entorno de ejecución. Toda la memoria está simplemente disponible para el archivo COM. Después de la ejecución, se vuelve a cargar el shell de comandos del sistema operativo, COMMAND.COM . Esto deja la posibilidad de que el archivo COM sea muy simple, utilizando un solo segmento , o arbitrariamente complejo, proporcionando su propio sistema de gestión de memoria. Un ejemplo de un programa complejo es COMMAND.COM, el shell de DOS, que proporcionaba un cargador para cargar otros programas COM o EXE . En el sistema .COM, se pueden cargar y ejecutar programas más grandes (hasta el tamaño de memoria disponible), pero el cargador del sistema supone que todo el código y los datos están en el primer segmento, y depende del programa .COM proporcionar cualquier otra organización adicional. Los programas más grandes que la memoria disponible, o los segmentos de datos grandes , se pueden manejar mediante enlace dinámico , si el código necesario está incluido en el programa .COM. La ventaja de utilizar el formato .COM en lugar del .EXE es que la imagen binaria suele ser más pequeña y más fácil de programar utilizando un ensamblador . [5] Una vez que se dispuso de compiladores y enlazadores de suficiente potencia, ya no resultó ventajoso utilizar el formato .COM para programas complejos.

Soporte de plataforma

El formato todavía se puede ejecutar en muchas plataformas modernas basadas en Windows NT , pero se ejecuta en un subsistema de emulación de MS-DOS , NTVDM , que no está presente en las variantes de 64 bits . Los archivos COM también se pueden ejecutar en emuladores de DOS como DOSBox , en cualquier plataforma compatible con estos emuladores.

Úselo por razones de compatibilidad

Los sistemas operativos basados ​​en Windows NT utilizan la extensión .com para una pequeña cantidad de comandos heredados de la época de MS-DOS, aunque en realidad actualmente se implementan como archivos .exe . El sistema operativo reconocerá el encabezado del archivo .exe y los ejecutará correctamente a pesar de su extensión .com, técnicamente incorrecta. (De hecho, cualquier archivo .exe puede cambiarse de nombre a .com y seguir ejecutándose correctamente). El uso de las extensiones .com originales para estos comandos garantiza la compatibilidad con archivos por lotes DOS más antiguos que pueden hacer referencia a ellos con sus nombres de archivo originales completos. Estos comandos son CHCP, DISKCOMP, DISKCOPY, FORMAT, MODE, MOREy TREE. [6]

Preferencia de ejecución

En DOS, si un directorio contiene un archivo COM y un archivo EXE con el mismo nombre, cuando no se especifica ninguna extensión, se selecciona preferentemente el archivo COM para su ejecución. Por ejemplo, si un directorio en la ruta del sistema contiene dos archivos denominados foo.comy foo.exe, se ejecutaría lo siguiente foo.com:

C:\>foo

Un usuario que desee ejecutar foo.exepuede utilizar explícitamente el nombre de archivo completo:

C:\>foo.exe

Aprovechando este comportamiento predeterminado, los creadores de virus y otros programadores maliciosos han utilizado nombres como notepad.compara sus creaciones, con la esperanza de que si se colocan en el mismo directorio que el archivo EXE correspondiente, un comando o un archivo por lotes puedan activar accidentalmente su programa en lugar del editor de texto notepad.exe. Nuevamente, estos archivos .com pueden contener de hecho un ejecutable en formato .exe.

En Windows NT y derivados ( Windows 2000 , Windows XP , Windows Vista y Windows 7 ), la variable PATHEXT se utiliza para anular el orden de preferencia (y las extensiones aceptables) para llamar a archivos sin especificar la extensión desde la línea de comandos. El valor predeterminado aún coloca los archivos antes de los archivos. Esto se parece mucho a una característica que se encontraba anteriormente en la línea de procesadores de línea de comandos extendidos de JP Software 4DOS , 4OS2 y 4NT ..com.exe

Uso malintencionado de la extensión .com

Algunos creadores de virus informáticos han esperado aprovecharse de la probable falta de conocimiento de los usuarios de ordenadores modernos sobre la extensión de archivo .com y el formato binario asociado, junto con su mayor familiaridad con el nombre de dominio de Internet .com . Se han enviado correos electrónicos con nombres de archivos adjuntos similares a "www.example.com". Los usuarios incautos de Microsoft Windows que hacen clic en un archivo adjunto de este tipo esperan comenzar a navegar por un sitio llamado , pero en lugar de eso ejecutan el archivo de comando binario adjunto llamado , lo que le otorga pleno permiso para hacer en su máquina lo que su autor tenía en mente. [ cita requerida ]http://www.example.com/www.example

No hay nada malicioso en el formato de archivo COM en sí; esto es una explotación de la colisión de nombres coincidente entre los archivos de comando .com y los sitios web comerciales .com .

Véase también

Notas

  1. ^ ab En la mayoría de las versiones de CP/M , el inicio del TPA estaba en el offset +100h, solo precedido en memoria por la página cero en el offset +0h. Algunas versiones diferían por razones de hardware, incluyendo CP/M para el Heath H89 , donde comenzaba en el offset +4300h (para compatibilidad, existía una modificación de hardware de Magnolia Microsystems para mapear las ROM en +100h después del inicio), o CP/M para el TRS-80 Model I y TRS-80 Model III , donde los programas se cargaban en el offset +0h.

Referencias

  1. ^ Christian, Brian; Markson, Tom; Skrenta, Rich (eds.). "Sección 5.3". El libro de instrucciones del PDP-11 (Revisión 1 ed.). Archivado desde el original el 2018-08-01 . Consultado el 2018-08-01 .(NB. Tiene una referencia para el sistema operativo RT-11 que se ejecuta en la minicomputadora PDP-11 , que muestra en la sección 5.3 que .COM se utiliza para hacer referencia a un archivo de comando).
  2. ^ ab Elliott, John C.; Lopushinsky, Jim (2002) [1998-04-11]. "Encabezado de archivo COM CP/M 3". Seasip.info . Archivado desde el original el 2018-08-01.
  3. ^ Paul, Matthias R. (2002-10-07) [2000]. "Re: Ejecutar un archivo COM". Grupo de noticias : alt.msdos.programmer. Archivado desde el original el 2017-09-03 . Consultado el 2017-09-03 .[1] (NB. Tiene detalles sobre las convenciones de llamada del programa COM de DOS).
  4. ^ Lunt, Benjamin "Ben" D. (2020). "Registros de inicio de DOS .COM". Forever Young Software . Archivado desde el original el 2020-11-12 . Consultado el 2021-12-14 .
  5. ^ Scanlon, Leo J. (1991). "Capítulo 2". Subrutinas de lenguaje ensamblador para MS-DOS (2.ª edición). Windcrest Books. pág. 16. ISBN 0-8306-7649-X.
  6. ^ "Comandos de Windows". Microsoft. 26 de abril de 2023.

Enlaces externos