网管小贾 / sysadm.cc
说来也奇怪,话说不久前我刚刚解决了 VB6 释放资源文件的一个 BUG ,心里正美滋滋的。
不料居然还有个巨大的 BUG 在后边等着我呢!
真是不说不知道,一说吓一跳,十天找 BUG ,N把辛酸泪,在这儿我就写篇文章纪念下这痛苦的过往吧!
使用过 VB6 的小伙伴们应该对资源编辑器和资源文件并不陌生吧,之前我也在文章中有介绍过。
通过添加资源文件的方式,我们可以将一些想要用到的辅助文件给绑定到 EXE 文件中。
比如,我们的程序可能会用到的一些 DLL 动态链接库文件,或者一些图片啥的,那么就可以通过这样的方式把它嵌入到程序中。
到了要用的时候再随时随地将文件释放出来,最终也只需要做成一个 EXE 文件,既方便又干净,绿色环保,还倍有面子。
至于如何添加资源文件,以及如何释放和利用资源文件,这些问题在网上都有很多介绍,内容都挺详细的,在这里我就不多啰嗦了。
既然这么方便好用,我当然也不能放过了,于是我就经常这么用来着。
可是有那么一天,对,就是修复完之前那个释放文件大小不正确的 BUG 后,我突然发现这玩意特么又出问题了,而且还挺大发。
要么无法再添加新的资源文件,要么能添加但重新再打开工程时就会报错,整得我一脸懵啊!
这个“内存溢出”是个什么鬼?
起初我怀疑是我年老色衰程序哪里给搞坏了,后来对比了我修改的代码部分,发现并不是哪里写坏了,而是资源文件引起的。
这就有点搞笑了,难道添加个资源文件也会导致内存溢出吗?
然而事实证明这是真的!
经过不厌其烦的多次测试,我发现只要添加文件后生成的 RES 资源文件本身大小超过 350 兆就会立马崩溃。
是的,你没看错,就区区 350 兆就玩完了!
反正上不了 400 多兆吧,具体上限我没有找到官方明确的说法。
后来我想了想,猜测可能这玩意只能用来添加一些小文件,如库文件、图标或配置文件等,而并不适合用来装大文件。
可惜可惜,这么好用的东西,就因为其本身古老陈旧带来的限制而导致成了个半废品,说实话,对于有着几十年感情的我有点不太能接受啊!
在查资料的时候,发现有 VB6 生成的 EXE 有 2G 上限的说法,那么这个资源文件好歹也来个 2G 上限也行啊,结果却是那么的悲哀,可用大小才这么一点!
好了,就因为这点问题让我放弃 VB6 ,我做不到。
擦干眼泪,继续前行,谁麻烦递个手巾板!
既然此路不通,那我就只能另辟蹊径了,活人还能让尿给憋死?
前一阵正好要做个程序,需要绑定较大资源文件到程序中,大小也要在数百兆左右,得,就拿这个来测试吧!
可常规方式行不通,问题又摆在那儿,还能有什么好办法呢?
后来我找了很多资料,思来想去,只有一个简单得不能再简单,但又有点麻烦的做法:手动将资源文件绑定到 EXE 文件中。
什么?什么?你把话说清楚!
咳咳……静一静,请听我说……
首先,我们先制作一个不带任何资源文件的 EXE 程序文件,它具有除了资源文件之外所有你希望要实现的功能,包括释放资源文件的功能。
其次,将需要的资源文件像嫁接手术一样把它们连接到 EXE 文件后面,有一个接一个,有两个就接两个,一个挨着一个按顺序放到 EXE 文件尾部,然后生成一个新的更大的 EXE 文件。
最后,当需要释放或使用资源文件时,再正常执行程序将其从尾部读取即可。
说到这儿可能有经验的小伙伴会说,这不是病毒原理嘛!
没错,早期的病毒就是这么干的,在正常程序屁股后边加一段代码。
当被感染的程序执行到最后时,它并没有结束,而是魔术般地继续执行后面的病毒代码。
因此早期杀毒基本上总是要先判断正常文件大小是否有变化,如果变大了,那么大概率就是中毒了。
尾部接上一些令人迷惑的东西并不会导致 EXE 文件无法执行,因此这是完全可行的,并且目前看并没有文件大小的限制。
当然了,这么做并不表示程序会变成病毒,两者没有必然关联。
总之原理就是这么个原理,只是按这个原理来实现绑定资源文件突破大小限制罢了。
好,原理大概知道了,具体怎么做呢?
实际做起来的确有点麻烦,特别是资源文件的定位和寻址。
最后我自己做了一个简单的演示示例程序,分为两个部分。
XJAddResToEXE - 将资源文件绑定到原始 EXE 文件尾部的工具程序XJExampleEXE - 原始示例 EXE 文件(绑定资源之前)网管小贾的自定义输出资源文件演示程序.7z
下载链接:https://www.123pan.com/s/bI7Mjv-q8AH3.html
提取码:<关注公众号,发送001088>
我来说一下这个示例程序怎么用。
首先,准备好一个未绑定资源文件前的 EXE 文件,示例中我们就用 XJExampleEXE 吧。
注意这个 EXE 中是提前写有释放资源文件代码的。
其次,打开 XJAddResToEXE ,指定好你想要绑定的资源文件(本示例只演示添加一个资源文件的情况)。
导出文件则写上 XJExampleEXE 的同名文件,即生成新的 EXE 文件也是一样名字的。
如果你想生成不同名称的新的 EXE 文件,那么需要修改代码(源代码提供付费下载)。
我们可以对比一下绑定资源前后的两个 EXE 文件,明显后者比较胖一点哈,容量差不多增加的就是资源文件的大小。
最后,打开新生成的 XJExampleEXE 文件,指定好释放路径和文件名,点击按钮即可看到导出的资源文件。
如果你不放心,完全可以将释放出来的资源文件拿过来对比一下。
别光看大小,最好看一看哈希值,基本上就不会错了。
大家可以通过演示程序来体验手动绑定资源文件的感觉,当然目前只支持绑定一个文件。
其实严格来说应该是演示程序只支持释放一个资源文件,因为我给它设定的是只能定位寻址一个文件,因此只能给它绑定一个而不是多个。
不过如果你想要批量绑定多个文件,而且还能做到正常释放,那么就请参考源代码吧!
(当然其中还有一些代码编写上的注意事项和细节内容,有利于更好地实现。)
网管小贾的自定义输出资源文件源代码.7z
下载链接:https://www.123pan.com/s/bI7Mjv-68AH3.html
提取码:<关注公众号,发送001088>
(当然其中还有一些代码编写上的注意事项和细节内容,有利于更好地实现。)
将技术融入生活,打造有趣之故事
网管小贾 / sysadm.cc