MENU

幽灵信使的黄昏-重构幽灵

April 8, 2026 • Read: 12 • 小说阅读设置

幽灵信使的黄昏

第三章:重构幽灵

苏青回来时,已经是第三天傍晚。

她背着相机包走进地下室,身上有雨水的味道和城市灰尘的气息。墨影还在工作台前,周围散落着电路板、老式硬盘和电烙铁。空气中飘着松香和焊锡的味道。

“拍完了?”墨影没抬头,正用万用表测试一块显卡的电压。

“三十六卷,全拍完了。”苏青放下背包,声音里透着疲惫,“冲了十二卷,剩下的带回来了。”

她取出冲洗好的底片,一卷卷挂在暗房的晾干绳上。墨影终于停下手中的工作,走过来查看。

第一张照片:陈薇旧居所在的胡同。二十年过去,老房子大部分已经拆除,原地建起了玻璃幕墙的写字楼。只有一小段残缺的砖墙还保留着,墙上爬满枯萎的爬山虎。苏青拍的是黄昏时分,夕阳在玻璃幕墙上反射出刺眼的光,而那段旧墙沉浸在阴影里,像被时间遗忘的岛屿。

“这里要拆了,下个月。”苏青说,“我拍照的时候,工人已经在围挡上贴了拆迁公告。”

墨影沉默地看着照片。他记得那个胡同的样子——窄窄的巷道,老槐树,夏天时陈薇会在树下摆个小凳子乘凉。现在全没了。

第二张:当年的运输公司旧址。那里现在是连锁超市的停车场,平整的水泥地面,整齐划一的停车线。苏青拍了一张长曝光,车灯在夜色中划出流动的光轨,像某种不息的能量。

“我问了超市员工,没人记得二十年前这里有运输公司。”苏青说,“保安说,他在这里工作五年了,之前是什么他也不知道。”

第三张:赵明远最后出现的地址——一个老旧的小区,楼体斑驳,窗户大多用报纸糊着。苏青拍了一张仰角,楼体在阴沉的天空下显得压抑而扭曲。

“这里快要拆迁了,大部分住户已经搬走。”苏青调出一张数码照片的预览,“但我发现一件事。”

她放大照片。在小区围墙的角落里,有一个涂鸦,已经褪色到几乎看不见,但能辨认出形状:一个简单的幽灵轮廓,旁边写着一个数字“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天,正好是二十年零四个月。

那个黑匣子,他的幽灵,在废墟里运行了二十年,默默收集着网络中的数据,等待有人唤醒。

而现在,它醒了。

(第三章完)

Archives QR Code Tip
QR Code for this page
Tipping QR Code