第三天。
沈谛安已经记不清这是第几次看表。凌晨两点十分,办公室的灯光惨白,从天花板上的格栅灯倾泻下来,照得一切都没有影子——或者说,一切都被照得只剩影子。他的工位在窗边,玻璃窗像一面黑色的镜子,映出他佝偻的背影和屏幕上滚动的代码。
他在追踪那条“蒲公英”地址指向的境外服务器。三天了,对方像一条泥鳅,每次快要触及核心时,IP就会跳转,路由就会重置,数据流就会消失在某个加密隧道的尽头。他换过三种追踪策略,动用了五个跳板,甚至写了一个自动化脚本试图预判对方的下一跳——都没有用。对方的技术在他之上,这一点他已经开始接受。
屏幕上的代码还在滚动。他揉了揉眼睛,指腹触到眼睑时,能感觉到眼球表面的干涩和微热——那是长时间盯着屏幕后,眨眼次数减少导致的。眼球表面像蒙了一层细沙,每一次转动都有轻微的刺痛。他从抽屉里摸出一瓶人工泪液,仰头滴了两滴。冰凉的液体滑进眼眶,短暂的刺痛后是片刻的舒缓。他眨了眨眼,液体顺着泪点流进鼻腔,有一股淡淡的咸味。
办公室很安静。这种安静不是绝对的静,而是由各种细微的声音组成的:服务器散热风扇的低鸣,空调出风口的咝咝声,远处某个房间里偶尔传来的脚步声,还有他自己的呼吸。这些声音混在一起,像一首催眠曲,但他不敢睡。他怕一觉醒来,那些线索就断了。
就在他重新看向屏幕的瞬间,邮箱客户端弹出一条新邮件提示。
“叮”的一声,在安静的办公室里格外刺耳。
发件人:省厅科技信息化处 [email protected]
主题:关于“净土系统”压力测试补充数据的通知
沈谛安的目光在发件人地址上停留了两秒。格式正确,域名正确,甚至连落款的字体和行文风格都和他平时收到的上级通知一模一样。他点开邮件,正文是一段标准的公文,用的是省厅惯用的仿宋字体,行间距、段间距都无可挑剔:
“各相关单位:根据‘净土系统’上线前最后一次压力测试安排,现需补充提交近三月异常流量监测数据。请于48小时内将数据包上传至指定加密通道。附件为数据格式说明及上传工具。”
附件是一个压缩包,名称是“data_format_20240315.zip”。大小1.2MB,时间戳显示今天下午五点零三分创建。
沈谛安的手指悬在鼠标上。一切看起来都很正常,但他没有点开。他盯着那封邮件,眉头慢慢皱起来。额头上有一条细细的皱纹,平时不明显,但一皱眉就深得像刀刻的。
省厅科技信息化处的确负责净土系统的测试协调,他们的公文格式他也熟悉。但这封邮件里有一个细节——日期。今天是3月15日,但上周的内部协调会上,陆天明亲口说过,补充数据的截止日期是3月20日,要求48小时内上传,时间太紧了。当时他还觉得这个安排不合理,但陆天明说“上面定的,就这样吧”。现在这封邮件却要求48小时内上传,按时间算,截止日就成了3月17日,和协调会的安排不符。
他拿起桌上的座机,拨了省厅科技信息化处的电话。听筒贴在耳朵上,能听见线路里轻微的电流声。
响了三声,接通了。一个男声,带着熬夜后的沙哑:“您好,科技处。”
“我是虚拟犯罪调查科沈谛安。想问一下,今天发的那封关于净土系统补充数据的邮件,是你们发的吗?”
电话那头停顿了一秒。这一秒很长,长得沈谛安能听见对方的呼吸声。然后那个男声说:“什么邮件?我们没有发过关于净土系统的邮件啊。你是说那个补充数据通知?那要等下周一才会发,还在走流程。”
沈谛安的心脏猛地收缩了一下。他感觉胸腔里有什么东西被攥紧了,血液涌上头顶,耳朵里嗡嗡作响。他强迫自己冷静下来,说:“好的,打扰了。”然后挂断电话。
听筒放回座机时,他的手微微发抖。
他立刻断开那台电脑的网络连接——拔掉网线,关闭无线网卡,甚至把蓝牙也关了。然后才打开那个附件。压缩包里的内容他用十六进制编辑器看过,只有一个可执行文件:“format_tool.exe”。没有其他隐藏文件。
他没有运行。他打开虚拟机,在一个与物理机完全隔离的沙箱环境里,双击那个文件。
屏幕上,一个命令行窗口闪了一下,然后弹出一个进度条,显示“正在解析数据格式……”。进度条平滑地前进,10%、30%、50%、70%、90%、100%。然后窗口关闭,一切恢复正常——看起来就像什么都没发生过。
但沈谛安知道,一定有东西留下了。
他检查沙箱的内存转储。没有异常进程,没有可疑线程,没有隐藏模块。检查磁盘写入记录。没有新文件,没有修改过的系统文件,没有注册表改动。检查网络连接。沙箱的网络是断开的,木马不可能向外发送数据。
一切正常得反常。正常得让他后背发凉。
就在他准备放弃、准备重新分析那个可执行文件的代码时,屏幕中央突然弹出一个对话框。
不是Windows的系统对话框,也不是任何常见软件的弹窗。那是一个纯黑色的窗口,没有任何边框,没有任何按钮,只有中间一行白色的小字。字体很细,像是某种手写体,但仔细看又不是——那是用像素点阵拼出来的,每一个笔画都带着微小的锯齿。
“您的数据格式已解析完成。如需查看结果,请点击确认。”
沈谛安没有点击。他盯着那行字,手指在键盘上悬着,大脑在飞速运转。这是一个钓鱼邮件。一个极其精准、极其专业的鱼叉式钓鱼攻击。对方伪造了省厅的邮箱,掌握了净土系统压力测试的日程,甚至知道他会先验证邮件真伪——那个“48小时”的时间陷阱,就是为了让他产生怀疑,从而在验证后放下警惕,打开附件。
但为什么?如果是为了窃取数据,这个木马应该静默运行,不应该弹窗暴露自己。
他点开了虚拟机的进程管理器,找到那个弹窗的进程,试图附加调试器。就在他准备操作时,那行白字消失了,取而代之的是一串新的字符:
“S2VsbCBZb3UgRm91bmQgTWUu”
那些字符是白色的,在黑色背景上格外显眼。沈谛安看着它们,心跳开始加速。那是Base64编码——他太熟悉了。他复制下来,在另一个窗口里用标准的Base64解码:
“Kell You Found Me.”
不对。这不是英文,Kell是什么?他重新检查编码,发现字母表顺序被改过了。这不是标准的Base64,而是某种变种——常见的有几种,比如用不同的字符映射表,或者打乱顺序。他花了几分钟写了一个脚本,暴力尝试常见的变种。到第八种时,解码成功:
“如果你找到了我——”
后面还有内容,但被截断了。解码出来的只是第一行。
沈谛安盯着屏幕,忽然意识到一件事:这个弹窗不是木马的恶意行为,而是木马的——邀请函。对方的目标不是窃取数据,而是让他发现这个弹窗,然后被引导去解密密文。这是一场游戏,一场考验,一次——对话。
他继续分析那个弹窗进程,发现它在关闭之前,往沙箱的临时目录里写入了一个加密文件。文件名是一串随机字符:“7f3a8c9d2e1b4f5a”。他把那个文件复制出来,打开,里面是一段看起来毫无意义的十六进制数据:
“4B 65 6C 6C 20 59 6F 75 20 46 6F 75 6E 64 20 4D 65 2E 0A 59 6F 75 20 41 72 65 20 4E 6F 77 20 4F 6E 20 54 68 65 20 4C 69 73 74 2E”
他把这段十六进制转成ASCII,得到一行英文:
“Kell You Found Me. You Are Now On The List.”
又是那个变种的Base64?他把这行英文用同样的方式解码,这次得到了一个完整的句子:
“你在找的,也在找你。”
沈谛安的手指僵在键盘上。指尖能感觉到键帽的微凉和轻微的磨砂质感,但那一刻,他感觉不到自己的手指。他感觉整个人都被定住了,只有心脏在狂跳。
他在找的——三十七个伪造记录,N-37节点,药资,蒲公英。那个“也在找你”的人,就是弹出这个对话框的人,就是那个在链上留下“zkp_fake_clean_07”的人,就是那个自称“K”的人。
对方一直在看着他。从他发现第一个异常开始,从他写下那个渗透脚本开始,从他按下回车键开始,对方就看着他,知道他会追查下去,知道他会发现那个弹窗,知道他会一步步走进这个精心设计的——邀请。
他忽然有一种奇怪的感觉。不是恐惧,不是愤怒,而是一种被看穿的、赤裸的、无所遁形的羞耻感。就像一个人在黑暗中自以为隐秘地行走,却不知道头顶一直有一盏灯照着,每一步都被看得清清楚楚。还有一丝——敬畏。对方了解他。了解他的工作习惯,了解他的技术手段,了解他会如何验证邮件的真伪,了解他会如何分析木马。对方甚至了解他一定会打开那个附件——因为对方知道,他不会放过任何一个疑点。
就像一场提前写好的剧本,他只是按照剧本,一步步走向预定的位置。
他靠在椅背上,闭上眼睛。眼皮后面有暗红色的光晕在浮动,那是视网膜残留的影像。他深吸一口气,又缓缓吐出。办公室里的空气很干燥,带着一股淡淡的臭氧味——那是电子设备长时间运行后产生的味道。他睁开眼睛,重新看向屏幕。
那个加密文件还在。他需要解开它。
第二天上午十点,沈谛安把那个加密文件交给了科里的密码分析工具。
工具运行了六个小时,没有结果。他坐在电脑前,看着进度条一次又一次地从头走到尾,然后弹出“解密失败”的提示。常用的字典、彩虹表、暴力破解,都试过了,解不开。那个加密算法不是标准的AES或RSA,而是一种他没见过的方式——对称加密,但密钥长度和生成方式都极其特殊。他试着逆向那个木马,想找出加密算法的实现,但木马在运行后就自毁了,留下的只有那个加密文件。
下午三点,他正在重新分析那个文件的结构时,手机响了。是陆天明。
“到我办公室来一趟。”陆天明的声音很平静,但沈谛安听出了平静下面的一丝不同寻常。
陆天明的办公室里还有一个陌生人。四十岁左右,穿着件旧夹克,领口磨得发白。头发乱糟糟的,不是那种故意的乱,而是真的没有打理过——有几缕垂在额前,遮住了半边眉毛。眼窝深陷,像是熬了很多夜,但眼睛很有神,是那种常年做实验的人特有的专注。他坐在沙发上,手里捧着一杯茶,没有喝,只是捧着,目光落在茶杯上方的虚空处,像是在思考什么。
“这是海关缉私局的老韩,”陆天明介绍,“韩启明,他们科最近在做新型毒品的光谱特征库。”
沈谛安和老韩握了手。老韩的手很粗糙,指节粗大,指腹有厚厚的茧——那是常年握着移液枪和试管留下的痕迹。握手的力度很轻,但很稳。
“叫你来是有件事,”陆天明说,他的桌上也放着一杯茶,已经凉了,没动过,“老韩他们最近检测到一批新型毒品,光谱特征和以往都不一样。他们怀疑是‘星尘2.0’。”
沈谛安听到“星尘2.0”这个词,心里动了一下。那是那个“蒲公英”文件里提到的——三年无忧记忆的买家,跟踪“星尘2.0”的物流光谱。他感觉有什么东西在脑海里一闪而过,太快了,没抓住。
“光谱数据能给我看看吗?”他问。
老韩从包里掏出一个平板。那个平板的外壳上有几道划痕,边角也磕破了,是经常带出去的痕迹。他调出一张图谱,把平板递给沈谛安。那是一张紫外吸收光谱图,横坐标是波长,从200纳米到400纳米,纵坐标是吸光度。在280纳米的位置,有一个尖锐的特征峰,像一根刺,扎在平滑的曲线上。那个峰的顶端很尖,半峰宽很窄,说明这是一种纯度很高、结构很独特的化合物。
“这是溴代□□衍生物的特征峰,”老韩指着那个峰说,他的声音有点沙哑,但很清晰,“以往的毒品里没见过这个结构。我们查了国际数据库,只有三篇论文提到过,都还是理论阶段。但这里,我们已经查获了实物。”
沈谛安盯着那个峰,盯着那个精确的数值:280.37纳米。他的脑海里忽然闪过那个加密文件。他有一个直觉,疯狂但强烈的直觉——那个密钥,可能就在这张图里。
“这个数据,能给我一份吗?”他问。他的声音很平静,但心跳已经开始加速。
老韩看了陆天明一眼。陆天明点了点头,什么也没说。
回到办公室,沈谛安把那份光谱数据导入了密码分析工具。他的手心有点出汗,手指在键盘上有点滑。他用纸巾擦了擦手,然后开始尝试。
他不是用整个数据作为密钥——那样太长了,有几百个数据点。他试着用那个特征峰的精确数值:280.37纳米。
输入,解密。进度条走到100%。“解密失败”。
他又试了吸光度:0.892。
“解密失败”。
他试着把两个数值拼接起来:280.370.892。
“解密失败”。
他靠在椅背上,闭上眼睛。椅背有点硬,硌得后背疼,但他没在意。他在想:对方是什么人?一个精通网络技术的人,一个知道净土系统核心机密的人,一个——还会化学的人?
化学。
他重新睁开眼睛,看着屏幕上的那个加密文件,看着那串十六进制数据。如果对方把化学和密码学结合起来,会怎么做?不是用数值本身作为密钥,而是用数值经过某种变换后的结果。比如——哈希值。
他把“280.37”和“0.892”拼接成一个字符串:“280.370.892”。然后计算了SHA256。那串哈希值很长,64个十六进制字符。他用这个哈希值作为密钥,尝试解密那个文件。
屏幕上,进度条开始走动。1%、5%、10%、20%——这一次,进度条走得比以往都慢,像是在进行复杂的运算。30%、40%、50%——
成功了。
解密后的文件只有一行字。那行字是黑色的,在白色的编辑框里显得格外刺眼:
“他们在用你筑的墙,搭建新神殿。想看清,跟踪‘星尘2.0’的物流光谱。”
沈谛安盯着那行字,一动不动。他感觉自己的呼吸都停了。
你筑的墙——净土系统。那是他参与设计、审计、测试的系统,那是他用无数个日夜筑起的数据高墙,那是他认为能挡住所有不该进来的人的保护屏障。他曾经为它骄傲,为它熬夜,为它反复检查每一行代码。他在心里把它当成自己的作品,自己的孩子。
新神殿——建造在墙里的神殿。用他的墙,搭建他们的神殿。他们是谁?神殿里供的是什么?他不知道,但他能感觉到那背后的黑暗。
他忽然想起陆天明说的那句话:有些墙,不是用来挡住外面的人,而是用来让里面的人看不见彼此。
他们用他的墙,遮住了自己的影子。而他,还在墙外拼命地砌砖,以为自己在守护什么。
十分钟后,沈谛安再次坐在陆天明的办公室里。
这一次,他把所有东西都摊开了。打印出来的邮件截图,钓鱼木马的分析报告,那个加密文件,解密后的那句话,还有他整理的整个时间线——从N-37节点的异常开始,到三十七个伪造记录,到药资的发现,到蒲公英的弹窗,再到今天的解密。
陆天明一份一份地看。他看得很慢,每一页都要看好几分钟。他的脸上没有表情,只有眼睛在动,从左到右,从上到下,像扫描仪一样。办公室里很安静,只有纸张翻动的沙沙声。
窗外的光线在变化。下午的阳光从西边斜射进来,在地板上投下一道金黄色的光带。光带里有细小的尘埃在浮动,缓慢地、无意义地盘旋。随着时间的推移,光带慢慢移动,爬上墙壁,最后消失不见。黄昏来了。
陆天明看完最后一页,把材料放下。他沉默了很久,久到沈谛安以为他不会说话了。然后他站起身,走到茶几旁边。那里有一套茶具,是他前几天带来的——老伴说他不会生活,让他练练泡茶。他动作生疏地烧水、温杯、投茶、注水,手法笨拙得像个刚学做饭的人。
“老伴说我不会生活,让我练练。”他一边泡茶一边说,头也没抬,“你说,我都五十二了,还能学会吗?”
沈谛安没回答。
陆天明泡好两杯茶,推过一杯给沈谛安:“喝了再走吧。”
沈谛安端起茶杯。茶汤颜色很淡,泡得太浅了。
陆天明回到办公桌前坐下,双手交叠放在桌上,看着沈谛安。他的声音比平时更沉,更哑,像是从很深的地方发出来的:
“谛安,你知道我做了多少年警察吗?”
“三十年。”
“三十年里,我见过很多事。”陆天明的声音很沉,“有些事,有答案。有些事,没有。有些事,有答案但你不能说。有些事,有答案但你说了也没用。”
他顿了顿,眼神里有某种复杂的东西——疲惫,了然,还有一点点沈谛安从未见过的——决绝。
“但这个,”他指了指桌上的材料,“不一样。这个,已经超出了我能处理的范围。”
沈谛安等着他说下去。他感觉自己的心跳很慢,很稳,像是在等待什么不可避免的事情发生。
“我不是技术人员,但我看得懂。”陆天明看着他,“对方能侵入你的电脑,能绕过你设下的所有防线,能知道你在查什么,还能用海关的光谱数据做密钥——这不是一个人能做到的。这是一个团队,一个懂技术、懂化学、懂我们内部运作的团队。”
他顿了顿:“而且,他们在帮你。”
沈谛安没有说话。他知道陆天明说的是对的。那个K,不管他是谁,不管他的目的是什么,他在用他的方式,把线索递到他们手里。那些伪造的记录,那个蒲公英地址,那个用光谱数据加密的信息——都是在帮他们看见那些被遮住的东西。
“所以我们现在面对的是什么?”陆天明问,“一个犯罪组织?一个黑客团伙?还是别的什么?”
“我不知道。”沈谛安说。他的声音很平静,但每一个字都像从心里挖出来的。“但我知道,如果那个‘新神殿’真的建成了,净土系统就不再是保护公民隐私的工具,而是他们洗白犯罪、隐藏交易的——帮凶。”
陆天明点了点头。他沉默了几秒,然后做出了一个决定。那个决定像是从他身体里很深的地方升起来的,带着一种释然,也带着一种沉重。
“我需要一个团队,”他说,“一个能处理这种事的团队。不归常规编制管,不按常规流程走,能自己决定调查方向,能调用一切需要的资源。”
他看着沈谛安:“你负责。”
沈谛安愣了一下:“我?”