November 19, 2004

Replace files in msi package

我不曉得有什麼好用的工具可以做到類似的動作,
以下的例子算是土法煉鋼 (以 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 檔

Posted by pank at November 19, 2004 12:05 AM
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)

Posted by: pank at June 25, 2005 11:56 AM

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

Posted by: Fahad at June 25, 2005 09:25 AM
Post a comment













Remember personal info?