凌晨两点十二分,机房的冷风像潮上来的夜。迟望把连帽衫的帽檐压低,屏幕前的代码像一阵阵轻微的雨。他把**“数据经纪人黑市”的入口一层层剥开:洋葱路由、跳板、一次性邮箱、混淆代理,最后落在一个看上去“极其干净”的页面:“样本库·高净值画像”**。
“干净就是最大的脏。”安然坐在旁边,指关节顶着杯口,“接口写得像教科书,日志却被截断,回执一行都是‘N\/A’。”
“所以我们给它写回执。”迟望把手移到键盘中央,“不可见水印发车。”
他把自己写的工具命名为Inkfish——墨鱼。每一个导出的样本都被裹上一道不可见水印:
第一层是像素级相位扰动,人眼不可见,模型特征会“轻微侧偏”;
第二层是时序戳,把导出时刻与一次性密钥压进了图片边缘的空白;
第三层是回执签名,用对照链接的只增不改日志做散列盐值。
“对象?”安然问。
“黑市流转样本集#S-Δ。”
“编号?”
“Inkfish—a.07。”
“期限?”
“d+3,等他们带着水印自己来敲门。”
迟望把三十份“投喂样本”丢进黑市,定价压低到“新手友好”。样本看起来是某地城改项目的中产画像,每一张“标签云”都在“无关紧要”的角落里多了两枚看似随机的点——水印。
“他们会来吗?”安然问。
“他们一定会来。‘低价、完整、可扩展’,这就是诱饵。”迟望往后一靠,“‘渤海’如果在,就会来。”
“‘渤海’是谁?”裴念靠在门框上,端着咖啡,脚尖点了点地板。
“黑市里一个老Id,靠模型‘补齐’缺口赚钱。我们在会所链上看过他的指纹——广告位权重词与城改评估词的重合度高得让人牙痒。”
“他是把‘算法’当‘绳子’的人。”安然说。
——
中午十二点零九分,Inkfish后台一个微小的绿点亮了一下。
“S-Δ_013:导出→第三方容器→二次变换。”
迟望眯起眼:“来了。”
他把绿点后面的三段跳展开:导出在黑市节点、容器在东欧云、二次变换的AS却在华北沿海的一个多宿主机房上。
“渤海喜欢贴近海岸线。”迟望用最轻的语气,打出三行匹配规则,屏幕上弹出一个老旧的头像:一只蓝灰色的旗鱼。
“锁定Id:渤海。”安然敲下回车。
“只是Id。”裴念提醒,“别把人和Id等号。我们要的是链。”
“照链,不照人。”迟望唇角一勾,“我只看回执。”
——
当晚七点,Inkfish的水印第二层开始回传:时序戳与一次性密钥被对方的模型推理引擎激活,顺着容器的换气缝往回吹。
“他在做‘扩展训练’。”安然看着曲线,“他拿我们的样本给自己的模型喂一口,水印就变热。”
“热就对了。”迟望把一张热力图铺满屏幕,“看到了吗?两处热点:一处在容器,一处在某城市一条滨海大道上的咖啡馆区。
对象:渤海的二跳端;**编号:**容器Id#bx-17\/物理wIFI#FreeSea-2;期限:****d+0收敛,d+2取证。”
“线下要不要人?”裴念问。
“不接触人。”迟望摇头,“只把**‘FreeSea-2’的开放与封闭时段对齐我们的热点峰值**。他如果是稳定用户,峰值会周更重复。”
“赌人性——每周同一时段来喝咖啡。”安然笑,指尖在杯口划了一圈,“程序员的规律性比算法还准。”
——
第二天午后四点半,滨海大道。FreeSea-2的wIFI在每日16:30—18:00固定开放一个旧固件“维护窗口”。这段窗口里,渤海的模型容器会把增量参数上传到一个看似无害的图床站。
“他偷懒。”迟望看着“维护窗口”的固件版本,“旧固件留着后门口令,他不想改。”
“那我们就用‘后门口令’敲门。”安然手指在桌面上敲了两下,“Inkfish—a.08上**‘回执触发’**。
他一上传,我们就让‘水印’吐出——容器版本、模型指纹、参数ShA、时间戳。”
“合唱团那边先别报。”裴念叮嘱,“等纪南川把**‘可采性’**写完。我们报‘链’,不报‘人’。”
四点四十二分,“维护窗口”打开。FreeSea-2像一只打盹的老猫,露出肚皮。
四点四十四分,渤海的容器上传动作触发,Inkfish的第三层回执签名开始吐字:
container: bx-17@FreeSea-2
model_fp: 9f3c...ae11
param_sha: 2d7c...0b9a
ts: 16:44:21
route: baltic-cdn → cn-north-ix
“够了。”迟望把四条回执打包签名,“对象:黑市链条·渤海;编号:bx-17\/9f3c\/2d7c;期限:****d+3送达检方与平台。
我们不抓人,我们把‘可重复路径’钉出来。”
“别忘了‘反污点’。”安然提醒,“暗网取证要做反操纵证明。”
“做了。”迟望把**‘双重回执’贴给她看:一份是Inkfish吐的,一份是在对照链接的只增不改日志**——生成自证,第三方见证。
纪南川讨厌**“黑盒证据”;他们做的,是“透明黑盒”**。
——
晚上,滨海咖啡馆灯光暖得像一朵慢开的花。靠窗的位置上,坐着三位看资料的人,谁也没抬头。
“别看窗。”裴念说。
“我们看表。”安然笑,把**“FreeSea-2开放时段”与“容器热点曲线”叠了个图。两条线在周三与周五的同一时段重叠**。
“这就是‘绳子’。”迟望指着叠合部分,“我们把绳子标上编号**,挂在透明页。”
合唱团夜间号只发了三行字:
**对象:**黑市链·渤海
**编号:**bx-17\/9f3c\/2d7c(容器\/模型\/参数)
**期限:**d+3 送达
**备注:**照链,不照人。水印已入柜(Inkfish—a.08)。
评论区开头两条像往常一样:“抓人啊!”“你们有种报名字。”
第三条却换了味道:“**名字会碎,链条要断。**谢谢你们把‘看不见’变成‘能核对的回执’。”
第四条是一位小白用户的截图:“我学会看‘维护窗口’和‘容器Id’了。原来‘技术性’也能写出编号。”
“明天他们会骂我们钓鱼。”裴念收合笔,“骂吧。钓鱼是逐利,布水印是反侵权。法条与见证都在左上角挂着——谁怕谁。”
“我明天把‘渤海’做成‘核验卡(黑市版)’。”安然伸懒腰,“对象\/编号\/期限三格先填满。”
“Inkfish 进入β。”迟望打下最后一行,“d+7全平台开放水印工具的公众版,让每一个被爬的人也能留回执。”
窗外潮声低低,像一个长久的叹气终于落回胸腔。阴影不是没了,是被编号了。