¿Cómo puedo comparar el contenido de dos (o más) archivos MSI?

Resuelto Stein Åsmul asked hace 6 años • 1 respuestas

¿Cómo puedo hacer una " comparación de contenido " de dos (o más) archivos MSI y ver qué es realmente diferente dentro de los archivos, en lugar de hacer una comparación binaria inútil ? (que obviamente sólo me dice si estoy tratando con copias del mismo archivo o no).

Algunos escenarios de problemas típicos y relevantes :

  • Nuestro sistema de compilación escupe archivos MSI como locos y, a veces, necesitamos descubrir qué diferencias existen entre diferentes archivos MSI (léase: algo cambió y ahora estamos fallando en la implementación).
  • Tenemos archivos MSI compilados de las mismas fuentes en diferentes ubicaciones y algunos de ellos no ejecutan el informe System.BadImageFormatException : ¿cómo podemos depurar cuáles son las diferencias en los archivos MSI? (una respuesta que trata este error específicamente aquí: ¿ Las aplicaciones dependen del entorno donde se compilaron? ).
  • Los archivos MSI se pueden compilar con todo tipo de herramientas, pero para los usuarios de stackoverflow, estos archivos probablemente se crean más comúnmente usando WiX o Visual Studio Installer Projects (kits de herramientas gratuitos).

Esta es una pregunta de estilo Q/A sobre el tema de comparar sus archivos MSI compilados para determinar qué "diferencias de contenido" reales existen.

Stein Åsmul avatar Jan 28 '18 09:01 Stein Åsmul
Aceptado

Microsoft Orca : si tiene Visual Studio instalado, intente buscarlo enOrca-x86_en-us.msieProgram Files (x86)instalarlo. Luego busca Orca en el menú de inicio.

  • Trayectoria de corriente :C:\Program Files (x86)\Windows Kits\10\bin\10.0.17763.0\x86
  • Cambie los números de versión según corresponda

About MSI Files

En términos generales, los archivos MSI son archivos de almacenamiento estructurados COM , esencialmente un sistema de archivos dentro de un archivo, con flujos de contenido diferente, uno de los cuales es una base de datos SQL Server simplificada (creo que en los términos más genéricos). Siempre que los archivos MSI sean legibles, se puede comparar el contenido (de varios formatos y tipos).

Nota técnica : es posible que un MSI que activa un System.BadImageFormatExceptionsimplemente no se pueda ejecutar ( msiexec.exeno se puede ejecutar), pero aún puede ser legible y, por lo tanto, comparable (agregue un comentario para verificar esto si lo experimenta).

Secuencias : algunas secuencias en el MSI son tablas con valores de cadena. También puede haber transmisiones para archivos cab integrados que se utilizan para almacenar archivos para implementar y tablas con contenido binario únicamente, como aquellas Binary tabledonde se almacenan acciones personalizadas compiladas y no compiladas junto con otro contenido binario que la configuración necesita. Y hay una " secuencia de resumen " especial y una tabla con íconos almacenados en su formato binario nativo, y la lista continúa... Para la mayoría de las tablas, podemos comparar las cadenas en cada tabla de manera muy similar a como comparamos texto en un documento de Word (que también solían ser archivos OLE/COM , aunque las versiones más nuevas ahora usan Open Office XML ) y obtenga un informe detallado de las diferencias. Para hacer esto, obviamente necesita una herramienta especial para el trabajo, una capaz de encontrar su camino a través de todas las corrientes relevantes. A continuación se enumeran algunas herramientas comerciales y gratuitas para esto.

Contenido binario : antes de desarrollar esto, debo tener en cuenta que comparar contenido en Binary Table, Cabs Table, Icon Table- o cualquier otra tabla binaria generalmente le permitirá una comparación binaria únicamente (particularmente para archivos dll y exe de acción personalizada compilados). Las acciones personalizadas de script (en la tabla binaria) se pueden comparar como texto, pero las acciones personalizadas compiladas son solo de comparación binaria. Entonces, si su problema surge de una acción personalizada compilada, realmente no puede verlo en una comparación directa (solo ve la diferencia binaria). Debe acceder a su sistema de control de código fuente para ver qué código se usó para acciones personalizadas compiladas de cualquier tipo ; con suerte, tiene una buena práctica de etiquetas para poder encontrar el código fuente real utilizado en cada configuración. No uso esta práctica, pero para versiones corporativas internas, tal vez incluso pueda incluir su dll de compilación de depuración para su acción personalizada compilada e intentar adjuntar el depurador al código en ejecución para descubrir realmente qué está pasando. Sin embargo, no usaría una dll en modo de depuración para una versión pública, a menos que hubiera aclarado algún riesgo. El código de depuración puede estar plagado de cuadros de mensajes de depuración (inesperados) (utilizados como puntos de entrada para conectar el depurador) y otros problemas que nunca deberían afectar a un paquete de producción.

