Python 爬虫进阶必备 | 某爬虫练习站之 js 混淆

Python 爬虫进阶必备 | 某爬虫练习站之 js 混淆,第1张

概述今日网站aHR0cDovL21hdGNoLnl1YW5yZW54dWUuY29tL21hdGNoLzE=这个网站是某大佬搭建的闯关网站无限debugger的绕过打开开发者工具会出现debugger直接在debugger对应的行号,右键选择Neverpausehere即可跳过抓包分析与定位跳过debugger,通过网络面板,找到我们需要分析的参数是下面 今日网站@H_502_2@aHR0cDovL21hdGNolnl1YW5yZW54DWUuY29tL21hdGNolzE=

@H_502_2@这个网站是某大佬搭建的闯关网站

无限 deBUGger 的绕过@H_502_2@打开开发者工具会出现 deBUGger

@H_502_2@直接在 deBUGger 对应的行号,右键选择Never pause here即可跳过

抓包分析与定位@H_502_2@跳过 deBUGger,通过网络面板,找到我们需要分析的参数是下面这个请求的m参数

@H_502_2@参数名字只有一个m,直接检索的话就会出现下面这么多的结果,所以放弃直接检索这个参数来查找位置。

@H_502_2@所以转换思路,使用xhr断点查找参数位置

@H_502_2@找到如下位置即为m参数的生成位置

@H_502_2@这里没办法格式化,不好查看对应的逻辑,所以拷贝到 IDE 中查看

@H_502_2@定位m可以看到下面的逻辑

@H_502_2@这里的moo0O0window.f的值相加得到

加密分析与实现@H_502_2@上面我们定位了m的生成位置,这里需要分析出m的表达式的oo0O0window.f

@H_502_2@先看oo0O0

function oo0O0(mw) {
    window.b = '';
    for (var i = 0, len = window.a.length; i < len; i++) {
        console.log(window.a[i]);
        window.b += String[document.e + document.g](window.a[i][document.f + document.h]() - i - window.c)
    }
    var U = ['W5r5W6VdIHZcT8kU', 'WQ8CWRaxWQirAW=='];
    var J = function (o, E) {
        o = o - 0x0;
        var N = U[o];
        if (J['bSSGte'] === undefined) {
            var Y = function (w) {
                var m = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMnopQRSTUVWXYZ0123456789+/=',
                    T = String(w)['replace'](/=+$/, '');
                var A = '';
                for (var C = 0x0, b, W, l = 0x0; W = T['charat'](L++); ~W && (b = C % 0x4 ? b * 0x40 + W : W, C++ % 0x4) ? A += String['fromCharCode'](0xff & b >> (-0x2 * C & 0x6)) : 0x0) {
                    W = m['indexOf'](W)
                }
                return A
            };
            var t = function (w, m) {
                var T = [], A = 0x0, C, b = '', W = '';
                w = Y(w);
                for (var R = 0x0, v = w['length']; R < v; R++) {
                    W += '%' + ('00' + w['charCodeAt'](R)['toString'](0x10))['slice'](-0x2)
                }
                w = decodeURIComponent(W);
                var l;
                for (l = 0x0; l < 0x100; L++) {
                    T[l] = l
                }
                for (l = 0x0; l < 0x100; L++) {
                    A = (A + T[l] + m['charCodeAt'](l % m['length'])) % 0x100, C = T[l], T[l] = T[A], T[A] = C
                }
                l = 0x0, A = 0x0;
                for (var L = 0x0; L < w['length']; L++) {
                    l = (l + 0x1) % 0x100, A = (A + T[l]) % 0x100, C = T[l], T[l] = T[A], T[A] = C, b += String['fromCharCode'](w['charCodeAt'](L) ^ T[(T[l] + T[A]) % 0x100])
                }
                return b
            };
            J['luAabU'] = t, J['qlVPZg'] = {}, J['bSSGte'] = !![]
        }
        var H = J['qlVPZg'][o];
        return H === undefined ? (J['TUDBIJ'] === undefined && (J['TUDBIJ'] = !![]), N = J['luAabU'](N, E), J['qlVPZg'][o] = N) : N = H, N
    };
    eval(atob(window['b'])[J('0x0', ']dQW')](J('0x1', 'GTu!'), '\x27' + mw + '\x27'));
    return ''
}
@H_502_2@直接复制在控制台运行,得到结果是空

@H_502_2@那么m的值由window.f决定,window.f在逻辑中没有找到。

@H_502_2@但是每次运行oo0O0都会改变window.f的值,所以问题还是出在oo0O0中,所以进一步分析oo0O0的逻辑

@H_502_2@oo0O0中虽然返回值是空的字符串,但是在返回前执行了下面这行代码

eval(atob(window['b'])[J('0x0', ']dQW')](J('0x1', 'GTu!'), '\x27' + mw + '\x27'));
@H_502_2@通过执行atob(window['b'])得到下面这一大串的逻辑

@H_502_2@这里面就包含了window.f

@H_502_2@再结合oo0O0中的JU可以得出J('0x0', ']dQW')J('0x1', 'GTu!')的结果如下

@H_502_2@这样原有的代码

eval(atob(window['b'])[J('0x0', ']dQW')](J('0x1', 'GTu!'), '\x27' + mw + '\x27'));
@H_502_2@可以等价为

// 这里的省略号为上面 atob(window['b']) 的结果
eval('........hex_md5(mwqqppz)'.replace('mwqqppz', '\x27' + mw + '\x27'));
@H_502_2@所以这里的加密是通过将 hex_md5 的主体加密逻辑隐藏在 base64 编码里,然后将关键的参数通过字符串替换的方式替换,再使用eval执行

@H_502_2@厉害厉害,比一般的商业网站还会玩

@H_502_2@好了,今天的文章就到这里了,咱们下次再会~

总结

以上是内存溢出为你收集整理的Python 爬虫进阶必备 | 某爬虫练习站之 js 混淆全部内容,希望文章能够帮你解决Python 爬虫进阶必备 | 某爬虫练习站之 js 混淆所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1187977.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-03
下一篇 2022-06-03

发表评论

登录后才能评论

评论列表(0条)

保存