前言

msi文件是一个安装包文件,可以看做一个数据库,其中包含很多资源,例如图片,配置文件,可执行文件exe等等。

我想要把修改过 exe可执行文件提交到msi文件中,那么就需要知道msi文件的构成,首先 msi文件 中最重要的内容就是cab文件,cab文件可能是在 msi文件 的内部,也可能是独立于 msi文件 之外的。如果cab文件是在msi文件内部的话, 那么提取和提交 cab文件 就需要用到msidb这个软件了。

环境配置

我们修改 msi文件 只需要用到俩个软件: iexpress(用于将目录打包成cab文件) , msidb(用于获取 msi文件 中的信息,提取或提交cab文件到msi)。
iexpress 一般在系统中内置,并且已经包含在path环境变量中,可以在cmd任意目录测试,输入iexpress看看是不是弹出这个软件了。
msidb需要直接设置一下系统的path环境变量的,因为我要在cmd一些目录中执行这条命令。
msidb下载地址

修改msi步骤

  1. 提取cab文件
  2. 解压cab文件
  3. 将修改的资源放回解压cab解压后目录
  4. 将目录重新打包成cab文件
  5. 将新的cab文件提交进msi文件

如果cab文件是独立在msi文件之外的,那么就可以省略 1,5步骤。

1.提取cab文件

首先要知道msi包含cab文件的名字,才可以提取出来。可以使用msidb命令提取俩个文件。

1.1 提取Media.idt和File.idt文件

msidb -e -d msi文件名字


选中 FileMedia 这俩个文件,然后选中导出,点击确定,此时在目录中会出现这俩个文件(后缀名为.idt)。

这俩个文件都可以用记事本打开:

cpx-fmt.cab 就是cab的文件名,前面的#是无用的。

1.2 提取cab文件

msidb -x cab文件名 -d msi文件名

2. 解压cab文件

一般的解压软件都可以直接解压cab文件。将其解压到一个目录里面就可以了。

3. 将修改的资源放回解压cab解压后目录

我要替换的是我修改的一个exe, 图中的 cpxfmtEXE 就是可执行文件exe,只不过这里没有后缀名。

将修改好的文件命名同样的名字并替换到该目录里面。

4. 将目录重新打包成cab文件

这一步是最为复杂的。主要在于压缩的顺序问题。文件的顺序在我们之前的File.idt文件中,可以用excel文件打开查看:

squence 这一列就是顺序编号。
而我们目标是生成一个和File.idt文件中的顺序一致的SED文件, 然后使用iexpress软件使用SED文件进行打包。 由于这一步用excel操作较为复杂,所有我写了一个 软件 脚本可以打包 cab。
软件下载地址
将这个软件放入到,File.idt 的同一目录,这时解压cab的目录和File.idt 文件和这个软件都应该处于同一目录。然后启动这个软件:

这里我的cab解压的目录是cpx-fmt, 然后回车,等待打包结束:

这时会在目录中生成一个new.cab的文件,这个就是打包好的文件。由于我写的这个软件中已经调用iexpress,所有你无需运行iexpress 命令了。

5. 将新的cab文件提交进msi文件

new.cab 重新命名为原始的文件名,我这里是 cpx-fmt.cab。然后运行命令:
清除msi文件中的原始cab包数据:

msidb -k cab文件名 -d msi文件名

添加新打包的cab文件:

msidb -a cab文件名 -d msi文件名

这里 cab文件名,必须是前面获取到的文件名,所以需要将前面生成的 new.cab 修改为原始名
到此所有步骤结束。

参考文章

https://blog.csdn.net/davidhsing/article/details/9962377
这里可以查看更加详细的4. 将目录重新打包成cab文件这一步的逻辑,作者用excel处理的,很感谢作者提供的方法。

