淘宝封杀selenium的ua算法分析
接上一回,我們大致梳理了淘寶封殺selenium的思路,找到核心的參數ua,并拋出疑問:為什么ua每次都不一樣,并且隨著使用次數次數增加長度越來越長。
?
關于為什么每次獲取的ua參數長度都不一樣,有個網友留言讓我豁然開朗:
`window.__defineGetter__('_f_', function (){return new Date()})
?
原理就是給這個屬性綁定一個輸出前的私有方法,每次在獲取該屬性的時候執行該私有方法,從而達到每次輸出的值都不一樣。
?
受此啟發,然后在仔細分析window對象,找到如下兩個關鍵信息
get _n:? s() arguments:Arguments [callee: ?, Symbol(Symbol.iterator): ?] caller:? () length:0 name:"s" prototype:{constructor: ?} __proto__:? () [[FunctionLocation]]:115.js?d=24:formatted:559 [[Scopes]]:Scopes[2] set _n:? () arguments:null caller:null length:0 name:"" prototype:{constructor: ?} __proto__:? () [[FunctionLocation]]:115.js?d=24:formatted:17214 [[Scopes]]:Scopes[3]
?
有get _n方法和set _n()方法,其中get方法對應115.js文件的559行;set方法對應115文件的17214行。
?
通過調試產生_n值的位置是在get方法中,該函數名為s函數,如下:
function s() { for (var e = 3; void 0 !== e; ) { var a = 3 & e , s = e >> 2 , c = 3 & s; switch (a) { case 0: !function() { switch (c) { case 0: b += "mp", e = 8; break; case 1: e = b ? 0 : 8; break; case 2: e = b ? 1 : 2; break; case 3: b += "romCo", e = 4 } }(); break; case 1: !function() { switch (c) { case 0: b += "atib", e = 2 } }(); break; case 2: b += "ility", S[b] = 1; var r = h(22, S); return r; case 3: var b = "f"; e = b ? 12 : 4 } } }
?
一堆混淆視聽的js,核心的東西只有一句var r = h(22, S); return r;
也就是h(22, S)函數產生了不同的ua
?
?
?
事實證明就是這個h函數決定了ua,繼續看h函數
function h(c, o, n, i, p) { var u, d, v, C, j, E, R, _, T, L, M, N, D, P, I, U, B, F, z, H, Q, V, G, W, X, q, Y, J, K, Z, $, ee, ae, se, ce, re, be, ke, te, oe, ne, ie, he, pe, ue, de, ve, fe, le, ge, Ce, we, me, Ae, Se, je, xe, Oe, ye, Ee, Re, _e, Te, Le, Me, Ne, De, Pe, Ie, Ue, Be, Fe, ze, He, Qe, Ve, Ge, We, Xe, qe, Ye, Je, Ke, Ze, $e, ea, aa, sa, ca, ra, ba, ka, ta, oa, na, ia, ha, pa, ua, da, va, fa, la, ga, Ca, wa, ma, Aa, Sa, ja, xa, Oa, ya, Ea, Ra, _a, Ta, La, Ma, Na, Da, Pa, Ia, Ua, Ba, Fa, za, Ha, Qa, Va, Ga, Wa, Xa, qa, Ya, Ja, Ka, Za, $a, es, as, ss, cs, rs, bs, ks, ts, os, ns, is, hs, ps, us, ds, vs; us = this, is = -1, hs = 0; try { for (var fs = 15782; void 0 !== fs;) { var ls = 31 & fs, gs = fs >> 5, Cs = 31 & gs, ws = gs >> 5, ms = 31 & ws; switch (ls) { case 0: ! function() { switch (Cs) { case 0: ! function() { switch (ms) { case 0: ie = $.charCodeAt(se) - 704, he += String.fromCharCode(ie), fs = 13639; break; case 1: H.push(1), H.push(5), P = void 0, X = Te, C = X[de], X = [], u = "ecapsonom", F = u.split("").reverse().join(""), fs = 4168; break; case 2: R = E, E = 64 > R, fs = E ? 18853 : 7621; break; case 3: L = E[v], T[v] = new RegExp(L), fs = 21952; break; case 4: fs = ie < be.length ? 11652 : 15781; break; case 5: ee += "ingClient", fs = 21221; ······ 省略兩千行左右
?
其中us=this,this是全局對象
?
?
?
對于h函數,一堆js已經看不過來了,有研究的網友可以提供點線索。ua的分析就先到這里了,下回分析password的加密。
?
欲知后事如何,歡迎關注。
?
------------------------------
?
ID:Python之戰
?
|作|者|公(zhong)號:python之戰
?
專注Python,專注于網絡爬蟲、RPA的學習-踐行-總結
?
喜歡研究技術瓶頸并分享,歡迎圍觀,共同學習。
?
獨學而無友,則孤陋而寡聞!
?
---------------------------
總結
以上是生活随笔為你收集整理的淘宝封杀selenium的ua算法分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 华硕A55V,终于解决了无线网指示灯不亮
- 下一篇: 箱体震荡