月份: 2016-10

Overwatch Toolchain 解包方式考察


理想的英雄语音音频源文件,大概是这样的:

sample

有一个比较标准的文件名(Filename),以英雄名字起头,文件名自己就包含了一些有用的分类信息。
有一个配套的文本文件(Dictionary),里面写好了每个音频对应的台词(Text),我们直接可以查找替换复制粘贴。
有一套分类详尽的标签(Tags)列表,里面详细地给每个音频分好了类,我们可以方便地根据这些标签进行筛选、处理、归档。
这些理论上 Blizzard 应该已经做好了放在客户端里,我们只要解压了就能拿来用。

但事实上并不是这样的,CASC 是 BLZ 私有的加密格式,目前并没有很好的手段可以完美解压,实际解出来的结果大概是这样的:

hashname

这种 32 个数字英文组成的字符串称之为 filehash,可以简单理解为一种特殊的文件名。这种名字没有实际意义,仅仅表示『这个文件和那个文件是不同的』。

所以,比『什么都没有』稍微好点,我们有了『不知道是什么的一堆文件』,稍后我们又通过文件格式识别软件,找出了其中的音频部分,并转换成了可以播放的 mp3。于是我们得到了『不知道是什么的一堆音频』:

untitled-2

情况没有本质变化,但我们有了一大包知道是 mp3 的文件以后,我们就可以 手-动-听-写-打-标-签 了。

于是情况变成了这样:

untitled

这就是 http://ow.thnuclub.com 这个小站现在正在做的事情。全世界想的办法都一样——先解出来能播放的,再人工一个一个挑。幸运的是,吃瓜群众撸袖自己上,一不小心撸出了全世界最好的守望音频网站。


 

昨天 nga 有网友(青龙圣者@ngacn.cc)推荐了 toolchain 系列解压软件。这个软件在小站建站之初是没有的。现在看来,它有优点也有缺点,但前景似乎不错。

toolchain 使用的还是 zezula 的 CASCLib 开源库,但库版本更新了不少。因此比 cascview 能多解出一些信息,具体地来说是有了目录和文件类型,有目录就意味着可以自动完成一部分标签。但缺点是引入了另一套也没啥意义的文件名系统。于是情况变成了这样:

小站的旧数据有 Text 内容,而 toolchain 有相对比较准确的标签分类。但因为两边的文件名对不上,所以不知道哪个对应哪个。

再仔细验证以后,发现 toolchain 解压的文件是可以计算得到 filehash 的,于是又变成了:

tagmatching

这是目前所能获得的最大的成果了。

进一步分析发现,toolchain 解压出的音频总数较少,也就是:

compare

原因可能是 toolchain 的作者的关注重点并不在音频上,因而把原始数据中暂时未分析的部分直接抛弃了。而 CascView 则以解压优先,并未抛弃数据。

 

总结:

  1. toolchain 通过目录结构间接提供了较为准确的英雄分类 tag,可以补充修正现有小站全靠人工听写的标签数据。
  2. toolchain 目前仍然没有解出音频对应的文本,而目前音频文本(Text 数据)依然是最宝贵的劳动成果,也是 ow.thnuclub.com 小站存在的最大价值。暂时还没办法由 toolchain 自动化解决,期待未来某天可以彻底解决。那时小站大概就可以关闭了。
  3. toolchain 引入了另一套文件名,但可以通过计算得到 hash 值与旧数据对应起来。
  4. toolchain 的数据分类更细致,但总量较少,新的文件名系统无甚作用,且构成规则不明。因此也没有必要跟随 toolchain 的命名方式。
  5. toolchain 可解压出 *.mdl、*.dds 等文件,对视频制作者、签名档、头像等很有作用,但对于既有的音频内容,所助仅限于标签分类数据。
  6. 对于一些特殊的标签数据,例如莱因哈特的台词『Many of my comerads fell in battle here, may they rest in peace.(我的许多同伴在此牺牲,愿他们安息)』只会在艾兴瓦尔德这张地图出现,因此较完美的 tag 应当是『莱因哈特,英雄,艾兴瓦尔德,地图,入场』,这个是 toolchain 也无法提供的,只能依靠人工标注。

因此,在现阶段 toolchain 还不成熟的情况下,暂时还没有必要修改小站现有的数据结构和使用方式,只需要把 toolchain 提供的目录结构,转化成较为准确的 tag 数据补充到小站上即可。相比于 toolchain 构成规则不明的文件名系统,可以通过计算得到的 filehash 系统通用性也更好一些。


