source sierra mac for code c++ delphi winapi compression upx

c++ - sierra - upx for mac



¿Hay algún inconveniente en usar UPX para comprimir un ejecutable de Windows? (12)

He usado UPX antes para reducir el tamaño de mis ejecutables de Windows, pero debo admitir que soy ingenuo ante cualquier efecto secundario negativo que pueda tener. ¿Cuál es la desventaja de todo este embalaje / desembalaje?

¿Hay escenarios en los que alguien recomiende NO UPX-ing de un ejecutable (por ejemplo, al escribir un archivo DLL, servicio de Windows o cuando se dirige a Vista o Win7)? Escribo la mayor parte de mi código en Delphi, pero también he usado UPX para comprimir ejecutables C / C ++.

En una nota lateral, no estoy ejecutando UPX en algún intento de proteger mi exe de desmontadores, solo para reducir el tamaño del ejecutable y evitar la manipulación superficial.


La razón es que hay desventajas al uso de compresores EXE. Más destacado:

Tras el inicio de un archivo EXE / DLL comprimido, todo el código se descomprime de la imagen de disco en memoria en una pasada, lo que puede causar agitación del disco si el sistema tiene poca memoria y se ve forzado a acceder al archivo de intercambio. Por el contrario, con EXE / DLL sin comprimir, el sistema operativo asigna memoria para páginas de códigos bajo demanda (es decir, cuando se ejecutan).

Múltiples instancias de un EXE / DLL comprimido crean múltiples instancias del código en la memoria. Si tiene un EXE comprimido que contiene 1 MB de código (antes de la compresión) y el usuario inicia 5 instancias del mismo, se desperdicia aproximadamente 4 MB de memoria. Del mismo modo, si tiene una DLL que es de 1 MB y es utilizada por 5 aplicaciones en ejecución, se desperdicia aproximadamente 4 MB de memoria. Con EXE / DLL sin comprimir, el código solo se almacena en la memoria una vez y se comparte entre las instancias.

http://www.jrsoftware.org/striprlc.php#execomp


Creo que existe la posibilidad de que no funcione en las computadoras que tienen DEP (Prevención de ejecución de datos) activada.


El único momento importante es el tamaño durante la descarga de Internet. Si está usando UPX, en realidad obtiene un rendimiento peor que si usa 7-zip (basado en mi prueba, 7-Zip es dos veces mejor que UPX). Luego, cuando se deja comprimido en la computadora de destino, su rendimiento disminuye (consulte la respuesta de Lars). Entonces, UPX no es una buena solución para el tamaño del archivo. Solo 7zip todo el asunto.

En cuanto a prevenir la manipulación, también es un FALLO . UPX también admite la descompresión. Si alguien quiere modificar el EXE, verá que se comprime con UPX y luego lo descomprime. El porcentaje de posibles crackers que puede ralentizar no justifica el esfuerzo y la pérdida de rendimiento.

Una mejor solución sería usar la firma binaria o al menos solo un hash. Un sistema simple de verificación de hash consiste en tomar un hash de su código binario y un valor secreto (generalmente un guid). Solo su EXE conoce el valor secreto, por lo que cuando vuelve a calcular el hash para la verificación, puede volver a usarlo. Esto no es perfecto (se puede recuperar el valor secreto). La situación ideal sería usar un certificado y una firma.


El tamaño final del ejecutable en el disco es en gran medida irrelevante en estos días. Su programa puede cargar unos milisegundos más rápido, pero una vez que comienza a funcionar, la diferencia es indistinguible.

Algunas personas pueden ser más sospechosas de su ejecutable simplemente porque está comprimido con UPX. Dependiendo de sus usuarios finales, esto puede o no ser una consideración importante.


En mi humilde opinión, UPXing no tiene sentido, pero las razones se deletrearon anteriormente, en su mayoría, la memoria es más costosa que el disco.

Erik: el tope LZMA podría ser más grande. Incluso si el algoritmo es mejor, no siempre es una ventaja neta.


