青春记忆

学习msi安装包内文件替换笔记

最近为了方便自己,学习处理msi包内文件

首先仔细阅读了下面链接的文章。

https://teach.hanzify.org/article/652-1233562028.html

然后开始动手了。

某多媒体教室软件,160M的大小

直接在7z中打开如图

   之所以这么大的安装包,原来是加入了多国语言资源文件

而我只需要_ZH_CN文件,其他都不要,这样应该就可以减小安装包的体积了。

由于这个软件在msi的外面还加了个exe的壳,所以首先得把msi提取出来

运行该exe安装程序。在任务管理器中发现多了个msiexec.exe进程

通过图中所用命令查看该进程的运行参数

 如上图发现msiexec.exe进程是执行了临时目录中的msiE46D.tmp这个文件,同时后面还有一串参数。

去临时目录找到该文件,通过文件大小初步判断就是我要提取的msi文件了。拷贝一份出来,关闭安装程序界面。

再用上图所用参数执行这个文件,同样出现了程序安装界面,到这里就确定了msiE46D.tmp的身份。

注意:每次运行原版安装程序生成的临时文件名可能不一样

为了方便处理把这个临时文件改名成teacher.msi

有了msi安装包,现在就参照教程对msi安装包进行修改。

教程说要提取cab文件,其实这个msi是可以直接用7z打开的,所以提取cab这一步可以免了。

直接用7z打开,将其中的文件解压到一个文件夹中待处理。

※关键点:
1、CAB中的文件顺序要和MSI的文件表中的文件顺序保持一致。
这条很重要,所以我在处理不需要的文件时,就没有直接删除,而是用同名0字节文件替换的如图

 如上图,除了中文语言不改,其他用0kb文件替代。

把解压出来的这些文件处理好后,接下来就是再次打包成cab了

※关键点:
1、CAB中的文件顺序要和MSI的文件表中的文件顺序保持一致。

现在得把msi包中的文件表找出来,使用msidb.exe打开msi文件

 按照上图步骤导出msi中的文件表File.idt,用excel或wps表格打开File.idt
A列File就是cab内的文件名,H列Sequence就是这些文件在CAB中的顺序  

 排除1,2,3行,对所有数据以H列为参照进行升序排列,排序后将A中的所有文件名列表复制出来

 如上图将排序后的文件名列表复制到一个0Filelist.txt文件中备用。

再看教程中的这段

 如图使用上面的命令配合我们刚才的0Filelist.txt文件即可按顺序生成符合要求的cab文件了。

这样新的cab就处理好了,只有21M。

接下来就是用新的cab去替换msi中原来的cab包了。教程原话

首先,在DOS下或MsiDb.exe快捷方式下,使用“MsiDb.exe -k CAB文件名 -d MSI文件名”命令删除MSI文件中的CAB文件(其实只是清除关联)。然后使用“MsiDb.exe -a CAB文件名 -d MSI文件名”命令插入新的CAB文件到MSI文件中。

注意:cab的名称可以用ORCA查看原包中的名称,然后把新制作的cab也改成这个名称

这样做后,体积是不会减小的。要减小体积还得想办法。

教程上说可以用ORCA打开msi另存为新的msi不包含任何cab的小体积msi,再使用 MsiDb.exe -a CAB文件名 -d MSI文件名将新的cab附加到msi中。

我这样做了,体积是降减下来了,但是测试安装包时不能正常安装。可能是这个安装包比较特殊,本身使用了参数运行才能调出安装界面。而ORCA在另存为时可能丢失了某些信息。

后来我发现msi的安装包在安装程序后,都会在C:\windows\installer中留下卸载用的msi程序。

于是去C:\windows\installer中寻找,遗憾的是C:\windows\installer里的相关msi程序竟然与前面提取的msi一样大小。

不死心啊,还好我的vm中有多个系统,刚才是在win7中找的,之后去xp的C:\windows\installer中寻找,简直太惊喜了,这里找到的相关msi只有几百KB,终于完美了,使用这里的msi再附加上新制作的cab,测试安装成功。


因为这个msi是要用到参数启动的,所以用批处理那执行他。当然也可以用个exe加个壳来执行。


2017.10.10国际版补充

用到软件有:MSI Studio V4.1.2.1100、Advanced Installer 11.0精简汉化版

MSI Studio的替换功能好用,用来将msi中的“?”号去掉,否则使用Advanced Installer编辑msi会提示错误。

Advanced Installer用来提取和替换mst转换文件,只能用11.0版,用最新的版本还有问题

Advanced Installer编辑后的msi在使用MsiDb.exe -k CAB文件名 -d MSI文件名去掉cab时,msi体积会自动减小,这倒是个意外的惊喜,不用再去xp环境下提取小体积的msi文件了。

另外关于编辑mst文件,MSI Studio似乎不支持中文,编辑时可以,保存后就全变成口口口了

Advanced Installer编辑时也可以,保存后就不能用了。

appeditor也是一样编辑时可以,保存后似乎也不能用。

不知道还有没有好的编辑mst的软件。

最后只好用WinHex简单修改了年份。

来源:嘿嘿

评论

热度(1)