第一枪
米勒离开后的第三个小时,陈平坐在老林叔的工作台前,盯着笔记本电脑屏幕上的数据流。
扫描器已经连接到电脑,旁边摊着几样从老林叔家翻出来的旧物件:一罐过期三年的番茄酱、一盒锈迹斑斑的螺丝钉、一本1998年的纽约市电话黄页。每样东西上都贴着褪色的条形码,像陈旧伤口的缝合线。
“这些码早就失效了。”老林叔站在他身后,手里端着一杯用电磁炉加热过的速溶咖啡——咖啡是上个月社区教堂发的救济物资,味道像掺了灰的苦水,“超市数据库里肯定没这些记录了。”
“我知道。”陈平拿起那罐番茄酱,用扫描器对准条形码。
红光扫过。
电脑屏幕上跳出读取结果:【商品码:048001234567 |制造商:亨氏|产品:番茄酱(340克)|生产日期:2030年11月|保质期:2033年11月|状态:已过期】
老林叔凑近看了看:“读取正常。试试写入。”
陈平在电脑上修改了几个字段。他把生产日期改成2035年1月,保质期改成2037年1月,状态改成“在售”。
然后,他将扫描器调到写入模式,再次对准同一个条形码。
红光持续闪烁了五秒钟。
【写入成功】
陈平拿起番茄酱罐,走到窗边,借着下午的光线仔细看。条形码看起来没有任何变化——还是那串粗细不一的黑色线条,下方印着同样的数字。
“这有什么用?”老林叔问,“就算你改了本地数据,超市的扫描枪一刷,还是会连到云端数据库,显示真实信息。”
“如果扫描枪不联网呢?”陈平转身。
老林叔愣住了。
“有些地方,”陈平慢慢说,“为了省流量费,或者因为信号太差,收银机是离线工作的。它们本地有个基础商品数据库,每天凌晨同步一次。如果我在同步之后、扫描之前,修改了条形码对应的本地记录……”
“那收银机就会读到你改过的信息。”老林叔明白了,但随即摇头,“可那有什么用?你总不能拿这罐过期的番茄酱去超市结账,就算收银机显示‘在售’,收银员眼睛不瞎,一看就知道过期了。”
陈平没直接回答。
他走回工作台,打开一个从本尼那里拿到的信号探测器——那个像老式手机一样的黑色装置。插上USB线充电后,屏幕亮起单色绿光,显示正在扫描附近无线信号。
屏幕上快速滚动着列表:
【SSID: Linksys_2.4G |加密: WPA2 |信号强度:-67dBm】
【SSID:NYPD_Surv_Unit_7 |加密: WEP |信号强度:-42dBm】
【SSID:VitaCorp_Warehouse_NET |加密:开放|信号强度:-58dBm】
……
“警用监控单元,维塔企业仓库网络。”陈平指着屏幕,“都是开放或弱加密信号。”
老林叔皱眉:“你想黑进去?”
“现在还不行。”陈平放下探测器,“但说明一件事:这附近有很多设备,为了图方便或者省成本,用的安全措施很弱。如果我能找到一个离线工作的、安全措施薄弱的扫描设备……”
“然后呢?你修改一罐番茄酱的信息,能改变什么?”老林叔的声音里带着疲惫,“平娃子,我知道你急,但这种事太琐碎了,救不了你爹,也救不了你自己。”
陈平沉默了一会儿。
他看向工作台上那罐番茄酱,红色的标签已经褪成暗粉色,像干涸的血迹。
“老林叔,”他轻声说,“你觉得系统最怕什么?”
老林叔没说话。
“系统不怕穷人反抗——反抗会被镇压。不怕穷人死——死了就清理掉,换一批新的。”陈平拿起番茄酱罐,在手里慢慢转动,“系统最怕的,是混乱。是它的数据出错,是它的规则自相矛盾,是它的执行者开始怀疑自己接收到的信息。”
他放下罐子,看向电脑屏幕。
“如果我能在系统最底层——那些最廉价、最不起眼的扫描设备里——植入一点点错误信息,让它们读取到和云端不一致的数据,会发生什么?”
老林叔思考着:“收银员会发现商品信息和实际不符,会手动纠正,或者上报主管……”
“但如果错误信息设计得足够巧妙呢?”陈平打断他,“如果错误不是‘番茄酱过期变成新鲜’,而是更细微的东西?比如‘商品已召回,请立即下架’,或者‘此批次商品涉嫌污染,禁止销售’,或者‘该条形码对应商品为处方药,需授权购买’?”
工作台前陷入沉默。
窗外传来远处工厂的汽笛声,下午四点的换班时间到了。
“你想制造混乱。”老林叔终于说,“让系统怀疑自己的数据。”
“不止。”陈平调出电脑上的另一个界面——那是他从昨晚数据流的残存记忆中,勉强回忆并记录下来的一些信息碎片,“你看这个。”
屏幕上显示着几行零散的记录:
【血牙帮据点-日常物资采购清单(部分)】
·即食罐头 x 30(供应商:好市多,条形码前缀:054)
·瓶装水 x 48(供应商:沃尔麻,条形码前缀:065)
·医用绷带 x 10(供应商:CVS,条形码前缀:011)
“这是……”老林叔眯起眼睛。
“血牙帮每周会派人去超市采购生活物资,用的是帮派‘公账’的预付卡。”陈平说,“为了避税和避人耳目,他们专挑那些用老旧离线收银系统的小超市,用现金充值预付卡,然后刷卡购物。这样账面上看,只是普通的消费记录。”
他停顿了一下。
“而那些小超市,因为用的设备老旧,系统离线,安全措施几乎为零。”
老林叔盯着屏幕,又看向陈平,眼神变了。
“你从哪儿搞到这些信息的?”
“昨晚的数据流里看到的,我记下来一部分。”陈平说得轻描淡写,“血牙帮的账本、采购记录、人员排班,都在里面。虽然不完整,但够用了。”
老林叔沉默了很久。
最后他叹了口气,拉过一张凳子坐下:“平娃子,你知道这么做的风险吗?如果被发现是你干的,血牙帮会把你撕成碎片。而且,就算你成功在他们采购的东西上做手脚,又能怎么样?让他们买到过期食品?那只会让他们更愤怒,然后加倍压榨街坊。”
“我不打算让他们买到过期食品。”陈平说。
他切换电脑界面,打开一个新建的文档。里面是他刚才趁老林叔不注意时,偷偷写下的几行字:
目标:布鲁克林区“折扣王”超市
地址:南街117号
特征:收银系统为2008年款NCR型号,离线工作,每日凌晨3点自动同步。无线网络开放,SSID:DiscountKing_Free。
血牙帮采购时间:每周三下午5点(今日)
采购员:C组马仔“瘦子”(偏好购买特定品牌的能量棒和可乐)
老林叔读着这些文字,呼吸渐渐急促。
“你……你想在血牙帮采购的时候,黑进超市系统,修改商品信息?”
“不是修改所有商品。”陈平说,“只修改他们今天会买的那几样东西的条形码信息。而且不是修改成‘过期’或‘下架’,是修改成……”
他敲了几下键盘,屏幕上弹出另一个窗口。
那是他从互联网档案馆里找到的、一份十年前的FDA(食品药品监督管理局)公告扫描件。公告内容是关于某个品牌的能量棒因“可能含有未申报的花生成分”而被召回。公告末尾附有一长串受影响的产品批次号,以及对应的条形码范围。
那个品牌,恰好是“瘦子”最喜欢的能量棒品牌。
“这份召回公告早就过期了,相关产品也早就下架了。”陈平说,“但如果今天,在‘折扣王’超市的本地数据库里,突然出现一条记录,显示‘某批次能量棒因花生污染风险被紧急召回,请立即封存并联系FDA’,而那个批次号,正好对应货架上的几盒能量棒……”
老林叔的眼睛瞪大了。
“超市员工会看到这条‘紧急通知’,他们会立刻下架那些能量棒,甚至可能报警或者联系FDA。而‘瘦子’买不到他想要的东西,回去会挨骂。更重要的是——”
陈平顿了顿,声音压得更低。
“血牙帮的人会开始怀疑:为什么偏偏在他们要去采购的时候,出现这种‘巧合’?是超市故意的?还是有人针对他们?他们会检查其他采购的东西,会发现更多‘异常’——也许某箱瓶装水的条形码会显示‘该批次检测出微生物超标’,也许某包绷带会显示‘已过期五年’。”
他看向老林叔。
“混乱不需要很大。一点点疑心,一点点不信任,就够让他们内部互相猜忌,让他们和超市产生矛盾,让他们把注意力从压榨街坊转移到处理自己的麻烦上。”
老林叔久久没有说话。
窗外,天色渐渐暗下来。下午四点半了。
距离血牙帮采购的时间,还有三十分钟。
距离“折扣王”超市每日数据同步的时间,还有十小时。
而距离米勒给出的清退最后期限,还有六天。
“你需要我做什么?”老林叔终于开口。
陈平从口袋里掏出那个信号探测器:“这个的接收范围只有五十米,而超市离这儿有八百米。我需要一个信号中继器,能把我的电脑和超市的无线网络连接起来。”
老林叔看了一眼工作台上所剩无几的零件:“材料不够。需要额外的天线和功率放大器。”
“本尼那里可能有。”
“现在去来不及了。”老林叔看了眼墙上的旧时钟,“而且本尼那家伙,白天基本在睡觉,晚上才开工。”
陈平皱起眉。
计划的第一步就卡住了。
没有远程连接,他就必须亲自进入超市范围,在距离五十米内操作。风险太高——超市门口有摄像头,店员可能认识他,而且血牙帮的人随时会出现。
“也许……”老林叔犹豫了一下,“也许有别的办法。”
他站起身,走到墙角那堆旧电器前,开始翻找。几分钟后,他拖出一个落满灰尘的纸箱,打开。
里面是一台老式的、带伸缩天线的便携式电视机,以及几个同样陈旧的设备:调频收音机、车载对讲机、甚至还有一个军绿色的野战电话。
“这些东西是我父亲留下的。”老林叔说,“他当年在通信连服役。有些设备虽然老,但改装一下,也许能当临时中继器用。”
他拿起那个野战电话,拆开后盖,露出里面复杂的电路板。
“这东西原本是用的短波频段,传输距离可以到几公里。但需要配对另一个终端,而且耗电巨大。”
“你有另一个终端吗?”陈平问。
老林叔摇头:“只有一个。但……也许可以把它改成单向发射器。把你的电脑信号转换成短波信号发射出去,然后在超市附近用另一个设备接收,再转换成无线网络信号。”
他边说边快速拆解设备,动作熟练得像在呼吸。
陈平看着那些老旧的电路和真空管,心里闪过一丝怀疑——这些东西比他还老,真的还能用吗?
但老林叔的眼神很专注,独眼里闪着光,那是他提到自己擅长领域时才会有的神情。
“给我半小时。”老林叔头也不抬地说,“你趁这个时间,把要修改的数据准备好。记住,别改太多,三到五条记录就够了。多了容易被发现是人为的。”
陈平点头,坐回电脑前。
他打开超市的公开信息页面——那是一个简陋的HTML网站,大概是二十年前做的,再也没更新过。网站上列出了超市的基本信息和联系方式,还有一个“每周特价”板块,里面是店员手动输入的商品图片和价格。
网站没加密,也没防火墙。
陈平用最基础的脚本工具,尝试探测网站后台。五分钟后,他找到了入口——一个默认密码没改的管理员登录页面。
用户名:admin
密码:password
他敲下回车。
登录成功。
后台界面极其简陋,只有一个商品数据库管理模块。数据库里的记录不多,大概五百多条,都是超市常备的商品。每条记录包括商品名称、条形码、价格、库存数量,以及一个“备注”字段。
陈平快速浏览列表,找到了能量棒、瓶装水、绷带等商品。
他盯着屏幕,手指悬在键盘上。
现在,他只需要在“备注”字段里添加几行字,比如“紧急:FDA召回通知#2025-0415,批次号B7-23K,请立即下架”,然后保存。
等超市的收银系统凌晨同步时,这条备注就会被下载到本地数据库。明天收银员扫描条形码时,屏幕上除了商品信息和价格,还会弹出这条醒目的警告。
完美。
但陈平没有立刻动手。
他脑子里有个声音在提醒他:太简单了。
如果超市的网站这么容易入侵,为什么以前没人这么干?为什么血牙帮不直接修改竞争对手的库存数据?为什么系统允许这种漏洞存在?
他重新检查网站代码。
这次,他注意到了页面底部一行几乎看不见的小字:
【本系统仅为前端展示界面,实际交易数据请以店内收银系统为准】
以及,在管理员后台的某个角落,有个不起眼的日志文件链接。
陈平点开。
日志文件记录了最近一周的所有后台操作:
【2035-04-14 09:32:11 |用户 admin登录】
【2035-04-14 09:33:05|用户 admin修改商品#045价格:$3.99 ->$4.25】
【2023-04-14 09:33:22|用户 admin退出】
【2035-04-14 13:15:08|用户 admin登录】
【2035-04-14 13:15:41|用户 admin修改商品#112库存:48 -> 36】
每天都有登录记录,时间很规律:早晨开店后,中午休息时,晚上关门前。
这意味着,超市店员会定期登录后台,更新价格和库存。
如果陈平现在修改数据,店员下次登录时就会发现异常,然后立刻修正。而收银系统凌晨同步的是最新数据,所以他修改的内容可能根本不会传到收银机里。
计划又出现漏洞,陈平靠回椅背,闭上眼睛。
他需要另一种方法,一种不通过网站后台,直接修改收银系统本地数据库的方法。
但收银系统不联网,他需要物理接触或者……需要让收银系统“主动”连接到他的信号。
陈平睁开眼睛,看向老林叔正在改装的野战电话,“老林叔,”他说,“短波信号……能携带数据吗?”
老林叔头也不抬:“可以,但速度很慢,而且需要专门的解码器。你想干嘛?”
“如果我能让超市的某个设备——比如收银机,或者店员的平板电脑——接收到一段特殊的短波信号,然后这段信号里包含了‘数据库更新’的指令……”
“理论上可行,但需要对方设备上有对应的接收和解码程序。”老林叔说,“你觉得超市会有那种东西吗?”
“不需要他们主动解码。”陈平说,“如果信号伪装成别的呢?比如……紧急广播?天气预警?系统自动更新通知?”
老林叔停下动作,抬起头,独眼里闪过一道光。
“你是指……仿冒官方信号?”
陈平点头。
他知道这很疯狂。仿冒官方无线电信号是重罪,一旦被发现,刑期可能比抢劫还长。
但他没时间了。
“FDA的召回通知,通常会通过什么渠道下发?”他问。
“邮件、传真、官网公告,还有……”老林叔想了想,“如果是紧急召回,可能会通过公共卫生系统的紧急广播频道发布。那个频道是加密的,但加密级别不高,因为本来就是给公众听的。”
“频段是多少?”
“我想想……应该是162.400 MHz到162.550 MHz之间,那是NOAA(美国国家海洋和大气管理局)的天气广播频段,但公共卫生系统有时候会借用。”
陈平快速搜索记忆——昨晚数据流里似乎有相关信息。
他想起来了。
【公共卫生警报系统-纽约市分区频段表】
·曼哈顿: 162.425 MHz
·布鲁克林: 162.475 MHz
·皇后区: 162.450 MHz
·……
布鲁克林:162.475 MHz。
而“折扣王”超市的收银台上,摆着一台老旧的天气收音机——陈平上次去的时候见过,收音机亮着绿灯,显示正在接收天气频道。
很多小超市都这样,用天气收音机听风暴预警,以便提前准备。
如果他能仿冒一个公共卫生警报信号,通过正确的频段发送,收音机会自动接收并播放。而警报内容可以包含“产品召回信息”,甚至“请立即扫描以下条形码确认库存”的指令。
收音机没有扫描功能,但店员听到后,会主动去检查商品,扫描条形码。
而那时候,收银机的屏幕上,就会显示出陈平提前植入的“召回警告”。
“需要多久能改装好?”陈平问老林叔。
老林叔看着手里的野战电话,又看了看墙上的时钟。
下午四点四十五分。
“给我二十分钟。但平娃子,我得提醒你——仿冒官方信号,如果被三角定位抓到,我们俩都会进去。而且,就算成功了,效果也可能很有限。店员可能只是把商品下架,然后打电话给供应商确认,不会惊动血牙帮。”
“不需要惊动血牙帮。”陈平说,“我只需要他们今天买不到能量棒。只需要‘瘦子’回去说‘超市突然下架了我常买的东西’。只需要在血牙帮那些人多疑的脑子里,种下一颗‘事情不太对劲’的种子。”
他顿了顿。
“混乱就像霉菌,只需要一点点湿气,它自己就会长满整面墙。”
老人低下头,继续改装设备。
“二十分钟。”他重复道,“你准备警报内容。记住,要听起来像官方的口吻,但不能太正式——太正式反而假。用简单的句子,重复关键信息。”
陈平点头,在电脑上新建文档,他开始打字:
【公共卫生紧急广播-优先级:高】
【纽约市卫生局与FDA联合通知】
【关于‘极限能量棒-巧克力味(批次号B7-23K)’的紧急召回】
【该批次产品可能含有未申报的花生成分,对花生过敏者构成生命危险】
【请所有零售商立即下架并隔离该批次产品】
【重复:立即下架并隔离】
【消费者请勿食用,并前往购买点退货】
【通知编号:FDA-NYC-20250415-7】
他检查了一遍,修改了几个措辞,让它们更口语化,更像广播里会听到的急促通知。
老林叔的改装已经完成大半。那台野战电话的外壳被拆开,内部电路板上焊了几根新的线,连接到一个巴掌大的信号放大器上。天线被换成了一根更长的、可伸缩的金属杆。
“频率调到162.475了。”老林叔说,“功率我尽量调低,只够覆盖超市附近两百米范围,再远信号就弱了。这样可以降低被定位的风险。”
“发射时间呢?”
“越短越好。我设定为十秒钟自动切断。十秒够广播念两遍了。”
陈平把准备好的文本发给老林叔。老人快速浏览,点了点头。
“可以。我现在把文本编码成音频信号,然后输入发射器。你准备什么时候发?”
陈平走到窗边,看向南街的方向。
从这个角度看不到超市,但能看到街道上逐渐增多的下班人流。几个穿着维塔企业工装的人拖着疲惫的步伐走过,几个孩子追逐着跑过,一个流浪汉推着购物车慢吞吞地挪动。
下午五点整。
血牙帮的采购员“瘦子”,应该已经出发了。
“再等五分钟。”陈平说,“等他到超市门口的时候发。”
老林叔把编码好的音频文件导入发射器,然后把野战电话的天线拉到最长,对准南街的方向。
两人都没说话,屋里只有旧时钟的滴答声,以及发射器轻微的电流嗡鸣。
时间一秒一秒过去。
陈平的手心开始出汗。
这不是暴力对抗,不是直面威胁。这是一场他从未经历过的、在看不见的维度里进行的战争。
他用的是信号、频率、数据、和心理。
目标是让一群人产生怀疑。
武器是一台五十年前的老旧军用电台。
荒谬,但又真实得让他胃部抽搐。
下午五点零三分。
老林叔抬头:“差不多了。”
陈平深吸一口气,“发。”
老林叔按下发射按钮,没有声音,但发射器上的一个红色LED灯开始快速闪烁。
十秒钟。
陈平闭上眼睛,在脑子里想象那个场景:
超市收银台上的天气收音机,绿灯突然变成红灯,发出刺耳的警报音。店员抬起头,皱眉。广播开始播放,机械的女声念出他写的文本。店员愣了几秒,然后快步走向货架,找到能量棒的区域,拿起一盒,查看批次号。他走回收银台,用扫描枪对准条形码
屏幕上会弹出那条“紧急召回”的备注。
店员会下架所有该批次的产品。
而这时,“瘦子”走进超市,像往常一样走向能量棒货架,发现空了。他会问店员,店员会解释。他会不耐烦,但没办法,只能买别的。他会提着购物袋离开,心里嘀咕着“真他妈倒霉”。
然后他回到血牙帮据点,把东西交给后勤的人。后勤的人清点时会问“能量棒呢?”“瘦子”会说“超市下架了,说是什么召回”。旁边的人会听见。消息会传开。
也许没人在意。
也许有人会多想一步:为什么偏偏是今天?为什么偏偏是血牙帮常买的东西?是不是有人针对我们?
猜疑会像病菌一样传播,只需要一个开始。
“时间到。”老林叔切断了发射器,红色LED灯熄灭。
屋里恢复了安静,陈平睁开眼,看向老林叔。
老人也看着他,额头上有细密的汗珠。
“现在呢?”老林叔问。
“现在,”陈平说,“我们等。”
等“瘦子”回来,等消息传开,等混乱的种子发芽或者等什么都没有发生。
窗外,布鲁克林的黄昏降临了。天空是一种病态的橙紫色,像溃烂的伤口。工厂的烟囱继续喷吐着灰黑色的烟,街道上的行人加快了脚步,想要在天黑前赶回家。
在这个巨大、冰冷、精密的系统里,两个微不足道的人,刚刚向它发射了一段持续十秒钟的、虚假的无线电波。
像一只蚂蚁,对着摩天大楼的基座,吐了一口唾沫。
陈平握紧拳头,他知道这很可笑,但他更知道,有时候,改变就是从最可笑的地方开始的。
他走到工作台前,关掉电脑,收起扫描器和探测器,然后他看向老林叔。
“我得回去了。”他说,“我爹该吃药了。”
老林叔点点头:“小心点。米勒可能还会盯着你。”
“我知道。”
陈平走到门口,手放在门把手上,停了一下。
“老林叔,”他没回头,“如果……如果今晚或者明天,你听到血牙帮那边有什么不寻常的动静,告诉我。”
“怎么告诉你?你又没手机。”
陈平想了想,从口袋里掏出一张皱巴巴的纸条,写下一个时间:凌晨两点到三点。
“这个时段,警用无人机换班,监控盲区最长。”他说,“如果你有事,在这个时间,朝我家的窗户闪三下手电筒。我会看到。”
老林叔接过纸条,看了一眼,然后撕碎,扔进垃圾桶。
“我记在脑子里了。”他说,“去吧,平娃子。照顾好你爹。”
陈平拉开门,走了出去。
楼道里很暗,只有尽头窗户透进一点暮色。
他一步一步下楼,脚步很轻,走到一楼时,他忽然停下。
街对面,便利店门口,站着一个人,穿着蓝色的社区管理局制服。
米勒。
他正和便利店老板说话,手里拿着平板电脑,似乎在记录什么。
然后,他似乎感觉到了陈平的目光,转过头来。
两人的视线在昏暗的街道上相遇。
米勒的脸上没有任何表情,他只是看着陈平,看了几秒钟,然后微微点了点头。
像在打招呼,像在确认目标,然后他转回头,继续和老板说话。
陈平站在原地,血液瞬间冰凉。
米勒没走,他在等,等什么?等陈平犯错?等清退程序自动生效?还是等别的?
陈平深吸一口气,强迫自己移开目光,转身朝家的方向走去。
每一步,他都能感觉到背后那道视线,像一把冰冷的刀,抵在他的脊椎上。
他知道,战争已经开始了,不是他发起的,是系统早就开始了。
而他,刚刚打响了第一枪,虽然那一枪,可能连声音都没有。
但足够了,足够让他知道,自己还活着,足够让他知道,自己还能反抗。
陈平拐进小巷,消失在阴影里。
街道对面,米勒结束和便利店老板的对话,收起平板。
他看向陈平消失的方向,眼神深邃。
然后,他从口袋里掏出手机,拨了一个号码。
“是我。”他说,“目标刚刚从林明德家离开。状态……比昨天更警惕了。是的,我建议按计划进行。第二阶段压力测试,可以启动了。”
他挂断电话,抬头看向天空,暮色越来越深。
城市的灯光一盏盏亮起,像无数只监视的眼睛。
在那些灯光照不到的阴影里,一场看不见的战争,正在缓慢地铺开战线。
而陈平,对此一无所知,他只知道,自己必须回家,给父亲喂药。
然后等待,等待他种下的那颗混乱的种子,会不会发芽。
或者,等待系统的下一轮绞杀,什么时候落到他头上。
