幽灵信使的黄昏
第三章:重构幽灵
苏青回来时,已经是第三天傍晚。
她背着相机包走进地下室,身上有雨水的味道和城市灰尘的气息。墨影还在工作台前,周围散落着电路板、老式硬盘和电烙铁。空气中飘着松香和焊锡的味道。
“拍完了?”墨影没抬头,正用万用表测试一块显卡的电压。
“三十六卷,全拍完了。”苏青放下背包,声音里透着疲惫,“冲了十二卷,剩下的带回来了。”
她取出冲洗好的底片,一卷卷挂在暗房的晾干绳上。墨影终于停下手中的工作,走过来查看。
第一张照片:陈薇旧居所在的胡同。二十年过去,老房子大部分已经拆除,原地建起了玻璃幕墙的写字楼。只有一小段残缺的砖墙还保留着,墙上爬满枯萎的爬山虎。苏青拍的是黄昏时分,夕阳在玻璃幕墙上反射出刺眼的光,而那段旧墙沉浸在阴影里,像被时间遗忘的岛屿。
“这里要拆了,下个月。”苏青说,“我拍照的时候,工人已经在围挡上贴了拆迁公告。”
墨影沉默地看着照片。他记得那个胡同的样子——窄窄的巷道,老槐树,夏天时陈薇会在树下摆个小凳子乘凉。现在全没了。
第二张:当年的运输公司旧址。那里现在是连锁超市的停车场,平整的水泥地面,整齐划一的停车线。苏青拍了一张长曝光,车灯在夜色中划出流动的光轨,像某种不息的能量。
“我问了超市员工,没人记得二十年前这里有运输公司。”苏青说,“保安说,他在这里工作五年了,之前是什么他也不知道。”
第三张:赵明远最后出现的地址——一个老旧的小区,楼体斑驳,窗户大多用报纸糊着。苏青拍了一张仰角,楼体在阴沉的天空下显得压抑而扭曲。
“这里快要拆迁了,大部分住户已经搬走。”苏青调出一张数码照片的预览,“但我发现一件事。”
她放大照片。在小区围墙的角落里,有一个涂鸦,已经褪色到几乎看不见,但能辨认出形状:一个简单的幽灵轮廓,旁边写着一个数字“7”。
“我查了,这个涂鸦至少存在十年以上。”苏青说,“但没人知道是谁画的,什么时候画的。”
墨影盯着那个涂鸦。“幽灵和七。幽灵信使v0.7。”
“可能是巧合,也可能……”苏青没说完。
墨影走回工作台,调出一张北京地图,标注出三个地点。“距离。”他说。
苏青测量了一下。“陈薇旧居到运输公司:3.2公里。运输公司到赵明远小区:4.7公里。赵明远小区到陈薇旧居:5.1公里。大致形成一个三角形。”
“重心在哪里?”
苏青计算了一下,在地图上标出一个点。“大概在这里,中关村软件园一带。”
墨影在那个点上画了个圈。“二十年前,那里有个网吧,‘极速网络’,我留下源代码的地方。”
“您认为这些地点有关联?”
“不知道。”墨影说,“但三个点,加上网吧,形成一个四边形的四个顶点。数学上,这不可能是完全随机的。”
苏青想了想,打开笔记本电脑,调出地理信息系统软件,导入四个坐标点。“我可以做个空间分析,看看是否存在统计显著性。”
“先做另一件事。”墨影递给她一个U盘,“这里面是v0.7的全部反汇编代码。我需要你帮我找一样东西。”
“什么?”
“除了那个后门,还有没有其他隐藏功能。”墨影说,“我当年……可能加了一些自己都不记得的东西。”
苏青接过U盘,连接到自己的电脑。“您不记得自己写的代码?”
“人的记忆会扭曲,尤其是带着情绪的记忆。”墨影点燃酒精灯,开始给一块芯片脱焊,“我写v0.7时,陈薇刚去世,我精神状态不稳定。可能为了安全感,可能为了某种偏执的掌控欲,我可能加了不止一个保险。”
苏青理解地点点头。她见过类似的情况——程序员在压力下写的代码,往往包含非理性的设计决策,有时连自己都无法解释。
她开始分析。反汇编代码有十几万行,转换成中间表示后更庞大。苏青编写了几个脚本:搜索可疑的常量、检测异常的控制流、分析加密函数的边界条件。
墨影则继续他的硬件工作。他在搭建一个完全隔离的测试环境:三台老式台式机,分别安装Windows 2000、Windows XP和Red Hat Linux 7.0,通过物理隔离的网络交换机连接,没有任何外部互联网接口。
“为什么需要三个系统?”苏青问。
“因为我不知道‘教授’会在什么环境运行v0.7。”墨影说,“如果他足够聪明,可能会在虚拟机里运行,或者用兼容层。我需要覆盖所有可能性。”
“但二十年前的系统,现在还能运行吗?”
“这就是问题。”墨影指着其中一台机器,“这台装Windows 2000的,用的是当年的原版光盘,但硬件是现代兼容的。结果发现,一些驱动程序不工作,USB接口无法识别。”
他展示一个错误信息:硬件抽象层(HAL)版本不兼容。
“所以我需要真正的老硬件。”墨影指着工作台上的零件,“从旧货市场淘来的:Intel Pentium III处理器、256MB SDRAM、IDE硬盘、GeForce 2显卡。这些部件和当年的系统才是完美匹配。”
苏青看着那些老旧的硬件。“但性能会很差。”
“要的就是差。”墨影说,“我需要精确复现当年的运行环境,包括性能瓶颈和内存限制。任何微小的差异,都可能导致修复程序在真实环境下失败。”
他组装完第一台机器,接通电源。风扇发出巨大的噪音,像在抗议被重新唤醒。屏幕闪烁几下,显示出Windows 2000的启动画面。
“成功了。”墨影说。
苏青继续她的分析。两小时后,她有了第一个发现。
“墨影老师,您来看这个。”
墨影走过去。屏幕上显示着一段反汇编代码:
; 地址: 0x0041A3F0
mov eax, [ebp+8] ; 第一个参数: 数据指针
mov ecx, [eax] ; 取前4字节
cmp ecx, 0x7E3C9F1A ; 与魔数比较 (注意字节序)
jne short loc_41A410 ; 不匹配则跳过
; 如果匹配...
push offset aGhostLog ; "ghost.log"
push eax
call sub_41B200 ; 记录日志函数“这是后门的检测逻辑。”墨影说,“有什么问题?”
“问题在这。”苏青调出另一个函数,“sub_41B200,记录日志函数。我分析了它的实现,发现它不只是记录密钥。”
她展示函数内部:
sub_41B200 proc near
push ebp
mov ebp, esp
push ebx
push esi
push edi
; 打开文件
push 0 ; 模板文件句柄
push 80h ; 文件属性: 隐藏
push 2 ; 打开模式: 打开已存在文件
push 0 ; 安全属性
push 1 ; 共享模式: 只读
push 40000000h ; 访问模式: 写入
push offset fileName ; 文件名
call ds:CreateFileA
mov esi, eax ; 保存文件句柄
cmp esi, 0FFFFFFFFh
jz short loc_41B250
; 写入数据
push 0 ; 重叠结构
lea eax, [ebp+8]
push eax ; 写入字节数
push 16 ; 写入16字节
push dword ptr [ebp+8] ; 数据指针
push esi ; 文件句柄
call ds:WriteFile
; 关键部分
lea eax, [ebp+12]
push eax ; 读取字节数
push 64 ; 读取64字节
push offset buffer ; 缓冲区
push esi ; 文件句柄
call ds:ReadFile ; 读取文件内容
; 将读取的内容加密后写入另一个位置
lea eax, [ebp+8]
push eax
push 64
push offset buffer
call sub_41C000 ; 加密函数
push 0
lea eax, [ebp+8]
push eax
push 64
push offset encryptedData
push esi
call ds:WriteFile ; 写回文件
loc_41B250:
; 关闭文件
push esi
call ds:CloseHandle
pop edi
pop esi
pop ebx
pop ebp
retn 8
sub_41B200 endp墨影皱起眉。“它在读写文件?后门日志文件?”
“不只是日志。”苏青调出内存分析结果,“我动态调试时发现,这个函数会读取一个名为ghost.log的文件,如果文件存在且格式正确,它会将文件内容加密后写入另一个隐藏位置。”
“另一个位置是哪里?”
“取决于系统。”苏青展示几个不同的路径,“Windows 2000下是C:\WINNT\system32\drivers\etc\hosts.bak,Linux下是/etc/.shadow.bak。都是系统目录下的隐蔽文件。”
墨影感到一阵寒意。“它在……备份密钥文件?”
“不是备份。”苏青的声音严肃起来,“是在同步。如果我的分析正确,这个后门机制实际上创建了一个分布式的密钥存储网络。每台运行v0.7的机器,都会读取本地已有的密钥文件,加密后写入隐蔽位置,同时也从隐蔽位置读取其他机器的密钥,解密后合并到本地文件。”
她调出网络包分析结果。在隔离网络环境下,运行v0.7的机器确实在发送加密的UDP广播包,端口号31337。
“它在局域网内寻找其他运行v0.7的实例,交换密钥信息。”苏青说,“这不是简单的后门,这是一个……P2P密钥共享网络。”
墨影坐回椅子,闭上眼睛。记忆在黑暗中浮现。
2003年冬天,地下室很冷。他写完v0.7的基本功能后,开始考虑一个额外的问题:如果自己出事了,如果陈薇需要帮助但联系不上他怎么办?
他想到了分布式存储。把密钥分散在多台机器上,即使某台机器被查封,其他机器上还有备份。即使自己消失了,陈薇也能从其他地方恢复密钥。
但当时的技术有限,他实现得很简陋:局域网广播,简单的加密交换,隐蔽文件存储。
后来陈薇去世,他心灰意冷,完全忘记了这个功能的存在。
“它还在运行。”墨影睁开眼,“二十年后,这个P2P网络还在运行。那些运行v0.7的机器,可能还在交换密钥。”
苏青点头。“而且,如果‘教授’控制了足够多的节点,他可能已经收集到了完整的密钥库。这意味着……”
“他可能能解密所有用v0.7发送过的历史消息。”墨影接过话,“不只是现在的勒索,还有二十年前的所有通信。”
两人沉默。地下室只有老机器的风扇声和CRT显示器的嗡鸣。
“陈薇当年用v0.7发送了什么?”苏青问。
“证据文件:照片、录音、文字记录。”墨影说,“还有一些……私人消息。她有时会用这个工具给我发些日常,说她今天写了什么,看到了什么。她说这样感觉安全,因为只有我能看懂。”
“那些消息的密钥,如果被‘教授’拿到……”
“他就能看到一切。”墨影说,“不只是证据,还有陈薇的私人生活,她的恐惧,她的希望,她那些未完成的小说片段。”
还有她去世前最后几天的消息。墨影记得,陈薇在车祸前一天晚上发来的最后一句话:
“砚哥,我今天去出版社,编辑说我的小说可以出版。她说写得很好,很真实。我突然觉得,一切都在变好。谢谢你一直陪着我。”
这条消息的密钥,现在可能在‘教授’手里。
苏青看到墨影的表情变化。“您想起了什么?”
“没什么。”墨影摇头,“现在重要的是,我们需要升级计划。修复漏洞不够,我们需要销毁那个分布式密钥网络。”
“如何销毁?”
“注入一个‘自杀’指令。”墨影在白板上画图,“编写一个特殊的修复程序,除了修补漏洞,还会向网络广播一个命令:删除所有本地密钥文件,然后停止运行。”
“但如果有些节点离线呢?”
“指令包含时间戳和传播计数。”墨影写下公式,“节点收到指令后,会保存到本地,即使离线,下次启动时也会执行。同时,它会在能联网时继续传播。”
苏青思考着可行性。“这相当于一个自毁蠕虫。风险很高,如果指令被篡改,或者传播失控——”
“我们需要测试。”墨影说,“在隔离环境里模拟整个网络,观察指令传播的效果。”
他看向那三台老机器。“正好,三台机器可以模拟一个小型网络。苏青,我需要你写一个网络模拟器,重现v0.7的P2P通信协议。”
“协议是什么规格?”
“不知道。”墨影坦诚地说,“我需要逆向工程。但好消息是,我们有源代码,可以分析出通信格式。”
苏青点头,开始工作。墨影则继续硬件搭建,组装第二台和第三台测试机。
接下来的二十四小时,地下室变成了时间胶囊。老机器的风扇声此起彼伏,CRT屏幕闪烁,键盘敲击声连绵不绝。墨影和苏青轮流睡觉,一个人工作时,另一个人就蜷在折叠床上休息几个小时。
苏青逆向出了通信协议。确实如她推测,v0.7使用UDP广播,数据包包含版本号、机器ID、时间戳和加密的密钥片段。每个收到广播的实例会验证签名,如果有效就更新本地存储,然后转发给其他已知节点。
“协议很简陋,没有加密验证,只有简单的CRC校验。”苏青报告,“这意味着我们可以伪造数据包。”
“但签名呢?”
“签名只是对数据包的SHA-1哈希,用固定密钥加密。”苏青调出代码,“密钥硬编码在二进制里,是0xDEADBEEF重复四次。”
墨影苦笑。“我当年真是……够敷衍的。”
“但正因为简单,我们才能注入指令。”苏青说,“我写了一个测试工具,可以生成伪造的广播包。已经在一号机和二号机之间测试成功,可以触发密钥删除。”
“好。”墨影说,“现在,我需要你帮我做另一件事。”
“什么?”
“去找一个地方。”墨影调出地图,指向一个坐标,“这里,昌平区,一个废弃的工厂。二十年前,那里有个地下黑客聚会点,我可能在那里……留了一些东西。”
苏青放大地图。工厂位于郊区,周围都是农田,最近的村庄在五公里外。
“什么东西?”
“一个硬件设备。”墨影说,“我当时做了一个实验:把v0.7的完整运行环境烧录到EPROM芯片里,做成一个独立的‘黑匣子’。想法是,即使所有电脑都被销毁,这个硬件设备还能保存关键数据。”
“您把它留在了那里?”
“我不确定。”墨影摇头,“记忆很模糊。我记得做过这个设备,记得去过那个聚会点,但不记得是否留下了,还是带走了。”
苏青记下坐标。“我去找。但为什么现在才想起?”
“因为那个涂鸦。”墨影指着照片上的幽灵轮廓,“那个符号,我在设计黑匣子时用过。我在外壳上刻了一个类似的图案。”
苏青明白了。“您认为那个涂鸦是标记?”
“可能。”墨影说,“也可能只是巧合。但值得确认。”
苏青收拾装备:相机、手电筒、多功能工具、还有一台便携式频谱分析仪——如果真有硬件设备在发射信号,她希望能探测到。
“什么时候出发?”
“现在。”墨影看看表,“晚上去比较好,不容易被人注意。但注意安全,那里可能……不太安全。”
“您指什么?”
“那地方废弃二十年了,结构可能不稳。也可能有流浪汉,或者……”墨影停顿,“其他东西。”
苏青点头。“我会小心的。”
她离开后,墨影继续测试。三台机器组成的模拟网络运行稳定,苏青编写的自毁指令成功传播,所有测试节点都在收到指令后删除了密钥文件,然后停止了v0.7进程。
第一步成功。
但墨影知道,真实世界远比模拟复杂。互联网上的节点分布在全球,网络条件参差不齐,有些机器可能已经关机多年,有些可能在严格防火墙后面。
他需要一种更智能的传播策略。
思考时,他的目光落在墙上的照片上。那张年轻的自己,眼神疲惫但锐利。他突然想起一件事。
他打开一个加密的压缩包,输入密码——陈薇的生日。里面是一些旧文件:设计草图、电路图、还有一份实验记录。
翻到最后一页,他找到了想要的东西:
实验记录 #7 - 2003.12.15
- 项目:幽灵信使硬件版 (GhostBox v1.0)
- 核心:MC68000处理器,1MB EPROM,256KB SRAM
- 功能:独立运行v0.7核心算法,可作为中继节点
- 电源:太阳能电池板 + 可充电锂电池
- 通信:433MHz无线模块,最大范围2km
- 状态:完成原型,已部署在测试点A
- 坐标:40.123456, 116.654321 (工厂)
下面是手绘的电路图和外壳设计。在外壳的角落,确实刻着那个幽灵轮廓,旁边有个小小的“7”。
墨影放大设计图。幽灵图案的线条里,隐藏着微小的二进制编码。他用图像工具提取,转换后得到一串ASCII码:
IF FOUND: CONTACT [email protected]
REWARD: $1000
DO NOT DISASSEMBLE这是他留下的联系方式。但那个邮箱早已废弃,电话号码也换了无数次。
他继续翻看记录。最后一页有一行手写笔记,字迹潦草:
测试点A运行稳定。幽灵在沉睡。
如果有人唤醒它,会知道该做什么。
设计了一个唤醒协议:发送特定频率的433MHz信号,
包含指令“WAKE_GHOST:v0.7”
它会回应,并接受远程命令。
希望永远不会有人需要唤醒它。墨影感到心跳加速。这个硬件设备,如果还在,如果还能工作……它可能保存着最完整的密钥库,因为二十年来它可能一直在接收网络广播,更新存储。
也可能,它已经被‘教授’发现并控制。
他需要告诉苏青。但苏青已经在路上,手机在地下室没信号。
他只能等。
凌晨两点,苏青发来一条加密短信——通过他们建立的临时中继系统:
到达坐标点。工厂大部分坍塌。
发现一个金属箱,埋在废墟下。
外壳有幽灵图案,编号7。
箱子锁着,需要密码。
尝试您的生日,失败。
尝试陈薇生日,失败。
下一步?墨影回复:
密码是:GHOST_IN_THE_SHELL_2003
注意:开箱可能有安全机制。
先不要打开,等我指令。几分钟后,苏青回复:
密码正确。箱子打开。
里面是……一台完整的设备。
屏幕亮着,显示:
“幽灵信使硬件版 v1.0
运行时间:7428天20小时15分
网络节点数:127
等待指令…”
设备在运行。二十年来一直在运行。墨影盯着那条消息。7428天,正好是二十年零四个月。
那个黑匣子,他的幽灵,在废墟里运行了二十年,默默收集着网络中的数据,等待有人唤醒。
而现在,它醒了。
(第三章完)
《幽灵信使的黄昏-重构幽灵》链接:https://www.xdym11235.com/archives/327.html
具体版权规定详见侧栏版权说明页面