Hay tres inconvenientes:

  1. Todo el código estará completamente descomprimido en la memoria virtual, mientras que en un archivo EXE o DLL normal, solo el código realmente utilizado se carga en la memoria. Esto es especialmente relevante si solo se usa una pequeña porción del código en su EXE / DLL en cada ejecución.
  2. Si hay varias instancias de ejecución de DLL y EXE, su código no se puede compartir entre las instancias, por lo que utilizará más memoria.
  3. Si su EXE / DLL ya está en caché, o en un medio de almacenamiento muy rápido, o si la CPU que está ejecutando es lenta, experimentará una velocidad de inicio reducida ya que la descompresión tendrá que tener lugar, y no lo hará se beneficia del tamaño reducido. Esto es especialmente cierto para un EXE que se invocará varias veces repetidamente.

Por lo tanto, los inconvenientes anteriores son más un problema si su EXE o DLL contiene muchos recursos, pero de lo contrario, pueden no ser un factor importante en la práctica, dado el tamaño relativo de los ejecutables y la memoria disponible, a menos que esté hablando de archivos DLL utilizado por muchos ejecutables (como DLL de sistema).

Para disipar información incorrecta en otras respuestas:

  • UPX no afectará su capacidad para ejecutar en máquinas protegidas por DEP.
  • UPX no afectará la capacidad del software antivirus principal, ya que son compatibles con ejecutables UPX comprimidos (así como con otros formatos de compresión ejecutables).
  • UPX ha podido usar la compresión LZMA desde hace un tiempo (algoritmo de compresión 7zip), usa el interruptor --lzma.

La última vez que traté de usarlo en un ensamblado administrado, lo dañó tanto que el tiempo de ejecución se negó a cargarlo. Es el único momento en el que puedo pensar que no querrías usarlo (y, en realidad, ha pasado tanto tiempo desde que lo intenté que la situación puede ser incluso mejor ahora). Lo he usado extensamente en el pasado en todo tipo de binarios no administrados, y nunca tuve un problema.


La razón por la cual UPX tiene tantas falsas alarmas es porque su licencia abierta permite que los autores de malware la usen y modifiquen impunemente. Por supuesto, este problema es inherente a la industria, pero lamentablemente el gran proyecto UPX está plagado de este problema.

ACTUALIZACIÓN: tenga en cuenta que a medida que se complete el proyecto Taggant, se mejorará la capacidad de utilizar UPX (o cualquier otra cosa) sin causar falsos positivos, suponiendo que UPX lo admita.


Los escáneres de virus que buscan virus "desconocidos" pueden indicar que los ejecutables comprimidos UPX tienen un virus. Me han dicho que esto se debe a que varios virus usan UPX para ocultarse. He usado UPX en el software y McAfee marcará que el archivo tiene un virus.


Me sorprende que esto no se haya mencionado aún, pero el uso de ejecutables repletos de UPX también aumenta el riesgo de producir falsos positivos del software antivirus heurístico porque, estadísticamente, muchos programas maliciosos también usan UPX.


No hay inconvenientes.

Pero solo para tu información, existe una idea falsa muy común con respecto a UPX como--

los recursos NO son solo comprimidos

Esencialmente estás construyendo un nuevo ejecutable que tiene un deber "cargador" y el ejecutable "real", bueno, está siendo seccionado y comprimido, colocado como un recurso de datos binarios del ejecutable del cargador (independientemente de los tipos de recursos que estaban en el ejecutable original).

El uso de métodos y tools ingeniería inversa, ya sea para fines educativos u otros, le mostrará la información relativa al "ejecutable del cargador", y no la información variable con respecto al ejecutable original.


Si su único interés es disminuir el tamaño de los archivos ejecutables, ¿ha intentado comparar el tamaño del ejecutable con y sin paquetes de tiempo de ejecución? De acuerdo, también deberá incluir los tamaños de los paquetes en general junto con su ejecutable, pero si tiene varios archivos ejecutables que usan los mismos paquetes base, entonces sus ahorros serían bastante altos.

Otra cosa a considerar serían los gráficos / glifos que usa en su programa. Puede ahorrar bastante espacio al consolidarlos en una única lista de Timage incluida en un módulo de datos global en lugar de repetirlos en cada formulario. Creo que cada imagen se almacena en el recurso de forma como hexadecimal, lo que significa que cada byte ocupa dos bytes ... puede reducirlo un poco cargando la imagen de un recurso RCData utilizando un TResourceStream.