Ahora que lo pienso, sus archivos cab y archivos de íconos definitivamente se pueden comparar con sus versiones correspondientes en archivos MSI más antiguos (o más nuevos) utilizando la técnica para descompilar archivos MSI dark.exeque se describe a continuación. Luego, utilizando una buena herramienta de comparación (Beyond Compare se menciona a continuación), puede hacer una diferencia completa del contenido del archivo cab entre diferentes versiones de MSI (y algunos de los archivos podrían ser archivos de texto, que podrían ser texto comparado). Supongo que los taxis y los íconos son una especie de "binarios transparentes" en un formato abierto a diferencia de los binarios compilados (con acciones personalizadas y más) que no son inherentemente descompilables ni inspeccionables (a menos que sepa cómo descompilar binarios administrados).

En conclusión : los archivos MSI son totalmente transparentes con la excepción de las acciones personalizadas compiladas . Esta transparencia es uno de los principales beneficios de MSI . La mayoría de los beneficios de Windows Installer, en comparación con las tecnologías de implementación anteriores, generalmente se centran en los beneficios de la implementación corporativa. Desafortunadamente, es posible que los desarrolladores solo vean los aspectos negativos de MSI: los (potenciales) antipatrones de MSI (hacia abajo, muy desordenados y ad-hoc por ahora). Es cierto que algunos de estos problemas son muy graves y violan "el principio del menor asombro". Los desarrolladores (por qué tienen otras cosas igualmente importantes que hacer) pueden, francamente, quedarse rascándose la cabeza con incredulidad.

Sin embargo, no se equivoque al respecto: MSI tiene enormes beneficios de implementación corporativa ( consulte el mismo enlace anterior, hacia abajo ). Condensado : ejecución silenciosa confiable, administración remota, reversión, registro, función de desinstalación implícita, derechos elevados, línea de comando estandarizada, transparencia, transformaciones para personalización de configuración estandarizada e instalación de administrador para extraer archivos de manera confiable. Sólo para nombrar rápidamente los más importantes. Beneficios en forma de lista aquí .

Muchas digresiones hasta ahora; vayamos al grano . ¿Qué herramientas se pueden utilizar para comparar archivos MSI?


Commercial Tools

Varias herramientas de implementación comerciales , como Installshield , Advanced Installer y muchas otras herramientas MSI, admiten la visualización y comparación de archivos MSI. Quizás agrego demasiados enlaces, pero permítanme usar mi política habitual de "si enlazas a uno, enlazas a todos"; debería ahorrar algo de tiempo y algunas búsquedas en Google.

Como nota especial, nostálgica, la mejor función de diferenciación MSI que he visto en mi vida fue en Wise Package Studio . Para ser honesto, estaba muy por encima del resto: siempre funcionando, claramente codificado por colores y fácil de comprender. Esta herramienta ya no está a la venta como se describe aquí: ¿ Qué producto de instalación utilizar? InstallShield, WiX, Wise, Advanced Installer, etc. (si tiene un equipo de empaquetado en su empresa, ¿tal vez tengan una licencia de repuesto disponible?).


Free Tools

Las herramientas comerciales son buenas, pero también hay varias alternativas gratuitas que se pueden usar para comparar archivos MSI, y a continuación se muestra una lista de algunas de ellas junto con algunos consejos sobre cómo usar cada herramienta (de una manera bastante minimalista).

Se agregaron algunos detalles más dark.exe, que no es una herramienta de comparación para archivos de almacenamiento estructurados COM, sino una forma de descompilar archivos MSI en archivos fuente WiX XML y extraer todos los archivos de soporte (iconos, binarios, archivos cab, archivos de configuración). - permitiendo compararlos posteriormente con herramientas normales de comparación de texto/binario.

1.Orca (MSI SDK)

