如何比較兩個(或多個)MSI 文件的內容?
如何對兩個(或多個)MSI 文件進行“**內容比較”並查看文件內部的實際不同之處——而不是進行無用的二進制比較**?(這顯然只告訴我是否正在處理同一文件的副本)。
MSI 文件
MSI 文件包含嵌入在COM 結構化儲存文件中****的原始 MS SQL 數據庫(文件中的文件系統具有各種類型的儲存流 - 舊的 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 文件的簡介。有人建議我在serverfault.com上為該內容添加一個連結。也許它對系統管理員有幫助。
我不想出現雙源問題,所以我將只連結到 stackoverflow-version(希望這是好的做法):如何比較兩個(或多個)MSI 文件的內容?此答案列出了幾種工具(免費和商業),可以幫助您完成“真正的比較”。
來自 WiX 工具包的高級 MSI 反編譯功能
dark.exe
可能特別令人感興趣。除了 MSI 文件反編譯,連結內容還描述瞭如何解壓縮使用WiX 工具包setup.exe
創建的文件(一個引導程序功能,可以依次安裝多個 MSI 文件和嵌入式 EXE 文件)。解壓後的內容又可以被同一個文件反彙編(前提是它們是 MSI 文件)。dark.exe
讓我也提供一個關於如何處理使用其他部署工具製作的 setup.exe 文件的連結。