一个 bit 引发的血案(下)

在编辑 BCD 文件时,看到了内存诊断程序的条目,心里一动,跟错误提示里的 checksum 产生了一点关联。这是有原因的,当年我买目前安装着的一条内存时,在 ThinkPad 上会引发蓝屏。后来把它安装到现在的 Dell Latitude 5401 上,竟然被 BIOS 自带的自检程序把错误修复了!用软件(尽管是 BIOS 里的)修复硬件错误那还是我头一次遇到,因此该内存一直用到现在。但眼下,前面提到的 checksum 既然触动了我的心弦,决定再测一把。

重启时在开始没找对进入 BIOS 的热键,顺水推舟使用了 Windows 11(第二块硬盘上的系统)附带的 Memory Test 工具,果然,检测到了问题,见下图。

这下,无可推辞,还是得跑一遍 BIOS 的检测流程。于是乎,检测到的问题就再一次被神奇地修复了,赶紧留影纪念,以弥补上次没有存照的遗憾(下图)。可惜的是,着急导致手抖了,文字拍得糊之又糊,需要特别说明,对话框中间的文字是“Memory issues resolved”,😜。

尽管解决了内存问题,可躺平的系统依然一无进展。悻悻地回到家用电脑上看片(片名是《喊山》,故事用的是晋西北的乡村背景,还能看),同时间歇性放空脑袋。然后,就注意到这台电脑也在进行更新,“适用于 Windows 10 Version 22H2 的 08 累积更新”,对应的是 KB5029331,正是尸体系统最后安装的那一个。一个念头陡然升起,对呀,既然这次事故随着这一个更新接踵而至,是不是更新过程中出了什么意外,导致有文件损毁?瞬间做出两个方案。方案 A 是,待这台电脑更新成功后,去系统目录下看一眼更新的文件是否可以比较容易地找出来,以 \Windows\System32 目录为重点检查对象,后续如果有必要,再检查其子目录,如 drivers 等。方案 B 是方案 A 的替补方案,如果方案 A 查找更新后的文件不利,则想办法去微软官网下载 KB5029331 的更新包,将其中的内容作为需要检查的文件列表来源。(顺便再补记一笔,首先尝试的不是这个文件比对,而是进入安装盘的修复功能里,再到其高级功能里,用卸载更新这个功能尝试恢复到更新前,但种种努力都可耻地失败了。)

看片电脑顺利更新完成(没有变成不幸的第二台)后,直奔 System32 目录,按修改日期排序一看,刚刚更新了哪些文件和目录一目了然,数量并不算大。花了十分钟,把它们保持原目录结构复制到了 U 盘上。时至深夜,休息先,一夜无话。

转眼一早醒来。把 U 盘插到躺尸系统所在的机器上,引导进入 Ubuntu。打开 Beyond Compare,选定 U 盘上的 System32 目录和 Windows 10 系统中的 System32 目录进行比对。一番操作下来发现,不同的文件屈指可数。打开文件内容进行进一步的判断,有几个是文本文件,一看内容即行放过,显然不是追索的目标。最后,唯一的一个可疑文件出现了,ci.dll,见下图。

两份副本仅有一个字节的差异,在 U 盘上的一份该字节的值为 8B,而 Windows 10 系统下的一份中,该字节值为 83,差值为 8(见下图),也就是说,有一个 bit 的数据对不上。

为了更加确定这个文件就是问题所在,老夫不惜又到另一台电脑上,下载了 Windows 10 SDK,安装了其中的一小部分组件,主要是为了使用其中的 signtool.exe,用以对这两份 PE 文件进行校验。其结果是可以预料的,Windows 10 系统下的版本通不过校验,而 U 盘上的版本则顺利通过。

这下就不再手软了,把通不过校验的文件改名(加了后缀 .bad),把正确的版本复制进去(没轻易在 Ubuntu 下进行,怕它的 NTFS 驱动再出什么不可预料的幺蛾子节外生枝,特意改用 PE 引导后复制的)。

再次在 Grub2 里选中 Windows 10 启动系统,看到那个旋转的圈圈时,终于放下心来,两天多三天的辛劳(可是没有功劳)总算换回一点成果。比较有喜剧效果的是,登录进入后就收到 Google Play 的邮件,说对开发策略的违例已经解除。原来以为是需要专门编译新版本的安装包,上传到市场上把所有发布轨道滚动推进一遍的,结果听了一位兄弟的传道,把那几个涉及到的测试轨道先暂停了,就迎来了“已解决”的反馈。不过显然,后续还是要抽时间把版本提上去,否则这些轨道怕是恢复起来又有麻烦。

事后回想,那一个 bit 的错误,恐怕还真是那条内存在作祟,瞅空还是换了比较稳妥。但俺是个懒人,谁知道呢,也许它就会成为薛定谔之内存条,总是在换与不换的状态间摆动。

后话一:事后对系统报错时没有指明确切的文件这一现象仍然耿耿于怀,就顺手进一步查看了一下 ci.dll 究竟是何方神圣。在该 DLL 的 PE 文件的版本信息中,是这样描述的,“Code Integrity Module”。看上去,似乎它就是负责进行代码的完整性校验的,怪不得报不出来目标,原来竟是它自己。实在也过于巧合了。

后话二:Beyond Compare 真是最值得买的软件,力挺。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注