Bandizip 是我每次装完系统后第一批装上的软件,解压快、中文名不乱码、右键菜单也不臃肿,十几年下来一直没换过。但从 7.0 开始,免费版的主界面上多了一条广告横幅,工具栏上多了个"注册"图标,设置窗口和状态栏里偶尔还会冒出一行提示文字。这几样东西不影响功能,可对一个每天要开关几十次压缩软件的人来说,像鞋底里的小石子,不致命但一直硌着。我用两个晚上的时间,用资源编辑的方式把这三处处理干净了:广告位、注册图标、状态栏文本,一个都没留。
这篇就是我整个过程的实操记录,包含工具怎么挑、资源藏在哪、每一步的尺寸和编码参数、以及我踩过的那些坑。先交代三件事。第一,我处理的是自己电脑上自己安装的那一份文件,属于个人使用范围内的界面定制,不做二次打包分发。第二,涉及到的资源编号、文件名在不同小版本之间会漂移,你照着思路在自己机器上重新找一遍就行,别硬抄编号。第三,如果预算允许,直接买一份正版是最省心的做法,后面我也会聊聊这件事。这篇适合那种装过资源编辑工具、懂得先备份、愿意为一个顺眼的界面折腾半小时的人。
1. 动手之前先弄清楚:这三处东西分别藏在哪
1.1 免费版广告位是怎么塞进界面的
先得判断一件事:广告内容是本地资源还是从网络拉的。这个判断直接决定你用什么方法。做法很简单,把网线拔了(或者把无线断开),然后打开 Bandizip 主窗口看一眼。如果广告位依然显示那张图,说明图片是打包在程序资源里的,走资源替换的路线;如果那个位置变成空白、灰块或者干脆消失,说明内容是从网络上拉下来渲染的,这时候你去改程序资源基本白费力气,得换思路,比如用系统层面的域名屏蔽,或者干脆退回老版本。
我这里是本地图片资源的情况。资源类的广告一般有两种形态:一种是 BITMAP 或 IMAGE 类型的图片资源,程序启动时按固定坐标贴到窗口的某个控件上;另一种是程序在运行过程中动态创建的一个子窗口,位置和尺寸写在代码里。前者你能直接在资源工具的树形目录里看到那张图,后者你只能看到承载它的对话框资源。我的做法是先用资源工具把 BITMAP 和图标资源全展开,一眼就能看出哪张图的尺寸和广告横幅的比例对得上,那基本就是它了。
顺带说一个排查小技巧:任务管理器里把 Bandizip 拉起来之后,看它加载的模块列表,如果目录里除了主程序还有别的模块文件,而广告资源恰好在那里面,那你改主程序是没用的,得改对文件。我做第一遍的时候就改错了文件,改完启动一看毫无变化,白折腾半小时。
1.2 注册图标和状态栏文本的真实身份
注册图标就是一个普通的工具栏按钮,只不过它的图标资源是单独一张图,点击之后弹出购买或者注册的窗口。它的身份是"对话框资源里的一个控件 + 一张图标资源",两者要配合处理。你只替换图标,按钮还在,点了还会弹窗;你只隐藏按钮,图标资源留着不占什么空间,也无所谓。
状态栏文本通常是两类东西之一。一类是字符串表(STRINGTABLE)里的条目,程序按 ID 去取;另一类是代码里直接拼接的常量字符串,编译进二进制里。这两种的处理手法完全不同:前者在资源工具里改起来很轻松,后者得用十六进制编辑器做同长度覆盖。我在自己的版本上遇到的是前者,中英文各有一份字符串表,这一点后面会细说,因为它直接关系到你改完之后界面会不会中英文混杂。
另外一个容易被忽略的点是:有些提示文字是"状态栏"控件里动态设置的,来源是配置文件或者注册表里的一个开关值,而模板字符串在资源里。所以有时候你把字符串表改了,界面没变,是因为那台机器上的开关状态本来就没触发显示。改之前最好先确认这行字在哪个操作路径下会真的出现。
1.3 三条技术路线怎么选
我把当时考虑过的三条路线放在一张表里,你可以对照自己的情况挑。
| 路线 | 具体做法 | 难度 | 持久性 | 主要风险 |
|---|---|---|---|---|
| 版本降级 | 退回 6.25 这类没有广告的老版本,关掉自动更新 | 很低 | 好,除非自己手贱点更新 | 新格式支持和新功能缺失 |
| 资源替换 | 用资源工具改主程序里的图片、图标、字符串 | 中等 | 一般,程序更新就失效 | 改坏导致闪退、签名失效触发杀软 |
| 域名屏蔽 | 在系统 hosts 里把广告来源域名指向本地 | 低 | 好 | 只对网络拉取的广告有效 |
| 购买正版 | 直接买授权 | 无 | 最好 | 需要花钱 |
我最后选的是"资源替换 + 冻结版本"的组合。理由有两条:降级虽然最省事,但老版本对某些新压缩格式的支持确实有差距,我手上有一批工作文件是新版压出来的;域名屏蔽对我这种情况完全无效,因为图就在本地。资源替换虽然麻烦,但改完之后那种"这是我自己的软件"的爽感,是另外几条路线给不了的。
2. 动手前的准备:工具、版本和备份
2.1 工具清单,各自擅长什么
资源编辑这个活儿,工具不需要多,但每一样都得知道它擅长什么,混着用效率最高。
| 工具 | 擅长的事 | 我在这次实操里的用途 |
|---|---|---|
| Resource Hacker | 浏览和编辑 PE 里的图标、位图、对话框、字符串表,支持直接另存为 exe | 主力工具,广告图、注册图标、字符串全在这上面改 |
| CFF Explorer | 看 PE 结构、资源目录、导入表 | 确认资源到底在哪个文件、哪个节区,排查改错文件的问题 |
| HxD 之类的十六进制编辑器 | 按编码搜索和同长度覆盖字符串 | 处理那些不在字符串表里的硬编码文案 |
| 画图或者任何能另存 BMP 的工具 | 造一张和目标尺寸一致的空白位图 | 替换广告横幅,尺寸对得上才不会错位 |
| 截图工具 | 记录改动前的界面 | 改完之后对照,确认三处都干净了 |
有一点必须强调:Resource Hacker 这类工具修改 PE 文件时会重建资源节,它自己会处理校验和,但不会帮你恢复数字签名。这不是它的锅,是机制决定的,后面单独讲。
2.2 版本选择和文件定位
我不建议你直接拿最新版开刀。新版本迭代快,资源布局可能刚改过,而且你费劲改完,过两天一更新全白干。我的做法是选一个资源布局稳定、自己用着顺手的小版本,改完就把自动更新关掉,然后把这个版本单独存一份安装包留着。
文件定位这块,主程序就在安装目录下,名字和主程序本身同名,你的机器是 64 位还是 32 位,对应的是哪个文件,看目录里的名字基本就能对上。同一目录下有时还会有一两个配套模块文件,资源到底在哪一份里,用 CFF Explorer 打开逐个看资源目录树,看到位图和图标资源的那个就是目标。我第一遍改错文件,就是因为想当然地认为资源一定在主程序里。
提示:改之前把整个安装目录复制一份到别的位置,命名成带日期的那种。出问题的时候,直接删掉改坏的那份,把备份目录拷回来,比重装程序快得多。
2.3 备份、签名和杀软的现实问题
备份这件事我要多说两句,因为它不是"顺手做一下",而是"不做就别开始"。我的做法是三份:原始安装包一份、原始安装目录压缩包一份、改之前的那个待改文件单独另存一份带 .bak 后缀。第三份最有用,因为你改到一半发现方向错了,可以直接把 .bak 改名回去,不用去翻压缩包。
签名失效是必然的。你动了文件的一个字节,原本的数字签名就失效了,系统的文件属性页里签名信息会变成无效。多数情况下这只影响观感,但杀软的行为就不好说了。启发式引擎看到"一个原本有签名的程序被改过",有一定概率报出可疑提示。我的处理方式是:把改过的程序放在一个固定目录里,然后在杀软里给这个目录加排除,别整个盘排除,也别人云亦云地去关实时防护。加排除是最小代价的方案,既不影响整体防护,也不会每次启动都被拦一下。
3. 三处目标的完整实操
3.1 广告位:从定位到把它变成一张透明图
具体步骤我按顺序写一遍,你照着自己机器上的资源编号来。
- 停掉所有 Bandizip 进程,包括托盘里那个常驻的,任务管理器里确认干净了再动手。
- 用 Resource Hacker 打开目标 exe,左侧资源树里把 BITMAP 和 ICON 两类展开,逐个点开看预览。
- 找到那张横幅比例的图,记下它的资源 ID 和尺寸,比如长宽比明显是横幅的那张。
- 用画图新建一张同样像素尺寸的图,填充成纯色,注意保存成 24 位 BMP,位深度别乱选,因为替换时要求格式兼容。
- 在 Resource Hacker 里对目标资源执行替换,导入你刚做的那张空图,编译保存。
- 如果是"程序动态创建子窗口"的情况,找到那个对话框资源,把承载广告的控件用鼠标拖出可见区域,或者把它的尺寸改成 1 像素。
注意:替换位图时尺寸一定要和原图一致。尺寸不一致虽然能编译通过,但启动之后控件会按新尺寸拉伸,轻则广告位留下一块空白,重则整个工具栏的布局往下挤,比原来还难看。宁可多做一张同尺寸的图,也不要图省事用别的尺寸凑。
还有一种更彻底的做法:把承载广告的控件样式里的可见标志去掉。这个操作在对话框编辑器里是可以做的,效果比替换图片更干净,因为控件根本不渲染。但它对资源的依赖更重,改错一位就可能启动报错,我建议先做图片替换,跑顺了再考虑这一步。
3.2 注册图标:隐藏控件比删控件稳
注册图标的处理分两层,先处理图标资源,再处理控件本身。
图标资源这边,在 ICON 和 ICON GROUP 里找到那个小图标。判断方法很直接:预览区看一眼就认识,通常是一个带符号的小图形。找到之后,用同尺寸的图标文件替换它,做成透明或者纯色都行。这里有个细节,图标和位图不一样,它支持带 alpha 通道的多尺寸图标组,替换的时候尽量选和目标相同规格的格式,不然在不同 DPI 下会显示成白块或者黑块。
控件这边,我的建议是隐藏而不是删除。原因很实在:删除对话框控件之后,资源编译有可能报错,运行时如果代码里还对那个控件 ID 做操作,遇到空句柄就可能直接闪退。隐藏只是让它不渲染,逻辑上控件还在,代码该怎么走还怎么走,稳得多。具体操作是在对话框资源里选中那个按钮控件,修改它的窗口样式,把可见属性去掉,然后编译保存。
提示:如果你改完发现按钮是没了,但工具栏整体往前缩了一段,说明那个位置是自适应布局。这种情况把控件尺寸改成很小并把可见属性去掉,让它在布局里占一个极小的格子,视觉上就看不出来了。
3.3 状态栏文本:字符串表优先,硬编码走同长度覆盖
字符串表这条路径最舒服。资源树里展开 STRINGTABLE,你会看到按语言分组的若干块,中文一份、英文一份。你需要做的是两边都改,理由很现实:程序在什么情况下读哪一份,取决于系统语言和程序自身的语言设置,只改一份的话,换个系统语言环境就又冒出来了。
改的原则是"等长或更短"。字符串表里的条目长度写死在结构里,你填个更长的文本进去,要么被静默截断,要么在界面上把周围控件撑开。我的处理方式是把原来的提示文案替换成几个空格,视觉上那一行就变成了空白。这里要说明,把提示文字改成空白只是视觉上的处理,程序内部的状态判断逻辑并没有任何改变,功能该受的限制一样受限制,这一点一定要清楚。
如果发现改完字符串表界面没变化,那这行字大概是硬编码在代码里的。这时候上十六进制编辑器,用 UTF-16LE 编码去搜原文。搜索的要点是把编码切到 UTF-16LE,不要用默认的 ANSI,否则中文根本搜不到。找到之后,替换的时候严格保持字节数:一个汉字占两个字节,一个空格在 UTF-16LE 里是 0x20 0x00,你要做的就是把这些字节逐个覆盖成空格,字节总数一个不动。多一个字节少一个字节,程序在解析时都可能出错。
顺便说,这是整个流程里最容易翻车的一步。我的建议是先在副本文件上做,覆盖完之后不要急着替换正式文件,先用副本跑一次,确认能正常启动再换。
3.4 回写、校验和第一次启动验证
资源工具保存的时候会重建资源节并更新 PE 头部的校验和,这一步是自动的,你不用管。需要你管的是替换动作本身:先退出程序,再把改好的文件覆盖过去。覆盖之前把原文件改名为带 .bak 后缀留着,这是你的救生圈。
第一次启动要盯三个地方。主界面广告位是不是变成空白了;工具栏上那个图标还在不在;触发提示的那个操作路径下,状态栏有没有那一行字。三个都干净了才算成功。这里有个细节,第一次启动可能会比平时慢一点,那是系统在做文件校验和缓存,属于正常现象,别一慢就以为改坏了。
我还建议你养成一个习惯:改完之后截一张图存下来。原因是你过几个月再想改新版本的时候,这张图就是你的对照基准,能省掉很多"我当时到底改没改"的犹豫。
4. 常见问题和排查实录
4.1 改完打不开、闪退、图标变白块
闪退基本只有两个原因:资源结构被破坏,或者代码引用的资源 ID 找不到对应资源了。排查顺序是从后往前退:把你做的最后一步改动撤销,跑一次;能跑就说明问题出在最后一步,重点检查那一步的格式和尺寸。我遇到过一次,原因是我替换图标时用了带 alpha 的 PNG 转换来的图标,而原资源是不带 alpha 的老格式,程序在低 DPI 环境下取图标直接取了空值。
图标变白块或者黑块,八成是位深度或者 alpha 通道不匹配。解决办法是拿原图标导出成文件,看清楚它的规格,再按同样的规格做替换文件,别自己凭空造一个。
界面整体错位,通常是因为你改了控件尺寸而那个位置是自适应布局。回到对话框资源,把尺寸改回接近原值,只调整可见属性。
4.2 杀软报毒和签名失效
签名失效是机制问题,改不了的,任何修改过 PE 文件的程序都会这样。杀软报警则是概率问题。我的处理原则是:第一,只改自己机器上安装的那一份,不去下载来路不明的"去广告版",这个才是最容易被捆绑的路径;第二,给存放目录加排除,不加全盘;第三,如果某次更新之后杀软开始频繁报警,先怀疑是不是你改的文件被更新覆盖了一半,导致资源结构不一致。
关于"去广告版"这件事我想多说一句。网上流传的所谓免广告包,本质上就是把别人改好的 exe 打包给你,你根本不知道里面加了什么。自己动手改,最大的价值不是省了那点功夫,而是你清楚每一个字节是谁改的。
4.3 自动更新把你的成果冲掉
这个是必然发生的,程序一更新,资源就被覆盖回原样。所以改完之后第一件事就是进设置把自动更新关掉。关不掉的话,就在系统层面处理,或者干脆把改好的目录复制出来做便携使用。
我的实际做法是保留两个目录:一个是正常安装的、跟着官方版本走的目录,用来体验新功能;一个是改好的、冻结版本的目录,日常干活用这个。两个互不干扰,更新爱怎么更新随便它。
4.4 常见问题速查表
| 现象 | 最可能的原因 | 处理方式 |
|---|---|---|
| 启动直接闪退 | 资源结构被破坏或控件删除导致空引用 | 撤销最后一步改动,隐藏控件代替删除控件 |
| 广告位变成白块或拉伸变形 | 替换位图尺寸或位深度与原图不一致 | 用同尺寸同深度 BMP 重新替换 |
| 图标显示成白块黑块 | 图标格式或 alpha 通道不匹配 | 导出原图标看规格,按同规格重做 |
| 字符串改完界面没变化 | 目标文案是硬编码而非字符串表 | 用 UTF-16LE 编码做同长度十六进制覆盖 |
| 界面中英文混杂 | 只改了其中一份语言的字符串表 | 中英文两份字符串表都处理 |
| 杀软提示可疑 | 文件被修改导致签名失效,触发启发式规则 | 给存放目录加排除,不要关闭整体防护 |
| 更新后改动消失 | 程序更新覆盖了资源 | 关闭自动更新,或使用冻结版本 |
5. 我长期用下来的一些体会
5.1 只改自己看得见的部分
折腾界面这件事容易上头,改完广告就想改图标,改完图标就想动对话框,最后动到跟功能逻辑相关的资源上,程序开始不稳定。我的经验是划一条线:只改纯视觉、纯文案的东西,任何跟流程控制、状态判断相关的资源一律不碰。你可能会觉得某个提示很碍眼,但如果那个提示背后牵扯着一段状态机,改它就是在赌。视觉上的干净和功能上的稳定,前者可以妥协,后者不能。
5.2 有些时候换个思路比硬改更划算
如果那三处东西里,只有广告是你在意的,而广告恰好是网络拉取的,那真的没必要去啃资源文件。退回一个没有广告的老版本、把自动更新关掉,五分钟就能解决。资源替换这条路适合的是"本地资源 + 界面洁癖 + 愿意折腾"这三条同时成立的人,缺一条,收益都不划算。
另外还有一个很多人忽略的点:压缩软件在你的工作流里到底承担多少角色。如果你平时只是偶尔解压个安装包,那这个界面看一眼就关,真的不值得为它花两小时。我之所以折腾,是因为我每天要在压缩软件的界面里待很久。
5.3 关于成本这件事
资源编辑这套手艺,本质上是软件界面定制的通用技能,学会了不只用在压缩软件上,很多桌面程序的外观调整都是同一个套路。但这不代表所有场景都该这么办。如果某个软件你每天都在用,而它提供的付费版本正好解决了你的困扰,那买一份是最理性的选择,省下来的时间和踩坑成本远超过那点费用,而且新版本还能一直跟上。
我自己现在的状态是:日常干活的那台机器上留着改好的冻结版本,干净利落;另一台机器上装了官方版本,用来看新功能。两边各取所需,谁也不耽误谁。折腾归折腾,工具终归是用来干活的,界面顺眼就够了,别把它当成一个长期项目养着。