林朗盯着屏幕上那个数字,已经看了四十七秒。
2137。
U盘里文件夹的总数。他昨天数过一遍,今天上班前又数了一遍。2137,一个不多,一个不少。但刚才——就在他打开隐藏sheet准备继续记录周三转账模式的时候——他发现了一件不对劲的事。
隐藏sheet里有一条他昨天没见过的记录。
记录的内容很普通:一个文件夹编号,20190805_124,金额37万,转出账户和转入账户都是陌生的名字。但日期那一栏写着"2019年8月5日"——昨天。
林朗的拇指在鼠标滚轮上轻轻滑动,把这条记录上下滚动了两遍。他的心跳没有加速,至少表面上没有。多年的程序员训练让他学会了在外部保持平静,即使内部正在运行一个占用CPU90%的进程。
他打开U盘根目录,找到文件夹20190805_124。存在。里面有三张银行转账截图,和之前的文件夹格式完全一致。他点开第一张截图,转账日期确实是2019年8月5日。
昨天。
但王建国——他的老板,那个穿着发黄POLO衫看股票行情的男人——昨天说的是"整理第一季度的数据"。第一季度,一月到三月。U盘里的数据应该是历史归档,不是实时更新的流水。
那么,为什么会有一个昨天的文件夹?
林朗靠在椅背上,椅子缺了一个轮子,往左边倾斜了十五度。他没有调整姿势,而是利用这个角度,用余光扫了一眼靠窗的工位。
王建国正在看股票行情,满屏的绿色数字在他脸上投下一种病态的光。他的左手放在键盘上,右手拿着一杯茶——那种泡得很浓的普洱茶,杯子边缘有一圈褐色的茶渍。
林朗注意到一件事:王建国喝茶的频率变了。
昨天,他每十五分钟喝一口茶。今天,每二十分钟。而且每次喝完茶,他都会站起来,走到办公室的饮水机旁,假装加水,然后经过林朗的工位,停顿半秒,再继续走回自己的位置。
半秒。刚好够他看一眼林朗的屏幕。
林朗把隐藏sheet最小化,主界面显示的是第一季度的常规整理表格。他故意在表格里输入了几个错误的数字——把47万写成74万——然后保存。
他等着。
三分钟后,王建国又站起来,端着杯子,走向饮水机。经过林朗工位时,他的目光在屏幕上停留了零点七秒。林朗没有抬头,但他的余光捕捉到了这个停留。
王建国走回自己的位置,坐下来,继续看股票。
林朗把错误的数字改回47万,然后打开了一个新的Excel文件——一个看起来像是"个人财务规划"的普通表格,开始在里面输入一些假数据。房租1200,生活费1500,交通费300。这是他在扮演一个"认真但无聊的员工"。
同时,他的左手伸进裤兜,握住了手机。
他需要截图。但不是用公司的电脑——如果电脑被监控,截图操作也会留下痕迹。他用手机,对准屏幕,快速拍了三张照片。然后把手机塞回裤兜,整个过程用了不到四秒。
办公室里的霉味似乎比昨天更重了。那是一种混合了泡面、旧打印机和墙体返潮的味道,像某种生物正在墙壁内部缓慢腐烂。对面的楼墙距离窗户不到两米,林朗能看清对面厕所瓷砖上的裂纹——一条从左下角延伸到右上角的裂缝,像是有人用钝器砸过。
他深吸一口气,空气里有灰尘的味道。
然后他打开命令提示符——不是通过开始菜单,而是通过Win+R快捷键,这样不会在任务栏留下明显的痕迹。他输入了一行命令:
netstat -an | find "ESTABLISHED"
回车。
屏幕上跳出一串IP地址和端口号。林朗的目光快速扫过每一行,寻找异常的连接。大多数是本地地址,127.0.0.1,还有一些是微软更新的服务器地址。但有一行引起了他的注意:
TCP 192.168.1.107:49213 218.75.123.47:3389 ESTABLISHED
3389端口。远程桌面协议。
有人在远程连接这台电脑。
林朗的指尖微微发凉。他记住了这个IP地址——218.75.123.47——然后迅速关闭了命令提示符窗口。他没有查询这个IP的归属地,不是因为不想,而是因为不敢。如果这台电脑上有键盘记录器,他的每一次搜索都会被记录下来。
他需要用自己的设备查。
林朗在隐藏的sheet里做了一个决定。
他把所有真正重要的发现——周三转账模式、四个"建国"法人、昨天的异常文件夹——全部从公司电脑的隐藏sheet中删除。不是彻底删除,而是转移。他把这些数据用Base64编码,伪装成一段"乱码",粘贴在一个看似无关紧要的Word文档里。文档的标题是"租房合同注意事项",内容是他在网上随便复制的一段租房攻略,中间插入了那段"乱码"。
然后他把这个Word文档保存到U盘,同时又保存了一份到电脑的"我的文档"文件夹里——最显眼的位置,最不起眼的文件名。
做完这些,他开始在公司电脑上整理"真正的工作"——第一季度的数据表格。一行一行,认真但不过度深入。他故意放慢了速度,让进度看起来"正常"。
王建国又站起来,端着杯子,走向饮水机。
林朗的余光跟踪着他的移动轨迹。经过工位,停顿半秒,继续走。今天已经是第七次了。频率在增加——上午四次,下午三次。而且每次停顿的时间从零点五秒延长到了零点七秒。
对方在警惕。
林朗知道自己在玩一个危险的游戏。他的金手指是"数据嗅觉"——能在海量数据中发现隐藏的模式。但这个金手指有一个限制:它需要原始数据访问权限。一旦对方切断他的数据访问,或者给他提供伪造的数据,他的能力就会失效。
现在,对方可能正在做这两件事中的至少一件。
他想起昨天在便签纸上写的那句话:"从数据上看,这不是数据服务公司。"
今天他可以加上后半句了:"而且他们在实时监视我。"
办公室的旧空调发出一阵刺耳的嗡鸣,然后恢复了平稳的嗡嗡声。林朗的电脑风扇也在响,那种得了哮喘的老年人的喘息声。这两种声音混合在一起,形成一种奇怪的背景噪音,像是某种巨型昆虫在不远处的黑暗中扇动翅膀。
他打开浏览器,输入一个招聘网站的网址——不是真的要找工作,而是要建立一个"我在摸鱼"的假象。如果远程连接那头有人在看他,他们会看到一个被裁后找到新工作但仍在偷懒的员工。这种人设是安全的,因为不危险。
招聘网站的页面加载得很慢,图片一个一个地跳出来,像是一场延迟过高的在线游戏。林朗盯着页面,手指在键盘上无意识地敲击,但他的注意力全在命令提示符的记忆里。
218.75.123.47:3389。
这个IP地址的归属地,他大概有七成的把握。3389端口意味着Windows远程桌面,而企业环境使用远程桌面监控员工电脑并不罕见。但异常之处在于:一家注册资本一百万、员工四个人的"数据服务公司",为什么需要在后台建立一个远程桌面连接?而且IP地址不在本地局域网内,而是在外网。
这不像是一个小公司IT管理的常规操作。
这像是——有人在远方看着这台电脑上的每一个像素。
林朗的右手在桌下握紧了手机。他想立刻查询那个IP,但他控制住了自己。在公司网络上搜索这个IP,等于在告诉对方"我已经发现了"。
他需要等到下班。回到出租屋。用自己的电脑。自己的网络。
然后他才能知道,那个IP地址背后是什么。
下午四点十七分,鼠标指针自己动了一下。
林朗正在浏览招聘网站上的一条"数据分析师"职位描述,鼠标指针突然从屏幕中央跳到了右下角,悬停在系统托盘区的网络连接图标上,停留了大约零点三秒,然后跳回原来的位置。
整个过程不到一秒。
如果不是林朗的注意力正处于高度警觉状态,他根本不会注意到这个微小的移动。但他注意到了——因为他的眼睛一直盯着屏幕,而他的手没有碰鼠标。
有人在远程操作这台电脑。
林朗的呼吸停顿了零点五秒,然后恢复正常。他没有抬头,没有表现出任何异常,只是继续滑动鼠标滚轮,浏览招聘网站上的职位列表。但他的余光在观察系统托盘区的网络连接图标——那个图标显示的是"已连接"状态,没有任何变化。
远程操作者是在检查他的工作状态,还是在测试控制权限?
林朗做出了一个决定。他故意在招聘网站上停留了二十分钟,期间打开了三个不同的职位页面,把其中一个的薪资要求从"15-20K"改成了"10-15K"——一个典型的"被裁后降低预期"的行为模式。然后他打开了一个视频网站的页面,搜索"Excel高级技巧教程",点击播放,把音量调到零。
他在扮演一个"能力一般、混日子的数据整理员"。
如果远程操作者在看他,他们会看到一个无聊的员工在上班时间学习Excel技巧——不值得警惕,不值得关注。
视频播放了七分钟。期间鼠标指针又自己动了一次,这次是从屏幕左侧移动到右侧,像是在切换窗口。但林朗没有开其他窗口,所以指针只是空扫了一遍桌面背景——一张系统默认的蓝天绿地壁纸。
对方在试探。或者说,在确认控制权限。
林朗的心跳保持在一个稳定的频率。他知道自己现在处于一场无声的对峙中——对方在暗处,他也在暗处,但对方不知道他已经知道了。
这是他的优势。唯一的优势。
快下班的时候,林朗做了一件冒险的事。
王建国去了厕所。马桶冲水声从走廊尽头传来,混着老旧水管的哐当声。林朗估算了一下——来回至少三分钟。
他把Excel最小化,打开了文件管理器。
不是U盘里的文件——那些他已经摸透了。他要看的是这台电脑本身。
C盘根目录很干净,只有一个Windows文件夹和一个Program Files文件夹,像是刚装完系统。但林朗注意到"用户"文件夹的体积异常:1.7GB。对于一个据说"上一个干了三天就跑了"的临时工位来说,这个体积太大了。上一个员工三天能留下1.7GB的数据?
他点进去。
Documents文件夹里有三个子文件夹:work、backup、temp。
work文件夹是空的。backup文件夹也是空的。temp文件夹里有四个文件,全部以.log结尾,文件名是一串十六位随机字符。林朗双击第一个.log文件,记事本弹出来,里面是一段文本——
他还没来得及看内容,走廊里的脚步声响了。
林朗以最快的速度关闭了记事本,把文件管理器最小化,把Excel重新最大化。整个过程不到两秒。王建国推门进来的时候,林朗正在表格里输入一行新的数据,表情平静,手指稳定。
"收拾一下吧,"王建国说,声音沙哑,"明天给你安排新项目。"
"好。"林朗说。
他保存了Excel,拔掉U盘,合上电脑。站起来的那一刻,他的后背湿了一层——不是热的,是肾上腺素退潮后的冷汗。
但他的脑子里在高速运转。那四个.log文件,十六位随机字符命名,放在一个temp文件夹里——这不是正常用户的行为模式。这是程序生成的日志。什么样的程序会在一台数据整理用的办公电脑上生成加密命名的日志文件?
还有那1.7GB。work和backup都是空的,数据去哪了?是被删除了,还是被转移了?如果是被删除的,回收站是清空的——他之前检查过。
林朗抱着这些疑问走出办公楼。楼道里的声控灯还是不亮,他踩着水泥台阶往下走,每一步都在数。十八、十七、十六……走到一楼的时候,他停下来,回头看了一眼七楼的方向。
那扇绿色的铁门关着。门缝底下没有光透出来。
但他知道,明天他还会推开那扇门。他需要看到那四个.log文件里的内容。如果那些日志里记录的是这台电脑的操作行为——谁在什么时候打开过什么文件、连过什么网络、插过什么设备——那他之前整理U盘数据的所有动作,都已经被记录在案了。
林朗走进南城的黄昏里。烧烤摊的烟雾已经在巷口飘起来了,远处有人在大声吆喝,摩托车引擎的轰鸣声一阵接一阵。他没有回出租屋,而是走到琅跃大桥的引桥口,站在桥栏边,看着琅江的水。
水是浑的,黄绿色,和三天前他站在这里时一模一样。唯一不同的是,三天前他抱的是一个装离职证明的纸箱,现在他揣的是一个装着疑点的脑子。
他掏出手机,打开备忘录,用手指飞快地敲了几个关键词:
"1.7GB用户文件夹。temp下4个.log文件,随机命名。work和backup为空。回收站已清空。"
他盯着这几行字看了几秒,然后又加了一行:
"明天想办法看.log内容。但不要在公司的网络上操作。"
他把手机塞回兜里,转身往出租屋的方向走。
路过高架桥下的阴影时,他下意识地加快了脚步。不是害怕,是程序员的本能——当你发现自己正在被一个未知的系统监控时,第一反应不是逃跑,是想搞清楚那个系统的架构。
但今晚他需要做的第一件事,是查那个IP地址。218.75.123.47。那个通过3389端口远程连接到他工位电脑的地址。
他抬头看了一眼天。雨停了,但天空还是灰的,像是随时会再下。
他加快脚步。
出租屋在前面,六楼,没电梯。楼道里的灯还是坏的。他摸黑上楼,影子在手电筒的光柱里晃来晃去,像是一个跟在身后的陌生人。