Abema

Abema的m3u8 key格式为
#EXT-X-KEY:METHOD=AES-128,URI="abematv-license://2uqo9VkfUUGyqrRkeSrTTFsSucMVJ6kgecbu1Hr7ibLx",IV=0x1165956bdcbdd50f7ea3c555b3407d19

还没搞懂这个处理是怎么定义的,不过可以跟踪到。

Step.1 请求授权服务器

需要根据这个地址去授权服务器请求

https://license.abema.io/abematv-hls?t=SBX8JMLLbZ6EHhoBJuNSy6zEbz5vQ2zQ5yfPfcPnQgBthE8VGpNvbsmAAkrKEtMBwKzaGs3WbDZEtBpeSXww8akbjRxRKxDwwtyZBwaAth5mz2hVV6tJd4puHqB

这里后面的一长串是localStorage里的abm_mediaToken

payload为

lt为key url里abematv-license://后面的部分。

kv的”wd”是固定值。

然而kg是什么呢?

来分析一下代码

这显然是一个XHR请求,这里的_0x5890a6就是kg,那么它是在哪里定义的呢

这里从某个地方取到了一段JSON,这段JSON有一个字段叫generation就是kg的值。所以这个_0x3b0c()函数就是关键。

这个函数在几乎最前面就被定义了,而且经常被调用。

可以猜测,这个函数首先是在没有初始化的时候进行一段初始化操作。从_0xb0c3中取出一些值进行处理。

_0xb0c3是一个数组,定义好的,不会变。我把它重命名为globalVars。

这里的初始化操作很复杂。。先不分析,把那个globalVars打出来看看:

一看就是一堆base64,解之

一眼看到了我们要的东西。一段JSON。我们发现在取这个gerneration的时候,key是0x35,然而初始状态这个JSON并不是在0x35。所以我们有理由相信这个所谓的初始化操作可能是类似于打乱之类的操作。

基于以上分析……我们可以暂时认为kg是一个常数315.

Step.2 解析授权服务器返回信息

按以上信息发送请求,授权服务器返回内容为

{cid: "386-71_s2_p1", k: "GPSpC5yhFWUqosnVvKaniy5"}

cid是视频url中就有的,应该是标识视频的。k应该就是重点了。

往上看了一眼就发现了这个醒目的错误提示,显然这一段就是处理返回的内容。(上面一大段看起来就是XHR的回调,状态码判断什么的)

箭头指向的应该就是重要的,解密函数。单步跟入。

继续跟入。

key被分为最后一个字符和其他。

根据我的直觉。。这个函数应该是判断相等。

那么应该是根据key的最后一个字符来确定解密模式。

后面的_0x3031b5的三个参数分别是cidlocalStorage.abm_userId、key去掉最后一个字符,继续跟入.

后面的JSON是和全局数组里那个一样的。里面有个固定的key,取出来。

到这里我后面分析了很久,但是密码学部分还是太复杂了,决定还是换个思路,抄代码。只要能模拟运行就可以解密了反正。

 

“Abema”的2个回复

发表评论

电子邮件地址不会被公开。 必填项已用*标注