修改msi文件的更多相关文章

  1. [vs2008]Visual Studio 2008 SP1添加或删除功能提示查找SQLSysClrTypes.msi文件

    前言 今天接到领导布置的一个任务,是之前同事负责的项目.离职了,现在客户有些地方需要修改,由于我之前参与过,就落在我的头上了. 然后我就把代码弄了过来,打开发现其中需要用到水晶报表.(我觉得不好用,不 ...

  2. 解决msi文件在XP上安装未完成(提示安装程序被中断,未能安装app。需要重新启动该安装程序进行重试)的问题。

    如图所示,我利用Visual Studio 2015制作了一个小程序.基于.Net 4.0.用VS的Install扩展,新建Install项目进行打包.打包为.msi文件.该安装文件在已经安装了 .N ...

  3. MySQL之MySQL5.7安装包(msi文件)在Windows8下安装

    最近自己在使用MySQL5.7.16.msi安装MySQL.自己下载的是.msi文件,在安装的过程中遇到了许多文件,网上大部分的Blog都是关于免安装包的安装方法,希望我的方法对大家有帮助. 1,下载 ...

  4. 什么是MSI文件?

    当你双击`msi`文件时,就会调用`window.installer`程序,接下来就和安装其他程序一样了,但是你要确保你的`window.installer`服务是开启的,你可以在控制面板下的服务中找 ...

  5. 【MySQL】MySQL之MySQL5.7安装包(msi文件)在Windows8下安装

    最近自己在使用MySQL5.7.16.msi安装MySQL.自己下载的是.msi文件,在安装的过程中遇到了许多文件,网上大部分的Blog都是关于免安装包的安装方法,希望我的方法对大家有帮助. 1,下载 ...

  6. 使用gulp解决外部编辑器修改Eclipse文件延迟更新的问题

    本人前端用惯了Hbuilder,修改了eclipse项目中的文件后,由于是外部编辑器修改过的,eclipse不会自动部署更新,一般按F5刷新项目,或者在 preferences > genera ...

  7. 修改hosts文件在本地使域名解析到指定IP

    # Additionally, comments (such as these) may be inserted on individual  # lines or following the mac ...

  8. 修改linux文件权限

    Linux系统中的每个文件和目录都有访问许可权限,用它来确定谁可以通过何种方式对文件和目录进行访问和操作. 文件或目录的访问权限分为只读,只写和可执行三种.以文件为例,只读权限表示只允许读其内容,而禁 ...

  9. 编辑IL文件 修改DLL文件

    本文章只是技术探讨,学习,技术上的研究而已.请支持正版. 如:KS.Gantt.DLL 为例 使用ILSpy反编译 工具 利用ildasm反编译 KS.Gantt.dll  生成IL中间代码 一般会生 ...

  10. SVN如何查看修改的文件记录] 来源:Linux社区 作者:frogoscar

    SVN如何查看修改的文件记录 [日期:2014-11-20] 来源:Linux社区  作者:frogoscar [字体:大 中 小]     主要是有四个命令,svn log用来展示svn 的版本作者 ...

随机推荐

  1. phpoffice文档笔记

    目录 phpword html转word phpexcel 从数据库导出 phpword html转word <?php namespace app\index\controller; use ...

  2. Unity接入微信支付SDK 2022年版安卓篇

    最近1年转了UE开发,博客更新的比较少,技术栈宽了不少,以后有空尽量多更新,也方便总结记忆 Unity接入微信支付整个过程坑比较多,网上之前的教程要么比较老,要么比较零碎,只能东拼西凑摸索,跑通后还是 ...

  3. windows系统下使用bat脚本文件设置 JDK 系统环境变量

    号开头的行不要写在bat文件中 # java_init.bat # 注意文件换行符是windows系统下的(CR LF),文件编码是ANSI # path变量追加这个可以拓展到tomcat,mysql ...

  4. MySql的InnoDB的三层B+树可以存储两千万左右条数据的计算逻辑

    总结/朱季谦 B+树是一种在非叶子节点存放排序好的索引而在叶子节点存放数据的数据结构,值得注意的是,在叶子节点中,存储的并非只是一行表数据,而是以页为单位存储,一个页可以包含多行表记录.非叶子节点存放 ...

  5. PAT (Basic Level) Practice 1032 挖掘机技术哪家强 分数 20

    为了用事实说明挖掘机技术到底哪家强,PAT 组织了一场挖掘机技能大赛.现请你根据比赛结果统计出技术最强的那个学校. 输入格式: 输入在第 1 行给出不超过 105 的正整数 N,即参赛人数.随后 N  ...

  6. 我的 Kafka 旅程 - Consumer

    kafka采用Consumer消费者Pull主动拉取数据的方式,当Broker无数据时,消费者空转.Kafka并不删除已消费的消息,各自独立的消费者可消费同一个Broker分区数据. 消费流程 1.消 ...

  7. 浅谈-动态路由之OSPF的理解

    路由 在网络中,路由相当于就是一张地图,让路由器知道这个对应的IP数据包应该往哪端口.网段走:而这个"地图"我们称之为路由表,不同的目的IP路由表的下一个跳也不同,其生成方式有又有 ...

  8. @Transactional注解真的有必要声明rollbackFor属性吗?

    @Transactional注解真的有必要声明rollbackFor属性吗? ​ 今天在看spring的事务底层源码时,想到一个问题,@Transactional注解真的有必要声明rollbackFo ...

  9. 简单将Springboot项目部署到linux服务器上

    1.使用springboot的jar包方式 直接使用maven工具按照步骤点击就可以直接打包 2.到target目录下找到 jar包 3.将jar包放到linux的任意文件夹下(此项目是之前的kafk ...

  10. Linux基础_3_文件/文件夹权限管理

    注:权限遮罩码: 控制用户创建文件和文件夹的默认安全设置,文件默认权限为666-umask的值,文件夹默认权限为777-umask的值. root默认0022,普通用户默认0002. 文件的默认权限不 ...