c++ windows process

c++ - Windows EXE/DLL: qué es una "imagen empaquetada"



process (1)

Process Explorer a veces muestra un EXE como "imagen empaquetada", pero ¿qué significa?

Lo que descubrí es que: compilar un exe (usando Visual C ++ 2010) con la opción /ZI da como resultado una imagen empaquetada, pero /Zi no lo hace. ¿Por qué tal diferencia?

Por cierto: una DLL compilada con /ZI también se considera "imagen empaquetada" y marcada de color púrpura.


Una "imagen empaquetada" es una en la que el código ejecutable se comprime con la intención de reducir el tamaño del archivo. La reducción típica del tamaño del archivo ronda el 50%. Utiliza un "cargador" en tiempo de ejecución para descomprimir los datos a código ejecutable antes de que comience a ejecutarse. Fue útil en los viejos tiempos con capacidad limitada de almacenamiento en disco y ancho de banda de red limitado.

Hoy en día, con los discos de terabyte y las redes de megabit es un olor, el embalaje también se puede explotar para ocultar código malicioso. Seguramente la razón por la cual Process Explorer lo colorea de manera diferente.

La heurística exacta que utiliza PE para detectar el embalaje no está documentada. Por supuesto que no, eso haría que sea demasiado fácil de eludir. No es trivial, no hay una forma estándar de implementar el embalaje. Aproximadamente, miraría las secciones en el archivo ejecutable y aumentaría la Bandera Azul cuando una gran parte de ella pareciera un código no ejecutable.

Y sí, cuando usas / ZI habrá mucho. Más significativa es la opción del enlazador / INCREMENTAL, que se enciende automáticamente cuando usa / ZI. Lo cual le permite escribir código mientras depura, la opción Editar + Continuar. Y vuelva a vincular rápidamente el archivo ejecutable sin que el vinculador tenga que volver a generar el archivo por completo. Esto solo puede funcionar cuando hay mucho espacio vacío en el archivo ejecutable, disponible para agregar nuevos bytes de código de máquina. Esa es una Bandera Azul.

No es una preocupación real, por supuesto, su usuario solo verá la versión Release de su programa. Que está construido sin / ZI y sin / INCREMENTAL.