林朗关上出租屋的门,反锁,又检查了一遍门锁。
然后他站在门后,听了整整一分钟。楼道里没有脚步声,没有咳嗽声,没有钥匙碰撞的叮当声。只有对面住户的电视在响,播的是某部古装剧的片尾曲——一个女声在咿咿呀呀地唱,歌词听不清,但旋律很熟悉,像是奶奶那辈人会听的调子。
他走到窗前,把窗帘拉上。窗帘是米黄色的,洗得发白,边缘有一圈褐色的水渍——大概是楼上漏水留下的。拉上之后,房间里暗了下来,只剩下电脑屏幕的电源指示灯在闪烁,像一只在黑暗中眨动的红眼睛。
林朗没有立刻开灯。他站在黑暗中,从裤兜里掏出手机,打开飞行模式,然后把手机塞进抽屉里——和充电宝、数据线、几枚硬币混在一起。他不确定手机有没有被监听,但从今天起,他要把"确定"和"不确定"当成同样危险的东西来处理。
这是他作为程序员的思维方式:不信任任何未经验证的假设。
他打开台灯。台灯是二手的,灯罩缺了一个角,灯光从缺口处漏出来,在墙上投下一个不规则的光斑。他坐到椅子上,椅子是塑料的,坐上去会发出轻微的嘎吱声。他打开电脑——不是公司那台,是他自己的,一台用了四年的联想笔记本,键盘上的字母"A"和"S"已经磨得看不见了。
电脑启动的声音在寂静中显得格外响。风扇转了大概十秒钟,然后稳定下来,发出一种持续不断的、类似远处飞机引擎的嗡嗡声。
林朗从抽屉深处摸出一个U盘——不是公司那个,是他自己的,一个银色的,32G,里面装着他的个人文件、简历、还有一些从前公司备份出来的项目代码。他用这个U盘启动了一个虚拟机——Ubuntu系统,独立网络环境,所有流量走TOR代理。
他深吸一口气。空气里有霉味,混着楼下烧烤摊飘上来的油烟味,还有一种说不清的、像是旧书页的气息。他打开浏览器,输入一个IP查询网站的地址。
218.75.123.47。
回车。
页面加载得很慢,TOR代理的延迟在300毫秒左右。他盯着屏幕,手指在桌面上轻轻敲击,节奏是《小星星》的前四个音符——这是他从小到大的习惯,紧张的时候就会敲这个节奏。
页面跳出来了。
IP地址:218.75.123.47 归属地:中国,琅城市,北城区 运营商:琅城电信 ASN:AS4134
林朗盯着"琅城市"三个字看了很久。归属地在本市,说明不是外地黑客入侵,而是本地有人在监控。他继续往下滚动页面,查看更详细的信息——WHOIS记录、历史解析、关联域名。
有一条记录引起了他的注意。
该IP地址于2019年3月注册,注册机构:琅港科技服务有限公司。关联了两个域名,一个国际后缀,一个国内后缀。
琅港科技。
林朗把这个名字记在心里。
林朗靠在椅背上,塑料椅子发出一声刺耳的嘎吱。他感觉后颈有点凉,不是空调吹的——出租屋没有空调,只有一台用了十年的电风扇,现在还没开。那种凉意是从皮肤里面渗出来的,像是有人在他的脊椎骨上贴了一块冰。
他不是在和一个骗子打交道。他是在和一个有远程监控系统、有完整IT基础设施的公司打交道。
什么样的"数据服务公司"需要运营GPS监控系统、建立远程监控网络?
林朗知道答案。他知道得太清楚了——因为这种架构他见过。在前公司,他们给一个大客户做过类似的系统:车辆管理、远程监控、数据汇总。那个客户是一家物流公司,有上千辆货车,需要实时跟踪位置和油耗。
但琅港科技的客户是谁?那些转账记录里的"周三下午三点"又是谁在使用这个系统?
林朗打开一个新的终端窗口,输入一行命令:
查询该域名的注册信息。
回车。
信息一条一条地跳出来。注册时间:2018年9月。注册人:周正。留了一个工作邮箱和一个本地座机号码。
周正。
这个名字他在哪里见过。他翻找记忆——对了,那张名片。被裁那天,在侧门台阶上捡到的。
林朗从抽屉里翻出那张名片。名片已经有点卷边了,边角处有一圈褐色的污渍——可能是雨水,也可能是咖啡。他把名片放在键盘旁边,和屏幕上的WHOIS信息并排放在一起。
同一个名字。同一个公司体系。
他打开一个企业信息查询平台,输入"琅港科技服务有限公司"。搜索结果第一条:"琅港科技服务有限公司——琅港投资发展有限公司全资子公司,主营GPS车队管理系统、企业级车辆监控解决方案……"
林朗的指尖开始发凉。
从数据上看,他在追查一条线。但从现实上看,他可能在追查一张网。一张由公司、法人、IP地址、域名、名片构成的网。而他,林朗,被裁的程序员,现在正坐在这张网的边缘,用一个虚拟机和一根TOR代理,试图看清这张网的全貌。
他想起昨天在公司,王建国说:"从明天开始,U盘里的数据你不用看了。"
从明天开始。不是今天,是明天。为什么不是今天?因为今天他们还在用远程监控观察他的反应?还是因为他们需要时间转移数据?
林朗看了一眼屏幕右下角的时间:21:47。
距离"明天"还有不到三个小时。
林朗决定做一件事。
他打开一个新的虚拟机快照——这是他在大学时就养成的习惯,每次做危险操作前先备份。然后他启动了一个Python脚本,这是他从前公司带出来的一个域名关联分析工具,原本用来分析竞品网站的CDN架构。为了今天这件事,他花了两个小时改造脚本——替换了查询接口,加了批量关联比对和去重逻辑,又绕过了几个API的频率限制。现在它勉强能当一个企业关联挖掘器用。
脚本的逻辑很简单:输入一个域名,查询其WHOIS信息、MX记录、NS记录、历史解析IP,然后通过关联算法找出共享相同注册信息、相同服务器、相同邮箱的其他域名。
他把琅港科技的域名丢了进去。
终端窗口开始滚动。一行行数据跳出来,像是一场延迟过高的直播。林朗的眼睛快速扫过每一条记录,寻找异常点。
第一条关联:琅城数据公司,和他现在的"雇主"同名。共享同一组域名解析服务器,注册邮箱后缀也指向琅港科技。
琅城数据。林朗现在的"雇主"。
第二条关联:琅江物流公司。他在U盘转账记录里见过这个名字。共享同一个注册商,历史解析IP指向同一个地址。
琅江物流。他在U盘转账记录里见过这个名字。
第三条关联:琅兴科技公司。也是转账记录里的收款方之一。共享同一个备案号前缀。
琅兴科技。也是转账记录里的收款方之一。
林朗的手指在桌面上敲击的节奏变了,从《小星星》变成了《命运交响曲》的前四个音符。他的心跳没有加速,至少表面上没有。但他是程序员,他知道自己的肾上腺素正在上升——瞳孔轻微放大,指尖微微发凉,呼吸频率从每分钟14次提升到了16次。
这些都是数据。身体的数据。
屏幕上跳出了最后一条关联信息:
服务器物理地址:琅城市北城区琅江路88号,琅港大厦B座3楼机房。
琅江路88号。
林朗盯着这个地址看了很久。他从抽屉里翻出另一张便签纸——那张写着招聘软件上公司地址的纸。南城建设路88号七楼,北城琅江路88号六楼。
同一个门牌号。南北城各一个。
但这是不同的。北城的琅江路88号是"琅港大厦"——听名字就知道是琅港资本的物业。而他现在查到的服务器机房,就在琅港大厦B座3楼。
也就是说,监控他的电脑、制造GPS追踪器、接收那些周三转账的公司,全都指向同一个地址。
林朗靠在椅背上,椅子又发出一声嘎吱。他看着天花板——天花板上有一块水渍,形状像一只歪歪扭扭的鸟。他盯着那只"鸟",脑子里在跑一个循环:
如果这些都是关联公司,那么U盘里的转账记录就不是普通的"数据整理"——而是某种内部资金流转记录。
如果他能看到这些记录,说明他被招进这家公司不是偶然。
如果王建国说"上一个干了三天就跑了",那么上一个可能不是"跑"了——而是"被发现"了。
林朗的右手在桌下握紧了。他想关掉电脑,立刻离开这座城市。但他的左手还在键盘上,手指悬停在下一个命令的上方。
他输入了最后一行查询——检查该域名的邮件服务器地址。
企业邮箱的服务器地址。如果他能找到邮件服务器的IP,就能进一步确认这个网络的范围。
结果跳出来了:邮件服务器和网站服务器指向同一个IP。
同一个IP。邮件服务器、远程桌面、Web服务器,全都在同一个IP上。这不是一个正常的企业IT架构——正常的企业会把不同服务分布在不同服务器上,以提高安全性和可用性。
这种架构只有一种解释:这是一个小而封闭的系统,不对外开放,只供内部使用。或者说,这是一个"影子系统"——表面上不存在,但在内部运转着所有的监控、转账、通信。
林朗打开一个空白文档,开始打字。他的手比脑子快,噼里啪啦地敲了大概五百字——全是发现、关联、推测。他像一台正在全速运转的机器,把所有碎片拼成一张越来越大的图。
打了大概一千字,他停下来,喝了一口水。水是温的,带着一股铁锈味——出租屋的水管老了,他从没叫房东修过,因为不知道还要在这里住多久。
他看着屏幕上的文字,忽然觉得它们很陌生。不是内容陌生,是语气陌生。那种冷静、精确、不带感情的叙述方式,像是一份技术报告,而不是一个人的恐惧记录。
他一直以来都是这么写的。用数据说话。用逻辑推理。用排除法得出结论。
但此刻,他第一次觉得这种写法有一个致命的缺陷:它把所有的危险都包装成了"信息",让人忘记了这些信息背后是什么。
不是数据。是人。
林朗保存了文档,然后把U盘从抽屉里拿出来。
不是公司那个U盘——那个他今天下班前已经小心地放回了抽屉最深处,伪装成从未动过的样子。这个是他自己的U盘,他要用它做一个对比检查。
他把U盘插进电脑,打开文件管理器。U盘里有一个文件夹叫"backup_20190709_v1"——就是他之前做的那份"个人财务规划"。里面还有一个隐藏文件夹,用 attrib +h 命令隐藏的,名字是".system_cache"——这是他用来存放敏感文件的伪装目录。
他打开隐藏文件夹,里面有三个文件:
他点开 personal_notes.txt,准备把刚才的新发现写进去。
然后他的手指停住了。
文件的修改时间是:2019-08-06 14:32:37。
今天下午两点半。
但他最后一次修改这个文件是昨天晚上十一点。他记得很清楚,因为他设置了一个定时任务,每天晚上十一点备份当天的笔记。
有人今天下午访问过这个U盘。
林朗的呼吸停顿了零点五秒,然后恢复正常。他迅速检查了U盘的文件系统日志——Windows下可以用事件查看器查看USB设备的插拔记录。但他很快意识到,如果对方的监控手段足够高级,他们可能已经清除了日志。
他换了一个思路。他打开命令提示符,输入:
dir /T:W .system_cache*
显示所有文件的最后修改时间。
三个文件的时间戳都变了。ip_trace.md 的修改时间是 14:33:12。company_links.xlsx 是 14:33:45。personal_notes.txt 是 14:32:37。
时间间隔均匀,像是某种自动化的扫描程序——插入U盘,扫描文件,生成报告,拔出U盘。整个过程不到两分钟。
林朗看着这些时间戳,忽然觉得房间里变得很安静。电风扇不知道什么时候停了——可能是电压不稳,也可能是房东又忘了交电费。电脑风扇的嗡嗡声还在,但那个声音不再像飞机引擎,而像是某种巨大的昆虫在不远处的黑暗中扇动翅膀。
他的U盘一直放在抽屉里。抽屉在桌子下方,距离他的膝盖不到三十厘米。
今天下午两点半,他在公司上班。有人在两点半到两点半零三分之间,进入了他的出租屋,打开了他的抽屉,插入了他的U盘,扫描了他的文件,然后把一切恢复原样。
或者,更可怕的是——他们没有进入出租屋。他们有某种远程手段可以访问这个U盘。
但U盘没有联网功能。除非……
林朗的目光移到了电脑旁边的一个设备上——一个白色的、方形的小盒子,那是他三个月前买的路由器,用来给出租屋提供WiFi。当时他在一个网购平台上随便选了一个销量最高的,没有看任何参数。
如果路由器被入侵了,那么所有连接到这个WiFi的设备都会被监控。他的电脑、他的手机、甚至他的智能手表——如果他有的话。
他打开路由器的管理页面,输入默认地址192.168.31.1。用户名和密码都是默认的——admin/admin。他从来没有改过。
登录成功。
他查看了连接设备列表。除了他的笔记本和手机,还有一个陌生的MAC地址:00:1A:2B:3C:4D:5E。设备名称显示为"Unknown Device"。连接时间:2019-08-05 09:15:23——昨天早上。
昨天早上。就在他发现公司电脑被远程监控的同一天。
林朗的手开始发抖。不是剧烈的抖,是轻微的、几乎看不出来的颤抖,像是一片被风吹动的树叶。他把手放在膝盖上,试图让它稳定下来,但它不听话。
他不是在和一个骗子打交道。他不是在和一个公司打交道。
他是在和一个知道他每天几点出门、几点回家、用什么路由器、连什么WiFi、U盘里有什么文件的……人。或者说,组织。
而这个人或组织,已经知道他发现了什么。
林朗忽然想起今天下午王建国说的那句话:"从明天开始,U盘里的数据你不用看了。"
不是威胁。是通知。
他们已经知道他知道了。所以他们不需要再让他看U盘了。他们要做的事情,在"明天"会发生。
林朗看了一眼时间:22:17。
距离"明天"还有两个多小时。
林朗关掉了路由器的管理页面。
他没有拔掉那个陌生设备的连接——如果他现在断开它,对方会立刻知道他发现了。他只是静静地坐着,看着屏幕上自己的倒影。
屏幕上的林朗是一个瘦高的年轻人,戴着黑框眼镜,眼镜滑到了鼻梁中段。他的眼睛下面有淡淡的青黑,嘴唇干裂,头发油腻——他已经三天没有好好洗头了。他看起来不像一个发现惊天阴谋的英雄,他像一个被生活压垮的普通人。
而这正是他最真实的样子。
他打开一个空白文档,把光标放在第一行。他本来想写一份完整的证据清单,或者一个逃跑计划,或者一封给家人的遗书——如果他出了什么事,至少有人知道他发现了什么。
但他的手指停在键盘上,没有动。
他想起大学毕业那天,在学校的操场上,他和室友喝啤酒。室友问他:"林朗,你将来想干嘛?"
他说:"我想用数据改变这个世界。"
室友笑了,说:"数据能改变什么?改变房价吗?"
他那时候很认真地说:"数据不会骗人。只要数据足够多,就能推导出一切真相。"
室友没有反驳,只是又开了一瓶啤酒,说:"那你可得小心了。万一有人用假数据骗你呢?"
他当时不屑一顾。他觉得,以他的能力,假数据逃不过他的眼睛。
但现在,他看着屏幕上那些时间戳——那些可能被篡改的时间戳,那些可能被伪造的WHOIS记录,那些可能被植入的"关联信息"——他忽然意识到,他已经无法分辨什么是真数据,什么是假数据了。
对方比他更懂数据。对方不仅能伪造数据,还能控制他获取数据的渠道。他查到的每一条信息,都可能是对方想让他查到的。
他的"数据嗅觉",他的金手指,在这个级别的对手面前,变成了一个笑话。
林朗靠在椅背上,闭上了眼睛。电脑风扇的嗡嗡声在寂静中显得格外响,像是一种持续的、单调的嘲笑。他想起今天在公司的Excel表格里写下的那两个字:"正常"。
这两个字是他写的最讽刺的内容。
因为从他坐进那间办公室的那一刻起,从他连上那个WiFi的那一刻起,从他插入那个U盘的那一刻起——就没有任何东西是正常的。
他睁开眼睛,重新看向屏幕。光标还在闪烁,像一只在等待命令的眼睛。
他输入了一行字:
"数据不会骗人,人会。"
然后他盯着这行字看了很久。他的手悬停在键盘上方,食指悬在退格键上,但没有按下去。
不对。
他删掉了"不会"两个字,光标停在"骗人"前面。然后他输入了两个字:
"也会"
"数据也会骗人,人会。"
他看着这行字,嘴角扯出一个没有笑意的笑容。这是他的新座右铭。不是抛弃数据,而是不再盲目相信数据。数据可以是武器,也可以是陷阱。关键在于,使用数据的人是否知道自己在做什么。
而他,林朗,从现在开始,不仅要收集数据,还要收集数据之外的东西——人的行为,人的表情,人的眼神,人的气味。因为有些东西,数据算不出来。
比如,王建国今天下午说"明天开始"的时候,他的左手在桌下握紧了手机。那个动作在数据上没有任何意义——它不会出现在任何日志里,不会留下任何数字痕迹。但对林朗来说,那个动作意味着:王建国在紧张。而紧张的人,最容易犯错。
林朗保存了文档,文件名是"notes_20190806_revised"。然后他关掉电脑,站起来,走到窗前,拉开窗帘。
窗外是南城的夜景。不是北城那种霓虹闪烁的夜景,是另一种——老旧的居民楼里亮着一扇扇黄灯的窗户,楼下有烧烤摊的烟雾飘上来,远处传来摩托车引擎的轰鸣和几声狗叫。
下雨了。雨点打在窗玻璃上,发出细碎的声响,像是一种来自远方的警告。
林朗看着窗外的雨,忽然想起一件事。
今天是2019年8月6日。距离他被裁,已经过去了二十八天。
二十八天里,他从北城搬到了南城,从CBD的白领变成了老城区的租客,从一家上市公司的高级工程师变成了一家注册资本一百万的小公司的"数据整理员"。
二十八天里,他发现了一笔1.28亿的异常流水,十七条周三转账,四个"建国"法人,一个远程桌面连接,一个GPS追踪器,和一个庞大的、他看不见全貌的监视网络。
而这一切的起点,只是一张在侧门台阶上捡到的名片。
林朗把手放在窗玻璃上。玻璃是冰凉的,雨水的温度透过玻璃传到他的掌心。他想起父亲说过的话——那是很久很久以前,他还在上小学,父亲骑着自行车带他过琅跃大桥。那时候父亲还没开始喝酒,还爱笑,还会在他头上揉一把,说:"朗子,记住,南城人走侧门不丢人,能走到对岸就行。"
那时候他不明白什么叫对岸。他以为对岸就是北城,就是高楼大厦,就是走正门的地方。
现在他明白了。对岸不是北城。对岸是活着。
而他已经没有退路了。
林朗关上窗户,回到桌前,从抽屉里拿出一个笔记本——不是电脑,是纸质的,那种最便宜的、一块五一本的软皮笔记本。他翻开第一页,用黑色水笔写下:
"2019-08-06,雨。"
然后他停下来,想了想,又加了一句:
"从明天开始,我不仅要看到数据,还要看到数据背后的人。"
笔尖在纸上划过的沙沙声,在寂静的房间里显得格外清晰。林朗写得很慢,一笔一划,像是在刻某种碑文。
写完之后,他合上笔记本,把它塞进床垫下面——这是他小时候藏压岁钱的地方,没想到二十六岁了还在用。
然后他站起来,关掉台灯,走到床边,躺下。
他没有立刻睡着。他睁着眼睛,看着天花板上的那只"鸟"——那块水渍在黑暗中只是一个模糊的轮廓,像一只正在展翅的、不知道飞向哪里的鸟。
楼道里传来脚步声。
很轻,很小心,像是刻意控制着不要发出声音。但林朗听到了——不是因为他耳朵好,而是因为这个时间(22:43),这个地点(六楼老小区),不应该有人用这种方式走路。
脚步声在他的门口停了一下。
大概停了三秒钟。
然后继续往前走,渐渐远去,直到消失。
林朗没有动。他躺在床上,眼睛盯着天花板,呼吸平稳,心跳稳定。但他的右手在被子下面握紧了拳头。
有人在看着他。
而他决定,从明天开始,他也要看着对方。
不是用数据。是用眼睛。
窗外,雨还在下。雨水顺着窗玻璃往下流,把对面的灯光切割成一块一块的、扭曲的光斑。林朗看着那些光斑,忽然觉得它们像是一张网——一张由光线和阴影构成的网,而他,正在这张网的正中央。
他翻了个身,把脸埋进枕头里。
他没有注意到,枕头是湿的。