现在的位置: 首页原创, 教程>正文
制作7z解不开的NSIS安装程序
2010年09月16日 原创, 教程 评论数 9

NSIS是一套相当不错的安装程序制作软件,代码面向流程,虽然导致代码比较复杂,但是安装程序的可控性却相当的高。用NSIS制作安装程序时,一般为了减小安装程序的体积,我们都会采用LZMA_Solid压缩算法。LZMA也就是7z赖以成名的开源压缩算法,具有相当不错的压缩比和压缩效率。但也由于这个原因,用NSIS脚本写的安装程序基本上都可以用7z直接解压开来从而得到里面的文件。

但有时候我们不希望用户能自己解开安装程序,Inno可以给解包设置密码,但是NSIS不行,难道我们就没办法了吗?答案当然是否定的。在NSIS代码的起始部位添加以下两行:

!system '>blank set/p=MSCF< '
!packhdr temp.dat 'cmd /c Copy /b temp.dat /b + blank && del blank'

这种方法实际上就是生成一个空的CAB文件,然后与NSIS的文件头合并,造成这是一个CAB压缩包的假象,用7z强制打开的话自然是空的,因为7z此时打开的是那个实际上不存在CAB文件。

使用这种方法之前用NSIS制作的安装程序可以用7z轻松解开,如下图所示:

使用这种方法以后,打开则如下图所示:

怎么样,7z看不到那些安装文件了吧,这样也就实现了防止解包的目的,实现起来是不是很简单?

看到这儿看出点什么眉目来没?新增加的那两句话都是怎么工作的?如果学过批处理的同学应该很容易明白“cmd /c”的意思是在命令提示符下运行后面的命令。就像我们这里的“Copy /b temp.dat /b +blank&&del blank”。Copy程序的/b开关是指以二进制的方式合并,以前提到的最多的就是用在把一种文件隐藏在另一种文件里,相关的文章大家可以自己去搜一下。

这里的blank是我们在脚本里新增的两行里第一行生成的一个只有CAB头的空文件。所以第二行的意思就是说把NSIS安装程序的头部和一个空的CAB文件进行二进制合并,这样以EXE的方式运行的时候就会运行NSIS的头部,也就是启用正确的安装程序;用7z打开的时候则会打开到那个空的CAB文件,所以就显示为空白了。

知道了这个工作原理之后我们就可以进行拓展了……

刚才我们合并进去的是一个临时生成的空的CAB文件,那我们能不能把已经存在的文件也合并进去?也就是说安装程序安装的是文件A,而右键用7z解压出来的却是文件B?如果有看懂上面的原理的话这里就很好办了。

还是看刚才的两行脚本,第一行用来生成空的CAB文件的那是肯定不需要了,第二行里我们本来合并的是blank,那我们现在要合并别的文件就只需要把blank改成别的文件名就行了(注意需要是压缩包)。代码如下所示:

!packhdr temp.dat 'cmd /c Copy /b temp.dat /b + MacType.7z'

这里的MacType.7z就是我要合并进去的文件了,这个MacType.7z里面压缩的是MacType的安装脚本MacType.nsi,则出来的效果如下图所示:

哈哈,很有一种恶搞的趣味啊……

目前有 9 条留言 其中:访客:7 条, 博主:2 条

  1. 小羿 : 2010年10月08日22:05:37  1楼 @回复 回复

    赞啊。。感谢分享

  2. keeds : 2010年11月06日15:39:32  2楼 @回复 回复

    为什么把NSIS程序的头部和空CAB文件合并后,以EXE方式会运行正确的安装程序而用7z打开的时候则会打开到那个空的CAB文件?

  3. theflash : 2010年12月05日00:55:18  3楼 @回复 回复

    呵呵 可否show下你截图时候的mactype配置文件呢?大爱那个字体。如果可能发我邮箱吧 回复在blog会吧留言板弄得很乱啊

    谢谢

    • fonlan : 2010年12月05日12:13:21 @回复 回复

      我用的不是MacType,是gdipp,所以配置文件上就没有任何参考性了。至于这个字体叫msyh_HandelGotD,是雅黑替换了HandelGotD的英文,用来替换雅黑的,毕竟Win7的默认字体是雅黑。

      • theflash : 2010年12月05日14:16:23 @回复 回复

        非常感谢您的回复~

      • theflash : 2010年12月13日00:41:23 @回复 回复

        蓝冰大哥 又来麻烦您了 我用的mactype最新的官方版 使用热替换字体的配置文件 就是那个Apple^Nokia那个 结果出现了严重的性能下降问题,我想可能是是dll注入不稳定吧

        想换回您的mactype,可是您说过这个版本已经是就旧的…… 请问有办法吗?我用的是win7 英文旗舰版 mactray独立加载模式 性能下降主要在firefox上(三四个标签页能占300m内存),word有时候也会出现~

        请问您的是怎么加载的? 程序冲突的问题怎么解决的啊 非常感谢~

        • fonlan : 2010年12月13日00:58:39 @回复 回复

          性能下降这种问题问我可就不清楚了,毕竟程序不是我写的,得问flyingsnow才行。我自己是用的gdipp服务方式加载,程序冲突自然是直接排除咯,这个基本上gdi++、gdipp和MacType通用。

          • theflash : 2010年12月13日23:15:13 @回复 回复

            非常感谢回复~ 也许是我用的卡巴斯基也有影响~ 凑合着用吧,有了mactype就不想取消这种效果了~

  4. sbtree : 2011年05月24日16:52:34  4楼 @回复 回复

    正需要,收藏

给我留言

留言无头像?