本帖最后由 djmingge 于 2022-1-13 14:15 编辑
抓包初次分析- 使用的工具是谷歌浏览器
- F12打开开发者工具
- 打开链接:http://v.pptv.com/show/XLafHYXrW5n8euI.html
- 切换Network查看抓包
- 搜索api,找到 http://oneplay.api.pptv.com
图1
我们选择预览,发现里面的就是我们要的真实的视频相关信息
我们继续分析接口,发现传了三个重要参数 cipher, encryptParams,vvId
其余两个参数不重要。
下一步就是要来逆向它的算法了。
接着分析参数加密
发现了接口,我们在看是从哪个js文件发出的请求
图2
很容易发现是http://static9.pplive.cn/corporate/player/v_20210524101320_d88b15/dist/player-major.js这个文件
转到Sources页面 我这里是来源页面,左侧网页文件里找到这个js文件
图3
我们先右键这份文件保存到本地,好处理,在点这个{}格式化一下代码。把美化好的代码复制粘贴到本地这个js文件,保存
图4
在采用的软件是charles抓包软件,目的是把文件映射到本地
具体怎么映射,可以百度,也可以不需要映射,直接在Sources页面分析
我们js文件里按ctrl+f搜索参数cipher或者encryptParams
有三处结果
图5
发现这两个参数都是var g = c.a.get3desKeyRandom(n);算出的
我们在这里打一个断点,在刷新网页,
就会出现n的字符串,为
"type=mhpptv&appId=pptv.web.h5&appPlt=web&appVer=1.0.4&channel=sn.cultural&sdkVer=1.5.0&cid=9053276&allowFt=0,1,2,3&rf=0&ppi=302c37&o=0&ahl_ver=1&ahl_random=464f5c6e224a313c525c7a59424b413a&ahl_signa=b2d0cd91cbcae282fa30e53f0d86795722304eb13cb39ca862db96603a5a61bd&version=1&streamFormat=1&videoFormat=m3u8"
既然拿到了加密的字符串,我们就先分析字串里的参数
我们重复刷新网页几次,发现同一个剧变化的参数只有ahl_random,ahl_signa
那么接下来,我们继续找这个两个参数的加密函数
我们往上滑,找到了参数的加密函数为e.get3rdKeyRandom()
图6
鼠标放在o.type显示mhpptv
图7
我分析它暂时是固定的mhpptv。
在鼠标放在get3rdKeyRandom,它指向了26873行的函数
图8
我们直接进入,经过我的还原,能运行的js就应该为
[JavaScript] 纯文本查看 复制代码 e = "mhpptv";
function get3rdKeyRandom(e){
var t = e
, i = getRandomWithLen(16)
, n = i;
i += t + "-1V8oo0Or1f047NaiMTxK123LMFuINTNeI";
var a = getSignatureWithKey(i);
return {
random_hex: encodeHex(n),
signature_hex: a
}
}
发现里面还有个getRandomWithLen(),getSignatureWithKey(),encodeHex()
图9
图10
图11
进入,经测试还原为
[JavaScript] 纯文本查看 复制代码 e = 16;
function getRandomWithLen (e) {
for (var t = "", i = 0; i < e; i++) {
var n = 93 * Math.random() + 33 >> 0;
t += String.fromCharCode(n)
}
return t
}
function getSignatureWithKey(e){
for (var t = "", i = 0; i < e.length; i++){
t += e.charCodeAt(i).toString(16);
}
i = CryptoJS.SHA256(CryptoJS.enc.Hex.parse(t));
return CryptoJS.enc.Hex.stringify(i)
}
function encodeHex(e) {
for (var t = "", i = e.length, n = 0; n < i; ++n) {
var a = e.charCodeAt(n);
t += "0123456789abcdef"[a >> 4],
t += "0123456789abcdef"[15 & a]
}
return t
}
图12
图13
图14
这里用到了CryptoJS库。
到目前为止,两个参数的加密就已经处理完毕了。
接下来就是,处理参数cipher和encryptParams,写的有点多,后续会出下一篇,体谅一下。
cipherherciphercipcipherher |