![如何比较两个(或更多) MSI 文件的内容?](https://linux22.com/image/717503/%E5%A6%82%E4%BD%95%E6%AF%94%E8%BE%83%E4%B8%A4%E4%B8%AA%EF%BC%88%E6%88%96%E6%9B%B4%E5%A4%9A%EF%BC%89%20MSI%20%E6%96%87%E4%BB%B6%E7%9A%84%E5%86%85%E5%AE%B9%EF%BC%9F.png)
我怎样才能做“内容比较“两个(或更多)MSI 文件看看文件内部到底有什么不同 - 而不是做一个无用的二进制比较?(这显然只能告诉我是否正在处理同一个文件的副本)。
答案1
MSI 文件
MSI 文件包含原始的 MS SQL 数据库嵌入在COM结构存储文件(文件中具有各种类型存储流的文件系统 - 旧的 MS Office COM/OLE 格式)。
你可以提炼MSI 中的文件,或者你也可以反编译整个 MSI 及其所有流。下面简要介绍每种方法。
通过反编译,几乎可以实现完全透明,但编译的自定义操作除外(通常用 C/C++ 编写)。托管的编译代码(C#)实际上(理论上)可以反编译。
为了(大致)确定黑盒自定义操作实际上做了什么,你可以使用以下命令捕获 MSI 安装重新打包工具- 在安装前后扫描系统,列出所有更改 - 您会看到发生了什么,但看不到它是如何发生的。很少有人需要这种程度的审查。
仅比较文件
这是旧闻,但如果你关心的是比较 MSI/setup.exe 中嵌入的文件,您可以使用行政安装提取 MSI/setup.exe 中嵌入的文件,然后使用任何文件比较工具比较每个版本提取的文件:
setup.exe /a
msiexec.exe /a "MySetup.msi"
如果 MSI 缺少适当的 GUI 来允许您以交互方式指定输出文件夹,您可以尝试通过命令行指定它:
msiexec.exe /a "MySetup.msi" TARGETDIR="C:\MyOutputFolder
包含嵌入式 MSI 文件的 Setup.exe 文件可能有多种类型,以下是一些指针:
本质上是一个管理安装提取安装文件从 MSI 本身中嵌入的 CAB 文件(CABS 也可以是外部的)并将它们输出到整洁的文件夹结构大致反映了安装时的预期目标目的地。MSI 中可以使用多种形式的压缩- 全部由行政机构处理。请不要解压 MSI 文件!
最后,Media table
调整为使用现在提取的源文件而不是内部 CAB 文件 - 并且内部 CAB 文件被删除,这可能会使输出 MSI 比原始文件小得多。至关重要的是,任何数字签名已被删除。
以前,MSI 文件缓存时会%SystemRoot%\Installer
剥离 CAB 文件(使其变小),但现在它们会以全尺寸进行缓存,这可能会大大增加存储需求。使用管理安装是一种减少此缓存大小的方法(但会删除数字签名)。有关更多信息,请参见此处:为什么 MSI 需要原始 .msi 文件才能继续卸载?
有关管理安装的更多详细信息请参见此处:
“MSI 内容比较”
如果你想更详细地确定两个 MSI 文件之间的区别(例如软件包的版本 1 和 2),你可以使用适当的MSI 文件查看器或者MSI 反编译器。
我写了一篇关于stackoverflow.com在如何比较 MSI 文件有人建议我在这里添加一个链接服务器故障到这个内容。也许这对系统管理员有帮助。
我不想有双源问题,因此我只会链接到 stackoverflow 版本(希望这是可以接受的做法):如何比较两个(或更多) MSI 文件的内容?这个答案列出了几种可以帮助您完成“真实比较”的工具(免费和商业)。
dark.exe
WiX 工具包的高级 MSI 反编译功能可能特别令人感兴趣。除了 MSI 文件反编译之外,链接内容还介绍了如何解压setup.exe
使用WiX 工具包(引导程序功能可以按顺序安装多个 MSI 文件和嵌入的 EXE 文件)。解压后的内容可以由同一个文件依次分解dark.exe
(前提是它们是 MSI 文件)。
让我也放上一个链接如何处理使用其他部署工具制作的 setup.exe 文件。