La herramienta/visor MSI SDK de Microsoft llamada Orca puede ver archivos MSI y editarlos, pero no hay soporte directo para comparar dos archivos MSI (que yo sepa). Supongo que podrías exportar las tablas y luego compararlas, pero otras herramientas tienen funciones más integradas. Esta opción se menciona ya que es posible que ya tenga Orca instalado y probablemente esta sea una forma rápida de realizar una diferenciación simple. La " opción del pobre ".

Es posible que ya tengas el instalador . Si tiene Visual Studio instalado, intente buscarlo Orca-x86_en-us.msien Program Files (x86)e instalarlo. Luego busca Orca en el menú de inicio. Técnicamente, Orca se instala como parte del SDK de Windows (descarga grande, pero gratuita). Si no tienes Visual Studio instalado, ¿quizás conoces a alguien que sí lo tenga? Simplemente pídales que busquen este MSI y que se lo envíen (es un archivo pequeño de medio mb); les llevará unos segundos. Si no, siempre puedes descargar el SDK de Windows

2.Super Orca (free third party tool)

Super Orca permitirá una comparación rudimentaria de dos archivos MSI. Mi prueba de humo parece revelar que los campos avanzados como el flujo de resumen pueden ignorarse. En otras palabras, una tabla directa sólo se compara. Podría haber otras limitaciones. ¿Quizás sea lo suficientemente bueno? Es fácil de usar.

Nota : No he podido verificarlo con seguridad, pero creo que esta herramienta salvó mi MSI sin previo aviso. Eso era muy indeseable en ese momento.

3.widiffdb.vbs (MSI SDK)

Tiene MSI SDKun VBScript que puede utilizar para ver las diferencias entre dos archivos MSI. Se llama widiffdb.vbs( msdn ). Con esta herramienta puedo ver las diferencias de Summary Stream ignoradas por Super Orca. Todo lo que MSI SDK tiene autoridad.

ACTUALIZACIÓN : Todos los scripts API del SDK de MSI en github.com (el código VBScript real).

  • Incluyendo un enlace a la lista completa de dichos VBScripts del SDK de MSI , para diversos fines. No se confunda, sólo widiffdb.vbses necesario para comparar archivos MSI, pero se pueden encontrar muchos scripts útiles para otros fines.
  • Si tiene Visual Studio instalado, simplemente busque widiffdb.vbs. Inicie cscript.exey pase la ruta completa a dos archivos MSI para compararlos. Salida en consola.

Uso:

cscript.exe widiffdb.vbs "Setup 1.msi" "Setup 2.msi"

Salida de muestra:

Property Value           [ALLUSERS] {1}->{2}
Property Value           [MSIINSTALLPERUSER] {}->{1}
Property INSERT          [MSIINSTALLPERUSER]
\005SummaryInformation   [9] {{00000000-0000-0000-0000-000000000000}}->{{00000000-0000-0000-0000-000000000001}}
\005SummaryInformation   [12] {28.03.2019 15:20:02}->{28.03.2019 14:40:52}
\005SummaryInformation   [13] {28.03.2019 15:20:02}->{28.03.2019 14:40:52}
\005SummaryInformation   [15] {2}->{10}

Para encontrar el script, puede buscarlo en Program Files (x86)si tiene Visual Studio instalado (es parte del SDK de Windows que también se instalará junto con Visual Studio) - (actualmente la ruta es: C:\Program Files (x86)\Windows Kits\10\bin\10.0.17763.0\x86- simplemente reemplace los números de versión según corresponda y deberías encontrar el MSI más rápido).

4.dark.exe (WiX toolkit - open source)

El binario dark.exe del conjunto de herramientas WiX (un conjunto de herramientas que probablemente se utilizó para compilar algunos de sus archivos MSI). Este dark.exees un "desensamblador" o "descompilador" de archivos MSI. Convertirá archivos MSI a wxsformato XML (el formato propio de WiX utilizado para compilar archivos MSI en primer lugar), junto con una serie de archivos binarios extraídos (si utiliza las opciones y indicadores de descompilación correctos).

Los wxsarchivos fuente se pueden comparar como archivos fuente de texto normales (mi herramienta favorita para esto es Beyond Compare , pero es una herramienta comercial; hay muchas herramientas de comparación de texto, incluidas las de Visual Studio). Los archivos binarios obviamente se pueden comparar binariamente. Cualquier archivo CAB extraído se puede comparar con otro archivo cab similar de otra versión de configuración de MSI, por ejemplo.

