淘宝封杀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

 

淘宝封杀selenium的ua算法分析_第1张图片

 

 

事实证明就是这个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是全局对象

 

淘宝封杀selenium的ua算法分析_第2张图片

 

 

对于h函数,一堆js已经看不过来了,有研究的网友可以提供点线索。ua的分析就先到这里了,下回分析password的加密。

 

欲知后事如何,欢迎关注。

 

------------------------------

 

ID:Python之战

 

|作|者|公(zhong)号:python之战

 

专注Python,专注于网络爬虫、RPA的学习-践行-总结

 

喜欢研究技术瓶颈并分享,欢迎围观,共同学习。

 

独学而无友,则孤陋而寡闻!

 

---------------------------

你可能感兴趣的:(淘宝封杀selenium的ua算法分析)