接下来的工作:

  1. 计算 toolchain 获得的所有音频文件的 hash 值,如果有软件可以直接带子目录列表输出 csv 就好了。
  2. 通过目录路径给 toolchain 所有音频文件打上英雄分类/地图分类 tag。
  3. 合并到现有小站数据上,需要解决英雄标签冲突,并尽可能保留有效信息。
  4. 但合并 tag 也可能导致形如『【天使】I feel unstoppable.』这类音频中的安娜标签丢失。具体处理办法还需要考虑。

更新完成。

盗号开挂被封责任是谁的?

最近一段时间守望外挂封号频率变快,吃瓜群众们顺带就发现了另一乐趣:『看演员』。即是围观被封号的人员是如何花样百出地去论坛控诉他们是『被误封』的。我也去了。可不是嘛,挺开心的。

绝大部分的申冤理由最后都集中到了『被盗号开挂』上,毕竟这大概确实属于最能彻底撇清责任的理由。帐号被盗并非拥有者意愿,而被盗期间主人对帐号失去了控制权,造成的影响也应当与主人无关,既然两个环节都并非号主意愿,那么号主自然不应当承受处罚。我觉得这个申诉理由确实有点意思,就记一笔理一下这里的逻辑好了。

 

『帐号被盗开挂被封』,仔细想想这八个字背后的逻辑其实挺复杂的。为了说明问题逻辑,不妨先来看一下另一个例子:

你买了一辆汽车,一切手续完备资格有效,各种费用包括保险费交通费全部交清——这完完全全是你的东西,别人找不到一丝茬。然后你某天下车没有关好门,一个无业混混一拉车把,门就开了。他坐进去打算开一把过瘾,然后就撞死了个老太太,要赔 30 万。

你忘了关车门,混混偷了你的车撞死了人。好嘛,这事怎么了结?

一般来说,首先是分配责任。混混偷车还撞死人当然是主责,但你确实也忘了关门,次要责任肯定得担一些。至于比例多少基本就是法官定度了,就假设是二八开吧。于是理论上你承担 6 万,混混承担 24 万。在结案以后,汽车会还给你。至于洗车费做法事香火钱,那得你自己出。

这个例子可以有诸般变化,比如你能证明你没有疏忽,已经尽到了保管责任,有监控录像证明你确实停在车库并且锁了门,混混是自己撬门开的。那你很幸运的不用承担责任,理论上还可以找混混要求赔偿修车钱。又比如混混还未成年,你停车的地方又是学校附近,可以预见到这里未成年人多。那你忘关车门甚至可能成为主责。再比如混混出车祸一块死了。那你就安心赔上 30 万给老太太家属,说不定还得另赔 30 万给混混家属。

但就算是一堆废铁了,车还是会还给你。如果你还要,记得付拖车费。

 

所以照这么说,帐号=车,应该还你罗?

这里的最大区别,其实恰恰就在于帐号不等于车。

你对某辆车拥有『所有权』,意味着对这车拥有一切处置、支配的权力,改了拆了砸了埋了卖了,都行。除非法律明确禁止,比如做成汽车炸弹。但退一万步说,法律也只是禁止你危害公共安全,并不禁止你对汽车进行改装,哪怕是改造成炸弹。

实物商品的复制需要和原型等量多的材料,还需要同等的加工和运输,凝聚了诸多人类劳动,因而我们可以将每一辆车看作独立物品,并单独分配所有权。但软件不同,软件存在一个实物没有的特点,『零成本复制』。无论是代码也好,小说也好,本质上都只是一段特定的排列顺序。软件作者,小说也好,所做的工作本质是排出这段序列而已。排列是困难的,排出来了,接触到的人想要照着再排一次,却毫不费力。

为了对抗这种情况,人们发明了版权。一旦某个序列排好,作者就可以宣称对这样一段序列有所有权。全世界任何一个地方,只要出现相同的序列,作者就拥有所有权,这就是版权的本质。实物的『复制』有成本,所以所有权可以分配到物。序列的复制无成本,则所有权索性不可分割,全部属于创造者。

而客人购买的,是『接触、阅读或者使用这段序列』的权利。说人话,就是买了软件的使用权,或者书本的阅读权。对于书籍而言,作者把『一段排列好的文字』通过卖实体 / 电子书的渠道,展现在你面前。展现的期限通常都是永久的,但也存在『租书』这种有时限的情况。软件同理,你购买的是限时或者永久使用这段代码的权利。

