小鹅通 m3u8 key 加密逆向整理;
目标是确定两部分内容,解密的key和所有ts文件的地址;
获取解密 key
- Chrome 开发者工具,网络,过滤m3u8
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:2
#EXT-X-MEDIA-SEQUENCE:0
#EXT-X-KEY:METHOD=AES-128,URI="https://app.xiaoe-tech.com/xe.basic-platform.material-center.distribute.vod.pri.get/1.0.0?app_id=apppg8fcrdu3512&mid=m_cYfxdbgXsTq0i_XUgwZjTD&urld=35f5aba54e19a0376a42ee303e00094d",IV=0x00000000000000000000000000000000
#EXTINF:2.000000,
v.f421220_0.ts?start=0&end=65999&type=mpegts
#EXTINF:2.000000,
v.f421220_0.ts?start=66000&end=158127&type=mpegts
......
- Chrome 开发者工具,网络,过滤 EXT-X-KEY 的地址
实际请求地址如下:
https://app.xiaoe-tech.com/xe.basic-platform.material-center.distribute.vod.pri.get/1.0.0?app_id=apppg8fcrdu3512&mid=m_cYfxdbgXsTq0i_XUgwZjTD&urld=35f5aba54e19a0376a42ee303e00094d&uid=u_6311c7f721af1_4OVmnnbvij
实际请求地址,比m3u8文件中的EXT-X-KEY的地址多了uid参数,用户的id;
如上,返回的内容是一段乱码,在这看不出具体内容来,需要在js里debug到可以显示此变量的地方,看一下在内存里存储的实际内容;
- 找到发起key url请求的程序,然后定位其对请求返回的内容的处理过程即可,或者找到发起ts请求的逻辑,看如何处理ts的输出(ts的输出是需要解密的);第一种方法:
通过debug找到这样一段逻辑:
根据红框中的判断逻辑,可以知道这是处理key url请求返回值的地方;
返回值经过一系列计算之后传递给loadsuccess方法,计算过程可以先不用关心,因为大概率是一次性的;
传递给loadsuccess方法;
再看一眼
这样我们就得到了key:B39D10FEA76560EA490835154BC0F536;IV 和 Method在m3u8文件中都有,直接复制即可;
获取ts列表
- Chrome 开发者工具,网络,过滤ts
ts地址的格式如下:
https://encrypt-k-vod.xet.tech/9764a7a5vodtransgzp1252524126/1c63d219387702305646359637/drm/v.f421220_0.ts?start=200077632&end=200191567&type=mpegts&sign=7d853cccf1064a27651802d3e59fce45&t=6329da58&us=gMBMwTxQqb
ts列表在m3u8文件中的格式如下:
#EXTINF:2.000000,
v.f421220_0.ts?start=0&end=65999&type=mpegts
m3u8文件中直接解析到地址缺一段前缀
https://encrypt-k-vod.xet.tech/9764a7a5vodtransgzp1252524126/1c63d219387702305646359637/drm/
还缺一段后缀
&sign=7d853cccf1064a27651802d3e59fce45&t=6329da58&us=gMBMwTxQqb
查看多个ts文件请求,发现后缀这一段是相同的,不加的话会 http 403 拒绝请求。
连续测试了两三天,随后发现后缀这一段每天会不一样(可能是每次登录会不一样),只需要临时通过 Chrome 开发者工具找出来配置给程序即可。