前提 此次分析我已经做出b站视频大家可以搜索 带带弟弟学爬虫 链接拼多多滑块JS逆向分析(完结)_哔哩哔哩_bilibili 可以找到此次文章的详细内容。
链接:aHR0cHM6Ly9tbXMucGluZHVvZHVvLmNvbS9sb2dpbi8/cmVkaXJlY3RVcmw9aHR0cHMlM0ElMkYlMkZtbXMucGluZHVvZHVvLmNvbSUyRg==
这些是请求图片的数据包,我们从上向下进行分析。
auth接口
1.crawlerInfo
crawlerInfo也是请求头中的Anti-Content的参数所以搞出一个就行了。
加密的位置在messagePack这里。
2.password和riskSign
直接搜索大法即可找到加密位置其实就是一个rsa加密:
a.c函数是:
I = function(e, t) { if (t.passwordEncrypt) try { var n = new i.a; return n.setPublicKey(t.publicKey), n.encrypt(e) } catch (r) { Object(d.c)(r) } return e }
这个我们直接导入js的加密库即可
const JSEncrypt = require('node-jsencrypt'); // 加密函数 function encryptWithRSA(publicKey, data) { // 创建 JSEncrypt 实例 const encryptor = new JSEncrypt(); // 设置公钥 encryptor.setPublicKey(publicKey); // 使用公钥加密数据 const encryptedData = encryptor.encrypt(data); return encryptedData; }
obtain_captcha接口
这个接口用来是用来获取图片的
`
//请求时 data = { "anti_content": "", //可以置空 "verify_auth_token": token, "captcha_collect": ""//可以置空 }
`
得到的图片 是base64格式 可以进一步处理成图片
user_verify接口
验证滑块和轨迹校验的接口 参数如下图:
我们之前解决了 anti_content , 而verify_auth_token是auth一步骤返回的
所以我们只需要解决 captcha_collect 和 verify_code
1.verify_code
如图所示:
c = (e.deltaRef + s / 2).toFixed(2)
分析得知:e.deltaRef 是图片滑块识别的距离(注意缩放 * 0.85 由于图片大小和实际浏览器显示比例不同) s是定值 48.75
verify_code 即可解决
2.captcha_collect
G.concat([W, N, D, H, L])
是 加密 的数组 包含轨迹等信息:
好我们接着分析 $函数:
定位到这里:
d函数:
手动解混淆
function d(e) { return c['gzip'](e, { to: 'string' }) }
这里我们可以套库 也可以直接扣代码 因为他是webpack形式的 具体细节放b站了。
l函数是aes
l(e, t, n) { return t && n ? o.a['encrypt'](e, a.a['parse'](t), { iv: a.a['parse'](n) })['toString']() : e }
key和iv是经过前一个数据包vc_pre_ck_b 返回的salt 经过 U函数处理 而成的
U = function(e) { var A = "bN3%cH2$H1@*jCo$", W = "gl3-w^dN)3#h6E1%"; var t = { aes_key: A, aes_iv: W }; if (!e || 9 !== e.length) return t; var n = e.slice(0, 1) , r = e.slice(1) , o = r.slice(0, 4) , i = r.slice(4) , a = i.split("") , s = (["a", "b"].includes(n) ? A : W).slice(0, 8) , c = ["a", "b"].includes(n) ? "aes_key" : "aes_iv" , u = ""; switch (n) { case "a": case "c": t[c] = s + r; break; case "b": case "d": for (var l = 0; l < 4; l++) u += a[o[l]]; t[c] = s + u + i } return t }; console.log(U("c660e87ed"));
整合再结合轨迹即可 实现 。