把「最新版」拆开看:一次基于 46.2 MB 安装包的逐项比对
2026 年 2 月 14 日晚上 21:47,我坐在书桌前,把两个 imtoken 安装包放进同一个文件夹:一个是从官方页面点下来的,46.2 MB;另一个是同事转给我的镜像站链接,48.0 MB。两个文件名里都写着 v1。我当时的第一反应不是怀疑,是好奇——同一个版本号,为什么体积能差将近 2 MB。
我先算哈希。命令行里跑了两遍,官方的 SHA-256 是 8f3c 开头,镜像的以 6a1d 开头,前六位就分开了。我把结果抄在方格纸上,抄第二遍的时候错了一位,又重算了一次。这个细节没什么技术含量,但它让我意识到,人眼比对哈希这件事本身就不可靠,后面必须换方法。
接下来是签名。我用 apksigner 分别验证,官方包的证书序列号是 0x3b7e,镜像包的证书序列号是 0x9c02,签发者字段的 CN 完全不同。到这一步,结论已经很清楚:这不是同一个发布者的东西。版本号可以抄,包名可以抄,签名抄不了。
这里插一句操作层面的东西:如果你手边只有手机,没法跑命令行,至少要做两件事——核对下载页面的域名,以及在系统设置里看安装来源的证书信息。用 vivo X90 的内置浏览器时,证书提示的交互逻辑和 Chrome 不同,具体绕法我写在 澳门477477.cm的浏览器打开教程 里,这里不重复。
中间还有个插曲。2 月 15 日凌晨 00:26,我把截图发给在杭州做安卓逆向的老周,他 38 岁,做安全审计快十年。他回得很短:「你先看包名。」我去看了 applicationId,两个包一致。他接着说:「那就看签名,签名不一样就别装了,没什么好分析。」这句话有点绝对,但那天晚上我确实没再往下拆。
真正让我兴奋的是后面那一步。我把两个包都解压,对比 assets 目录,镜像包里多出一个 JSON 配置文件,27 个键,指向三个不在官方域名白名单里的接口地址。其中一个接口的路径里带 collect。我不敢断言它做什么,因为我没有抓包,也没有跑起来看。但这个文件的修改时间,比官方包里任何一个文件都晚 6 天。这说明镜像包不是从官方包直接改名的,而是被重新打包过。
「版本号是给人看的,签名是给机器看的。人会被骗,机器不会。」 —— 老周,2026 年 2 月 15 日 00:31,微信原话
还有一个容易被忽略的点:文件名、应用内「关于」页、官网按钮下面的说明文字,这三处都出现了「v1」,但它们指的不是同一个对象。文件名里的 v1 是打包时的命名约定;应用内的 v1 是 build 号的一段;官网文字里的 v1 更像营销口径。我个人的观点是——把这三处混为一谈,是绝大多数「下错版本」问题的根源。这个看法可能有点苛刻,但我确实没见过一次例外。
过程中还有一件小事值得记下来。2 月 13 日下午,我把哈希清单存成 txt 发给同事,他在华为 Mate 60 上用 QQ 浏览器点开,页面直接跳到了一个在线阅读站。文件名里带「清单」两个字,被内容识别拦了。这件事本身和版本校验无关,但它说明一件更麻烦的事:你传给别人的校验材料,可能在送达之前就已经变形。完整的排查过程我单独写在 qq浏览器打开默认是小说 里。
写这篇文章时我一直在想一个问题:为什么关于「下载最新版」的内容,大部分都在讲怎么点按钮,很少有人讲点完之后怎么确认点到的东西是对的。我猜是因为前者容易写,后者需要工具、需要时间、需要一点耐心。但这恰恰是唯一有意义的部分。校验这件事没有捷径,哈希、签名、包名,三样东西各查一遍,加起来不到十分钟,却能挡掉绝大多数问题。
最后说配图。这篇里的流程图是我自己画的,参考了三个环节:下载路径、哈希比对、签名查看。素材来自一份整理过的清单,27 张无版权图,全部标了来源和许可,方法在 正版图库资料免费订阅 里。用图这件事我比较固执,宁可多花四十分钟找可用的,也不用一张来源说不清的。
那天晚上 23:58,我合上电脑,方格纸上密密麻麻记了三页。没有结论性的发现,只有一个很朴素的判断:下次再有人跟我说「最新版」,我会先问一句,你说的是哪个 v1。