Aquí hay una línea de comando de ejemplo:

dark.exe -x outputfolder MySetup.msi
  • En muchos casos, esto producirá una muy buena comparación de los archivos MSI y debería poder determinar qué es realmente diferente.

  • Los binarios extraídos podrían ser archivos de script (VBScripts, etc.) o cualquier otro número de binarios (por ejemplo, acciones personalizadas de DLL compiladas). En el último caso, no puedes descompilarlo más, a menos que sea un binario .NET y tengas experiencia en descompilar dichos binarios.

  • Sin embargo, cabe señalar que los archivos MSI generados por WiX compilados utilizando exactamente los mismos archivos fuente de WiX pueden ser diferentes por un par de razones:

    • El mismo archivo fuente de WiX también se puede compilar con diferentes configuraciones de compilador y vinculador , y esto puede afectar el archivo MSI generado de varias maneras diferentes. Para ver todos los modificadores, descargue e instale WiX y simplemente escriba candle.exeo light.exeen un símbolo del sistema y presione enter.

    • Ciertos campos, como los GUID de paquetes y los GUID de productos, se pueden configurar para que se generen automáticamente en el archivo wxs. El campo correspondiente resultante en el archivo MSI generado obviamente será diferente para cada compilación en este caso.

      • No tengo una lista completa de los campos que se pueden configurar para que se generen automáticamente en este momento (si lo sabe, tal vez presione editar y modifique esto in situ).

      • Los campos generados automáticamente mencionados también pueden estar codificados (lo cual no es bueno para el GUID del paquete, pero esa es otra larga historia; solo sepa que si encuentra dos archivos MSI que son binarios diferentes con el mismo GUID del paquete, entonces está en serios problemas; si están en estado salvaje, Windows Installer los tratará como el mismo archivo por definición). Los códigos de paquete siempre deben generarse automáticamente. Digresión.

    • Los archivos MSI en sí obviamente tienen información de fecha de archivo diferente, ya que se compilaron por separado, solo para decir lo obvio.

Y una nota especial algo ajena al tema que nos ocupa, pero importante de todos modos: puede utilizar dark.exepara descompilar ejecutables compilados con la función Grabar de WiX. Esta es la función de arranque de WiX que se utiliza para instalar uno o más archivos MSI y/o EXE en secuencia, uno tras otro. Estos programas previos son archivos EXE y puede descomprimirlos en sus archivos MSI y/o EXE constituyentes:

dark.exe -x outputfolder setup.exe

Just open a command prompt, CD to the folder where the setup.exe resides. Then specify the above command. Concrete sample: dark.exe -x outputfolder MySetup.exe. The output folder will contain a couple of sub-folders containing both extracted MSI and EXE files and manifests and resource file for the Burn GUI. Any MSI files can then be disassembled as described above to produce a WiX source file (wxs).

5. InstEd (free third party tool - with plus version available)

For some reason I have never used this tool actively, but tested it several times. Testing it again it does seem to do the job of comparing two MSI files, albeit from a strange menu option (which made me think the feature did not work before).

  • Open an MSI, then go to Transform => Compare Against... and browse to the MSI you want to compare the first one to.
  • Comparison seems OK, and I see that there are changes in the Summary Stream - for example - but the diff doesn't seem to show what is different (unless I just don't see it).
  • To see the summary stream changes, open both files in separate InstEd instances and go Tables => Summary Info... in both instances. Now compare the information in the property sheets. Alternatively use the widiffdb.vbs script listed above.

6. Other Tools... (COM-structured storage file viewers)

There are no doubt many other tools capable of viewing COM-structured storage files, but I think the above options should suffice for most users. I'll add a link to installsite.org's list of MSI tools again.

7. Advanced Installer (commercial tool with some free features)

This commercial tool will be able to function as a viewer and allow some basic operations on MSI files even without running with a full license. The nice bit is that you don't even need to use the raw tables, but can use a much nicer user interface to "hotfix" various things in the MSI. For example various upgrade parameters (continue or fail when major upgrade uninstalls fail, etc...).

Changes made in the Table Editor view (straight-up table view) will not be visible in the other "wizard views". The reason for this is explained here.


Links

  • The same (similar) information written for system administrators.
Stein Åsmul avatar Jan 28 '2018 02:01 Stein Åsmul