- 不含
mobi_app=iphone_comic
或mobi_app=android_comic
(触发web加密),或 version
在6.8.5
及以上(触发app加密)
app加密时需要发送m1
参数,参数不是有效的加密参数时,返回加密域名下未经加密处理的响应
文件头为
bool encrypted
long dataSize
encrypted == false
:
dataSize
为0,响应去除5字节文件头即为图片未加密内容
encrypted == true
:
文件头后跟随dataSize
的内容,后跟随 aes密钥(web加密)或JWK EC公钥(app加密)
提取图片地址的cpx
参数并base64解码,得到的数据中,0x1开始0x20长度数据为AES key,0x3c开始0x10长度的数据为AES IV,
对响应的内容部分前0x5010
字节进行AES-256-CBC解密(多出来的0x10为AES padding,正常处理会自动去除)
解密得到的内容和0x5010
后的未加密部分拼接,得到原始图片
????? 获得 ??? key 和 IV
对响应的内容部分前0x6410
字节进行 ??? 解密
解密得到的内容和0x5010
后的未加密部分拼接,得到原始图片
流程逻辑来自 https://s1.hdslb.com/bfs/manga-static/manga-pc/static/js/bili.599a7faf18.js
web部分为对密文
CEpQTVYaSwsFR1dLLSQ8QyojLUVIRwUKS1c6QkRSXDFNSwsHR1cyWlFDWV88QkUFEUZbMl1NQVg8EkBDW0hTHk8IAENVTCgkPUonJydDRU8AGEpbNF1NWlk0SU8IAkNVNV9RQlBSOEhDCBlDSTNRQ15RNBcU
base64解码后,使用密钥 shaolaijiemilaoniangdedaima
进行循环字符异或 (haha very funny)
得到aes配置
{
"1":{"al":"AES-CBC","ak":[1,33],"an":[60,76],"at":[0,20]},
"2":{"al":"AES-CBC","ak":[1,33],"an":[60,76],"at":[0,20]}
}
在web加密配置旁边疑似有一个相似流程的配置获取函数,但是此函数内的所有变量都不存在
由于flutter反编译基本等于不存在,故而app加密逻辑若是无法推算出来,基本无法还原其逻辑
(可以猜想app和web类似,也是使用aes,但是key和iv从何而来,以及api发送的m1
有何作用,无从知晓)
- 现阶段只要带上
mobi_app=iphone_comic
即可获得未加密图片,在阿B切断所有旧版本app的使用前,这条路应该不会出问题- 至于切断时间是一个月,一个季度,一年,或者永远,就要看漫画部的营收了(这么看来应该会很快,毕竟漫画快倒闭了)
- web加密逻辑已经完全理解,可以正常通过web渠道拿到加密流程的图片并正常解密,并且即使更换流程逻辑应该也不难跟进修改
切断时间竟然是一周!漫画部倒闭的速度远超我的想象!