ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2021-04-04 21:55:02  阅读:261  来源: 互联网

标签:进阶 Python 0x1 0x0 爬虫 oo0O0 window var x27


今日网站

aHR0cDovL21hdGNoLnl1YW5yZW54dWUuY29tL21hdGNoLzE=

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

无限 debugger 的绕过

打开开发者工具会出现 debugger

图片

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

图片

抓包分析与定位

跳过 debugger,通过网络面板,找到我们需要分析的参数是下面这个请求的m参数

图片

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

图片

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

图片

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

图片

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

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

图片

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

加密分析与实现

上面我们定位了m的生成位置,这里需要分析出m的表达式的oo0O0window.f

先看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 ''
}

直接复制在控制台运行,得到结果是空

图片

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

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

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

eval(atob(window['b'])[J('0x0', ']dQW')](J('0x1', 'GTu!'), '\x27' + mw + '\x27'));

通过执行atob(window['b'])得到下面这一大串的逻辑

图片

这里面就包含了window.f

图片

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

图片

这样原有的代码

eval(atob(window['b'])[J('0x0', ']dQW')](J('0x1', 'GTu!'), '\x27' + mw + '\x27'));

可以等价为

// 这里的省略号为上面 atob(window['b']) 的结果
eval('........hex_md5(mwqqppz)'.replace('mwqqppz', '\x27' + mw + '\x27'));

所以这里的加密是通过将 hex_md5 的主体加密逻辑隐藏在 base64 编码里,然后将关键的参数通过字符串替换的方式替换,再使用eval执行

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

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


标签:进阶,Python,0x1,0x0,爬虫,oo0O0,window,var,x27
来源: https://blog.51cto.com/15127522/2684974

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有