美文网首页
淘宝封杀selenium的ua算法分析

淘宝封杀selenium的ua算法分析

作者: Python之战 | 来源:发表于2019-01-25 17:44 被阅读0次

    接上一回,我们大致梳理了淘宝封杀selenium的思路,找到核心的参数ua,并抛出疑问:为什么ua每次都不一样,并且随着使用次数次数增加长度越来越长。

    关于为什么每次获取的ua参数长度都不一样,有个网友留言让我豁然开朗:

    `window.__defineGetter__('_f_', function (){return new Date()})
    

    原理就是给这个属性绑定一个输出前的私有方法,每次在获取该属性的时候执行该私有方法,从而达到每次输出的值都不一样。

    受此启发,然后在仔细分析window对象,找到如下两个关键信息

    get _n:ƒ s()arguments:Arguments [callee: ƒ, Symbol(Symbol.iterator): ƒ]caller:ƒ ()length:0name:"s"prototype:{constructor: ƒ}__proto__:ƒ ()[[FunctionLocation]]:115.js?d=24:formatted:559[[Scopes]]:Scopes[2]set _n:ƒ ()arguments:nullcaller:nulllength:0name:""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

    image

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

    image

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

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


    ID:Python之战

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

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

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

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


    相关文章

      网友评论

          本文标题:淘宝封杀selenium的ua算法分析

          本文链接:https://www.haomeiwen.com/subject/rsdvjqtx.html