前言

2020年伊始,随着新冠的来临,大量活动开始转向线上配信,eplus在当年也开始了Streaming+服务,此后下半年为了配合lovelive配信导入了Widevine DRM,但之后就很少再见到采用了DRM的配信内容。

时间一转到了2023年,万万没想到,在eplus面向外国人配信搞得如火如荼之时,他又悄悄同时被国内站和海外站加上了DRM支持,武士道系配信尤甚,八成是被来自海内外的海贼搞烦了。而他的DRM逻辑又与其他网站请求license→直接返回license这样直截了当的方式完全不同,采用DRMtoday方案后请求头加入了反直觉的鉴权不谈,Response也不是直接返回license,而是base64编码后放入json当中。尽管Streamfab也能直接完成下载+解密,但对于解密直播源、甚至获取Rehearsal内容来说依旧完全依赖手动,于是无奈推翻了过去的获取key的轮子,重新梳理eplus的DRM行为逻辑,尝试重新写一套轮子。

行为分析(Archive内容)

分析部分暂时以eplus提供的archive样例为参考,至于直播内容等到27号接触到再做进一步确认。

首先向eplus的get_auth_token_drm发送了请求,带上鉴权的cookie和channel-id,返回的除了auth_token,还有merchantIdsessionIduser_id。先把这三个额外的返回值也储存起来,后面请求license时候可能会用到。

image-20230526222115742

接下来从媒体中获取pssh后,向DRMtoday的api正式请求license。除了之前请求到的auth_token作为X-Dt-Auth-Token放进headers,还有另外一个叫做Dt-Custom-Data的令人费解的value。因为看起来很像base64编码,于是就试着做了下解码,果不其然,是记录了前面返回的另外三个值的json。

image-20230526222612351

让CDM生成了对应的challenge作为payload,带上这些headers一起发给DRMtoday,返回了带有license的json。使用chrome CDM的时候返回了很多关于CDM的信息,可以顺便看一眼,可惜我对chrome CDM没兴趣,暂时没什么一定要用chrome CDM解密的内容。

image-20230526223324600

使用Android CDM的时候DRMtoday返回的内容就很少了。

image-20230526223453977

顺便吐槽一下,移动端和chrome端的license SDK版本居然还不一致,但一想到eplus本来对于浏览器只限定了edge和safari,我在修改了UA强行用chrome访问的情况下会出现什么奇怪的结果也都不奇怪就是了。

不过无伤大雅,能返回license就好,base64解码之后送回CDM解析,后面的过程就可以忽略了。

结尾

整体来说eplus虽然在用了DRMtoday方案之后直接导致原本方案失效,但api本身并没有过多为难,只不过把license用json包装起来了而已。只是在鉴权方面同时需要auth-tokensessionId,导致了前置工作必须要回去请求eplus的api获取这些内容,不过是要重写一套有针对性的轮子罢了,而且暂时没看到直播时候的工作原理如何,也不排除到时候要微调的可能性。