Replace files in msi package

| | Comments (2)

我不曉得有什麼好用的工具可以做到類似的動作,
以下的例子算是土法煉鋼 (以 MSN 7.0.0425 為例)

執行 Install_MSN_Messenger.exe, 在 %TEMP% 目錄可找到 msi 檔,
copy 出來成 msn7.0.0425.msi

然後用 msi2xml 轉換成 xml 檔

msi2xml msn7.0.0425.msi (在 windows 下執行)
會產生 msn7.0.0425.xml

傳到 linux 下, 使用 base64 來解檔

MSN 的檔案大都存在 MsgrCore.cab 裡

tail +$((`grep -n MsgrCore.cab msn7.0.0425.xml | tail -1 | cut -d: -f1`+2)) msn7.0.0425.xml > MsgrCore.cab.b64
抽出 MsgrCore.cab 的 base64 編碼部分, 存到 MsgrCore.cab.b64

base64 -d MsgrCore.cab.b64 MsgrCore.cab
將 MsgrCore.cab 解出

找一套能處理 cab 的壓縮程式, 例如 zipzag,
將修正過的 msnmsgr.exe 及中文化的 msgslang.dll (由 March Fun 製作),
覆蓋裡面的
msnmsgrexe.ADEB440D_7847_4F65_80BD_899870ED2EC9
msgslangdll.ADEB440D_7847_4F65_80BD_899870ED2EC9
(不清楚為什麼是這種檔名)

接下來要把 msn7.0.0425.xml 後半的 MsgrCore.cab md5 及 base64 部分, 用新的取代
XML=msn7.0.0425.xml
NEWXML=msn7.0.0425cht.xml
CAB=MsgrCore.cab
NEWCAB=new.cab
N=`grep -n $CAB $XML | tail -1 | cut -d: -f1`
head -$N $XML > $NEWXML
let N++
OLDMD5=`sed -n "$N"p $XML | cut -d\" -f4`
NEWMD5=`md5sum $NEWCAB | cut -d' ' -f1`
sed -n "$N"p $XML | sed s/$OLDMD5/$NEWMD5/ >> $NEWXML
mimencode $NEWCAB >> $NEWXML
tail -4 $XML >> $NEWXML

上面這段 script 會產生新的 xml 檔, 再回到 windows 用 xml2msi 轉
xml2msi msn7.0.0425cht.xml

最後產生 msn7.0.0425cht.msi, 直接安裝就是中文版!

簡單地說, 先用 msi2xml 轉成 xml 檔, 再把裡面檔案的 md5 及 base64 編碼部分置換,
再用 xml2msi, 轉回 msi 檔

2 Comments

MsgrCore.cab was extracted from msi file

msi2xml msn7.0.0425.msi (run under windows, generate msn7.0.0425.xml)
tail +$((`grep -n MsgrCore.cab msn7.0.0425.xml | tail -1 | cut -d: -f1`+2)) msn7.0.0425.xml > MsgrCore.cab.b64 (run under Linux)
base64 -d MsgrCore.cab.b64 MsgrCore.cab (run under Linux)

MsgrCore.cab is missing
plz help me and send me copy of this file
thx

Leave a comment

March 2009

Sun Mon Tue Wed Thu Fri Sat
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31        

About this Entry

This page contains a single entry by Pank published on November 19, 2004 12:05 AM.

pidof for FreeBSD was the previous entry in this blog.

PXE Server is the next entry in this blog.

Find recent content on the main index or look in the archives to find all content.