因为所有权永远是作者的,所以『复制』作为对原型的一种处置,自然也只有作者拥有这一权利。这样就从法理上,确定了未经作者许可的『复制』(也就是盗版)是侵犯作者权力的。同时,尽管在绝大多数情况下使用时长是永久的,但购买使用权本身更像是一种『租赁』。你花钱在某网吧办了『牛逼会员』,终身免费上网,也终归只是一种特殊的包时上网,并非就拥有网吧了。

 

回到守望这事上。你花 198/328 购买的,首先并不是软件的『所有权』。如果你对守望有了『所有权』,则暴雪网易反过来需要向你交纳使用费了,这显然不成立。没有所有权,就排除了『任意处置』的权利。顾客购买的并非所有权,则如何使用,需要根据买卖双方的约定执行。

你把钱交给暴雪,暴雪允许你复制它的客户端,连上它架的服务器,获得愉悦。所以你购买的是『使用名为守望的这段代码获得娱乐』的权利。时长名义上是『永久』,实际上是暴雪公司的寿命。服务器本质上也只是另一段代码,客户端和服务端代码一起,才能整个正常运行起来。

讲到这里,就涉及到核心问题了:盗号开挂该不该封?

暴雪拥有守望的『所有权』,并分割出了很多份不同的『使用权』,一个客人通常会购买一份使用权,但真想要购买多份也可以(小号)。每一份使用权都在顾客和暴雪达成约定后获得,约定内容包括:

  • 支付一定的金钱(就是花钱买)。
  • 为客人准备一份使用权,并准备相应的服务资源。(例如每卖出一千份多开一组服务器)。
  • 约定这份使用权的帐号密码,包括密保等,通常由客人自行完成(注册帐号)。
  • 若干条使用权的限制(也就是用户协议),通常包括不可共享、反编译等,当然也包括不可开挂。

在这一逻辑下,帐号密码只是链接暴雪和玩家的一个环节。它本身并不是出售的使用权的一部分,而仅仅是用来和玩家约定,谁可以使用这份『使用权』而已。也就是说:

  • 对于玩家,主观感觉可能是:花了 198 / 328,买了一个游戏的使用权,只有我能用,别人用不算。
  • 对于暴雪,客观的逻辑则是:某一份特定的『使用权』已经售出。自己准备好了相应的服务资源,并和客人约定了使用这份资源的口令。当然,口令可以由双方约定得很复杂(安全令/异地IP限制),并且暴雪也建议约定得足够复杂(绑安全令送 WOW 宠物)。但用户依然可以约定得很简单。

对于暴雪而言,确认身份的唯一方法就是口令,只有拥有口令才能获得『使用权』,只要拥有口令就能拥有『使用权』。而惩罚也是针对『使用权』在行使过程中的不当行为作出的,根据情节轻重,会暂停提供使用权,几天到永久不等。也就是说,对于暴雪而言,只是针对每一份『使用权』的不当行为,削减该份『使用权』的时长罢了。

由于事先约定了口令,自然拥有该口令的连接,必须可以访问该份『使用权』。盗号者当然犯了冒用他人身份的罪,然而之所以说“冒用”,正是因为只有当事人才知道是假的,而对于善意的第三方而言,这个身份是正确有效的。

一个有效『使用权』做出了不当行为,于是削减该份『使用权』的时间。

一个有效『使用权』开了外挂,于是削减该份『使用权』所有剩余时间(即封禁)。

由冒用身份而对事主造成的损失,由冒用身份的人负责。假若在核对口令检查身份时服务方有疏忽,则服务方也有责任。也就是说,如果你不但可以证明是有人盗用你的帐号开的挂,并且还能证明暴雪在验证帐号密码上有疏忽(比如明明开了将军令没却没验证 / 错误的用户名密码也可以登录),那么确实有理由解封。但假若在验证帐号密码上没有疏忽,则你的损失应当向冒用身份的人去追索,而与服务方无关。

 

以上只是逻辑上而言的,但在现实中其实还有更强大的约束存在——购买时的事前约定,也就是用户协议。当用户协议与法律不冲突时,该协议无论从人伦视角来看多么过份,依然是受法律保护的有效协议。因为这是最顶层的“事前约定”。至于怎么看用户协议,就不用多说了。