0


Web Spider XHR断点 堆栈跟值 逆向案例(四)

在这里插入图片描述

声明

此次案例只为学习交流使用,抓包内容、敏感网址、数据接口均已做脱敏处理,切勿用于其他非法用途;

文章目录


前言

目标网站地址:aHR0cHM6Ly9tdXNpYy4xNjMuY29tLw==


提示:以下是本篇文章正文内容,下面案例可供参考

一、任务说明

1、输入歌手名,歌曲名等关键词,可以检索相关的信息;
2、输入该平台的歌曲ID,即可完成歌曲的下载;
在这里插入图片描述
最终结果
在这里插入图片描述

二、网站分析

实现思路

  • 1、通过关键词检索,拿到歌曲信息;
  • 2、通过歌曲ID请求某接口,拿到歌曲的.m4a链接;
  • 3、通过歌曲的.m4a链接进行歌曲下载;

1、打开网站,首页搜索框输入关键词,按回车键,可以发现这个XHR响应接口;
关键词检索歌曲信息接口url:aHR0cHM6Ly9tdXNpYy4xNjMuY29tL3dlYXBpL2Nsb3Vkc2VhcmNoL2dldC93ZWI/Y3NyZl90b2tlbj0=
在这里插入图片描述
分析请求参数,这是使用RSA、AES混合加密的字符串,具体的加密代码我会放在后面;
在这里插入图片描述
加密的明文数据为下列的字符串,只需更换关键词(“青花瓷”)调用JS代码进行加密即可:

'{"hlpretag":"<span class=\"s-fc7\">","hlposttag":"</span>","s":"青花瓷","type":"1","offset":"0","total":"true","limit":"30","csrf_token":""}'

调用JS加密实现,以及模拟发包
在这里插入图片描述
2、根据歌曲ID请求接口,拿到歌曲的.m4a链接,点击任意一首歌曲播放,会使用歌曲ID请求接口;

通过歌曲ID请求接口url:aHR0cHM6Ly9tdXNpYy4xNjMuY29tL3dlYXBpL3NvbmcvZW5oYW5jZS9wbGF5ZXIvdXJsL3YxP2NzcmZfdG9rZW49
在这里插入图片描述
加密的明文数据为下列的字符串,只需更换歌曲ID(1978112718)调用JS代码进行加密即可:

{"ids":[1978112718],"level":"standard","encodeType":"aac","csrf_token":""}

调用JS加密实现,以及模拟发包
在这里插入图片描述
3、拿到歌曲的.m4a链接打开就可以直接播放啦
在这里插入图片描述

三、XHR断点调试,扣JS加密代码

逆向思路

  • 1、通过浏览器,资源面板,添加XHR断点,让其在浏览器请求之前断住,以便我们分析请求参数;
  • 2、通过资源面板下的调用堆栈,进行跟值,找到加密代码处;
  • 3、通过Notepad++工具,格式化JS代码,方便我们扣取自己想要的JS代码;
  • 4、通过浏览器等工具运行/调试JS代码;
  • 5、通过python代码调用JS代码实现整个任务;

1、根据接口的url,下XHR断点,这里以关键词检索歌曲信息接口为例;
如果浏览器向该接口发送请求则会在发包前进行断点;
在这里插入图片描述
2、在首页输入关键词搜索即可触发,可以发现此处的代码参数已经生成,需要通过调用堆栈进行跟值,找到加密代码处,一个一个往下跟,正常流程是每从堆栈切换至一个新的函数,得取消之前的断点,在新函数处重新下断点,刷新操作;
在这里插入图片描述
通过调用堆栈跟值来到此处明文加密函数,在window.asrsea()重新下断点;
在这里插入图片描述
取消XHR断点,刷新操作,进入window.asrsea()函数,可以看见window.asrsea()是由d()函数赋值的
在这里插入图片描述
3、ctrl+A,全选代码复制,打开Notepad++新建文件,粘贴至文件中;
代码格式化:语言/J/JavaScript,代码折叠:视图/折叠所有层次,ctrl+F全局搜索:window.asrsea = d;
在这里插入图片描述
开始扣JS代码,代码需要扣全
在这里插入图片描述
4、通过浏览器等工具,自定义一些方法以便我们运行/调试JS代码;
在这里插入图片描述

四、代码实现

1、JS加密代码:encode.js

var CryptoJS = CryptoJS ||function(u, p){
    var d ={}, l = d.lib ={}, s =function(){}, t = l.Base ={
        extend:function(a){
            s.prototype = this;
            var c = new s;
            a && c.mixIn(a);
            c.hasOwnProperty("init")||(c.init =function(){
                c.$super.init.apply(this, arguments)});
            c.init.prototype = c;
            c.$super = this;return c
        },
        create:function(){
            var a = this.extend();
            a.init.apply(a, arguments);return a
        },
        init:function(){},
        mixIn:function(a){for(var c in a)
                a.hasOwnProperty(c)&&(this[c]= a[c]);
            a.hasOwnProperty("toString")&&(this.toString = a.toString)},
        clone:function(){return this.init.prototype.extend(this)}}, r = l.WordArray = t.extend({
        init:function(a, c){
            a = this.words = a ||[];
            this.sigBytes = c != p ? c :4* a.length
        },
        toString:function(a){return(a || v).stringify(this)},
        concat:function(a){
            var c = this.words
              , e = a.words
              , j = this.sigBytes;
            a = a.sigBytes;
            this.clamp();if(j %4)for(var k =0; k < a; k++)
                    c[j + k >>>2]|=(e[k >>>2]>>>24-8*(k %4)&255)<<24-8*((j + k)%4);elseif(65535< e.length)for(k =0; k < a; k +=4)
                    c[j + k >>>2]= e[k >>>2];else
                c.push.apply(c, e);
            this.sigBytes += a;return this
        },
        clamp:function(){
            var a = this.words
              , c = this.sigBytes;
            a[c >>>2]&=4294967295<<32-8*(c %4);
            a.length = u.ceil(c /4)},
        clone:function(){
            var a = t.clone.call(this);
            a.words = this.words.slice(0);return a
        },
        random:function(a){for(var c =[], e =0; e < a; e +=4)
                c.push(4294967296* u.random()|0);return new r.init(c,a)}}), w = d.enc ={}, v = w.Hex ={
        stringify:function(a){
            var c = a.words;
            a = a.sigBytes;for(var e =[], j =0; j < a; j++){
                var k = c[j >>>2]>>>24-8*(j %4)&255;
                e.push((k >>>4).toString(16));
                e.push((k &15).toString(16))}return e.join("")},
        parse:function(a){for(var c = a.length, e =[], j =0; j < c; j +=2)
                e[j >>>3]|=parseInt(a.substr(j,2),16)<<24-4*(j %8);return new r.init(e,c /2)}}, b = w.Latin1 ={
        stringify:function(a){
            var c = a.words;
            a = a.sigBytes;for(var e =[], j =0; j < a; j++)
                e.push(String.fromCharCode(c[j >>>2]>>>24-8*(j %4)&255));return e.join("")},
        parse:function(a){for(var c = a.length, e =[], j =0; j < c; j++)
                e[j >>>2]|=(a.charCodeAt(j)&255)<<24-8*(j %4);return new r.init(e,c)}}, x = w.Utf8 ={
        stringify:function(a){
            try {returndecodeURIComponent(escape(b.stringify(a)))}catch(c){
                throw Error("Malformed UTF-8 data")}},
        parse:function(a){return b.parse(unescape(encodeURIComponent(a)))}}, q = l.BufferedBlockAlgorithm = t.extend({
        reset:function(){
            this.i3x = new r.init;
            this.yE1x =0},
        Ap1x:function(a){"string"==typeof a &&(a = x.parse(a));
            this.i3x.concat(a);
            this.yE1x += a.sigBytes
        },
        mD7w:function(a){
            var c = this.i3x
              , e = c.words
              , j = c.sigBytes
              , k = this.blockSize
              , b = j /(4* k), b = a ? u.ceil(b): u.max((b |0)- this.UZ9Q,0);
            a = b * k;
            j = u.min(4* a, j);if(a){for(var q =0; q < a; q += k)
                    this.tt9k(e, q);
                q = e.splice(0, a);
                c.sigBytes -= j
            }return new r.init(q,j)},
        clone:function(){
            var a = t.clone.call(this);
            a.i3x = this.i3x.clone();return a
        },
        UZ9Q:0});
    l.Hasher = q.extend({
        cfg: t.extend(),
        init:function(a){
            this.cfg = this.cfg.extend(a);
            this.reset()},
        reset:function(){
            q.reset.call(this);
            this.mk7d()},
        update:function(a){
            this.Ap1x(a);
            this.mD7w();return this
        },
        finalize:function(a){
            a && this.Ap1x(a);return this.nZ7S()},
        blockSize:16,
        mO7H:function(a){returnfunction(b, e){return(new a.init(e)).finalize(b)}},
        yD1x:function(a){returnfunction(b, e){return(new n.HMAC.init(a,e)).finalize(b)}}});
    var n = d.algo ={};return d
}(Math);(function(){
    var u = CryptoJS
      , p = u.lib.WordArray;
    u.enc.Base64 ={
        stringify:function(d){
            var l = d.words
              , p = d.sigBytes
              , t = this.bD3x;
            d.clamp();
            d =[];for(var r =0; r < p; r +=3)for(var w =(l[r >>>2]>>>24-8*(r %4)&255)<<16|(l[r +1>>>2]>>>24-8*((r +1)%4)&255)<<8| l[r +2>>>2]>>>24-8*((r +2)%4)&255, v =0;4> v && r +.75* v < p; v++)
                    d.push(t.charAt(w >>>6*(3- v)&63));if(l = t.charAt(64))for(; d.length %4;)
                    d.push(l);return d.join("")},
        parse:function(d){
            var l = d.length
              , s = this.bD3x
              , t = s.charAt(64);
            t &&(t = d.indexOf(t),-1!= t &&(l = t));for(var t =[], r =0, w =0; w < l; w++)if(w %4){
                    var v = s.indexOf(d.charAt(w -1))<<2*(w %4), b = s.indexOf(d.charAt(w))>>>6-2*(w %4);
                    t[r >>>2]|=(v | b)<<24-8*(r %4);
                    r++}return p.create(t, r)},
        bD3x:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="}})();(function(u){
    function p(b, n, a, c, e, j, k){
        b = b +(n & a |~n & c)+ e + k;return(b << j | b >>>32- j)+ n
    }
    function d(b, n, a, c, e, j, k){
        b = b +(n & c | a &~c)+ e + k;return(b << j | b >>>32- j)+ n
    }
    function l(b, n, a, c, e, j, k){
        b = b +(n ^ a ^ c)+ e + k;return(b << j | b >>>32- j)+ n
    }
    function s(b, n, a, c, e, j, k){
        b = b +(a ^(n |~c))+ e + k;return(b << j | b >>>32- j)+ n
    }for(var t = CryptoJS, r = t.lib, w = r.WordArray, v = r.Hasher, r = t.algo, b =[], x =0;64> x; x++)
        b[x]=4294967296* u.abs(u.sin(x +1))|0;
    r = r.MD5 = v.extend({
        mk7d:function(){
            this.cT4X = new w.init([1732584193,4023233417,2562383102,271733878])},
        tt9k:function(q, n){for(var a =0;16> a; a++){
                var c = n + a
                  , e = q[c];
                q[c]=(e <<8| e >>>24)&16711935|(e <<24| e >>>8)&4278255360}
            var a = this.cT4X.words
              , c = q[n +0], e = q[n +1], j = q[n +2], k = q[n +3], z = q[n +4], r = q[n +5], t = q[n +6], w = q[n +7], v = q[n +8], A = q[n +9], B = q[n +10], C = q[n +11], u = q[n +12], D = q[n +13], E = q[n +14], x = q[n +15], f = a[0], m = a[1], g = a[2], h = a[3], f =p(f, m, g, h, c,7, b[0]), h =p(h, f, m, g, e,12, b[1]), g =p(g, h, f, m, j,17, b[2]), m =p(m, g, h, f, k,22, b[3]), f =p(f, m, g, h, z,7, b[4]), h =p(h, f, m, g, r,12, b[5]), g =p(g, h, f, m, t,17, b[6]), m =p(m, g, h, f, w,22, b[7]), f =p(f, m, g, h, v,7, b[8]), h =p(h, f, m, g, A,12, b[9]), g =p(g, h, f, m, B,17, b[10]), m =p(m, g, h, f, C,22, b[11]), f =p(f, m, g, h, u,7, b[12]), h =p(h, f, m, g, D,12, b[13]), g =p(g, h, f, m, E,17, b[14]), m =p(m, g, h, f, x,22, b[15]), f =d(f, m, g, h, e,5, b[16]), h =d(h, f, m, g, t,9, b[17]), g =d(g, h, f, m, C,14, b[18]), m =d(m, g, h, f, c,20, b[19]), f =d(f, m, g, h, r,5, b[20]), h =d(h, f, m, g, B,9, b[21]), g =d(g, h, f, m, x,14, b[22]), m =d(m, g, h, f, z,20, b[23]), f =d(f, m, g, h, A,5, b[24]), h =d(h, f, m, g, E,9, b[25]), g =d(g, h, f, m, k,14, b[26]), m =d(m, g, h, f, v,20, b[27]), f =d(f, m, g, h, D,5, b[28]), h =d(h, f, m, g, j,9, b[29]), g =d(g, h, f, m, w,14, b[30]), m =d(m, g, h, f, u,20, b[31]), f =l(f, m, g, h, r,4, b[32]), h =l(h, f, m, g, v,11, b[33]), g =l(g, h, f, m, C,16, b[34]), m =l(m, g, h, f, E,23, b[35]), f =l(f, m, g, h, e,4, b[36]), h =l(h, f, m, g, z,11, b[37]), g =l(g, h, f, m, w,16, b[38]), m =l(m, g, h, f, B,23, b[39]), f =l(f, m, g, h, D,4, b[40]), h =l(h, f, m, g, c,11, b[41]), g =l(g, h, f, m, k,16, b[42]), m =l(m, g, h, f, t,23, b[43]), f =l(f, m, g, h, A,4, b[44]), h =l(h, f, m, g, u,11, b[45]), g =l(g, h, f, m, x,16, b[46]), m =l(m, g, h, f, j,23, b[47]), f =s(f, m, g, h, c,6, b[48]), h =s(h, f, m, g, w,10, b[49]), g =s(g, h, f, m, E,15, b[50]), m =s(m, g, h, f, r,21, b[51]), f =s(f, m, g, h, u,6, b[52]), h =s(h, f, m, g, k,10, b[53]), g =s(g, h, f, m, B,15, b[54]), m =s(m, g, h, f, e,21, b[55]), f =s(f, m, g, h, v,6, b[56]), h =s(h, f, m, g, x,10, b[57]), g =s(g, h, f, m, t,15, b[58]), m =s(m, g, h, f, D,21, b[59]), f =s(f, m, g, h, z,6, b[60]), h =s(h, f, m, g, C,10, b[61]), g =s(g, h, f, m, j,15, b[62]), m =s(m, g, h, f, A,21, b[63]);
            a[0]= a[0]+ f |0;
            a[1]= a[1]+ m |0;
            a[2]= a[2]+ g |0;
            a[3]= a[3]+ h |0},
        nZ7S:function(){
            var b = this.i3x
              , n = b.words
              , a =8* this.yE1x
              , c =8* b.sigBytes;
            n[c >>>5]|=128<<24- c %32;
            var e = u.floor(a /4294967296);
            n[(c +64>>>9<<4)+15]=(e <<8| e >>>24)&16711935|(e <<24| e >>>8)&4278255360;
            n[(c +64>>>9<<4)+14]=(a <<8| a >>>24)&16711935|(a <<24| a >>>8)&4278255360;
            b.sigBytes =4*(n.length +1);
            this.mD7w();
            b = this.cT4X;
            n = b.words;for(a =0;4> a; a++)
                c = n[a],
                n[a]=(c <<8| c >>>24)&16711935|(c <<24| c >>>8)&4278255360;return b
        },
        clone:function(){
            var b = v.clone.call(this);
            b.cT4X = this.cT4X.clone();return b
        }});
    t.MD5 = v.mO7H(r);
    t.HmacMD5 = v.yD1x(r)})(Math);(function(){
    var u = CryptoJS
      , p = u.lib
      , d = p.Base
      , l = p.WordArray
      , p = u.algo
      , s = p.EvpKDF = d.extend({
        cfg: d.extend({
            keySize:4,
            hasher: p.MD5,
            iterations:1}),
        init:function(d){
            this.cfg = this.cfg.extend(d)},
        compute:function(d, r){for(var p = this.cfg, s = p.hasher.create(), b = l.create(), u = b.words, q = p.keySize, p = p.iterations; u.length < q;){
                n && s.update(n);
                var n = s.update(d).finalize(r);
                s.reset();for(var a =1; a < p; a++)
                    n = s.finalize(n),
                    s.reset();
                b.concat(n)}
            b.sigBytes =4* q;return b
        }});
    u.EvpKDF =function(d, l, p){return s.create(p).compute(d, l)}})();
CryptoJS.lib.Cipher ||function(u){
    var p = CryptoJS
      , d = p.lib
      , l = d.Base
      , s = d.WordArray
      , t = d.BufferedBlockAlgorithm
      , r = p.enc.Base64
      , w = p.algo.EvpKDF
      , v = d.Cipher = t.extend({
        cfg: l.extend(),
        createEncryptor:function(e, a){return this.create(this.If5k, e, a)},
        createDecryptor:function(e, a){return this.create(this.brx7q, e, a)},
        init:function(e, a, b){
            this.cfg = this.cfg.extend(b);
            this.UA9r = e;
            this.J3x = a;
            this.reset()},
        reset:function(){
            t.reset.call(this);
            this.mk7d()},
        process:function(e){
            this.Ap1x(e);return this.mD7w()},
        finalize:function(e){
            e && this.Ap1x(e);return this.nZ7S()},
        keySize:4,
        ivSize:4,
        If5k:1,
        brx7q:2,
        mO7H:function(e){return{
                encrypt:function(b, k, d){return("string"==typeof k ? c : a).encrypt(e, b, k, d)},
                decrypt:function(b, k, d){return("string"==typeof k ? c : a).decrypt(e, b, k, d)}}}});
    d.StreamCipher = v.extend({
        nZ7S:function(){return this.mD7w(!0)},
        blockSize:1});
    var b = p.mode ={}, x =function(e, a, b){
        var c = this.tC9t;
        c ? this.tC9t = u : c = this.DV2x;for(var d =0; d < b; d++)
            e[a + d]^= c[d]}, q =(d.BlockCipherMode = l.extend({
        createEncryptor:function(e, a){return this.Encryptor.create(e, a)},
        createDecryptor:function(e, a){return this.Decryptor.create(e, a)},
        init:function(e, a){
            this.ua9R = e;
            this.tC9t = a
        }})).extend();
    q.Encryptor = q.extend({
        processBlock:function(e, a){
            var b = this.ua9R
              , c = b.blockSize;
            x.call(this, e, a, c);
            b.encryptBlock(e, a);
            this.DV2x = e.slice(a, a + c)}});
    q.Decryptor = q.extend({
        processBlock:function(e, a){
            var b = this.ua9R
              , c = b.blockSize
              , d = e.slice(a, a + c);
            b.decryptBlock(e, a);
            x.call(this, e, a, c);
            this.DV2x = d
        }});
    b = b.CBC = q;
    q =(p.pad ={}).Pkcs7 ={
        pad:function(a, b){for(var c =4* b, c = c - a.sigBytes % c, d = c <<24| c <<16| c <<8| c, l =[], n =0; n < c; n +=4)
                l.push(d);
            c = s.create(l, c);
            a.concat(c)},
        unpad:function(a){
            a.sigBytes -= a.words[a.sigBytes -1>>>2]&255}};
    d.BlockCipher = v.extend({
        cfg: v.cfg.extend({
            mode: b,
            padding: q
        }),
        reset:function(){
            v.reset.call(this);
            var a = this.cfg
              , b = a.iv
              , a = a.mode;if(this.UA9r == this.If5k)
                var c = a.createEncryptor;else
                c = a.createDecryptor,
                this.UZ9Q =1;
            this.eR5W = c.call(a, this, b && b.words)},
        tt9k:function(a, b){
            this.eR5W.processBlock(a, b)},
        nZ7S:function(){
            var a = this.cfg.padding;if(this.UA9r == this.If5k){
                a.pad(this.i3x, this.blockSize);
                var b = this.mD7w(!0)}else
                b = this.mD7w(!0),
                a.unpad(b);return b
        },
        blockSize:4});
    var n = d.CipherParams = l.extend({
        init:function(a){
            this.mixIn(a)},
        toString:function(a){return(a || this.formatter).stringify(this)}}), b =(p.format ={}).OpenSSL ={
        stringify:function(a){
            var b = a.ciphertext;
            a = a.salt;return(a ? s.create([1398893684,1701076831]).concat(a).concat(b): b).toString(r)},
        parse:function(a){
            a = r.parse(a);
            var b = a.words;if(1398893684== b[0]&&1701076831== b[1]){
                var c = s.create(b.slice(2,4));
                b.splice(0,4);
                a.sigBytes -=16}return n.create({
                ciphertext: a,
                salt: c
            })}}, a = d.SerializableCipher = l.extend({
        cfg: l.extend({
            format: b
        }),
        encrypt:function(a, b, c, d){
            d = this.cfg.extend(d);
            var l = a.createEncryptor(c, d);
            b = l.finalize(b);
            l = l.cfg;return n.create({
                ciphertext: b,
                key: c,
                iv: l.iv,
                algorithm: a,
                mode: l.mode,
                padding: l.padding,
                blockSize: a.blockSize,
                formatter: d.format
            })},
        decrypt:function(a, b, c, d){
            d = this.cfg.extend(d);
            b = this.HX5c(b, d.format);return a.createDecryptor(c, d).finalize(b.ciphertext)},
        HX5c:function(a, b){return"string"==typeof a ? b.parse(a, this): a
        }}), p =(p.kdf ={}).OpenSSL ={
        execute:function(a, b, c, d){
            d ||(d = s.random(8));
            a = w.create({
                keySize: b + c
            }).compute(a, d);
            c = s.create(a.words.slice(b),4* c);
            a.sigBytes =4* b;return n.create({
                key: a,
                iv: c,
                salt: d
            })}}, c = d.PasswordBasedCipher = a.extend({
        cfg: a.cfg.extend({
            kdf: p
        }),
        encrypt:function(b, c, d, l){
            l = this.cfg.extend(l);
            d = l.kdf.execute(d, b.keySize, b.ivSize);
            l.iv = d.iv;
            b = a.encrypt.call(this, b, c, d.key, l);
            b.mixIn(d);return b
        },
        decrypt:function(b, c, d, l){
            l = this.cfg.extend(l);
            c = this.HX5c(c, l.format);
            d = l.kdf.execute(d, b.keySize, b.ivSize, c.salt);
            l.iv = d.iv;return a.decrypt.call(this, b, c, d.key, l)}})}();(function(){for(var u = CryptoJS, p = u.lib.BlockCipher, d = u.algo, l =[], s =[], t =[], r =[], w =[], v =[], b =[], x =[], q =[], n =[], a =[], c =0;256> c; c++)
        a[c]=128> c ? c <<1: c <<1^283;for(var e =0, j =0, c =0;256> c; c++){
        var k = j ^ j <<1^ j <<2^ j <<3^ j <<4, k = k >>>8^ k &255^99;
        l[e]= k;
        s[k]= e;
        var z = a[e], F = a[z], G = a[F], y =257* a[k]^16843008* k;
        t[e]= y <<24| y >>>8;
        r[e]= y <<16| y >>>16;
        w[e]= y <<8| y >>>24;
        v[e]= y;
        y =16843009* G ^65537* F ^257* z ^16843008* e;
        b[k]= y <<24| y >>>8;
        x[k]= y <<16| y >>>16;
        q[k]= y <<8| y >>>24;
        n[k]= y;
        e ?(e = z ^ a[a[a[G ^ z]]],
        j ^= a[a[j]]): e = j =1}
    var H =[0,1,2,4,8,16,32,64,128,27,54], d = d.AES = p.extend({
        mk7d:function(){for(var a = this.J3x, c = a.words, d = a.sigBytes /4, a =4*((this.bgi3x = d +6)+1), e = this.brW7P =[], j =0; j < a; j++)if(j < d)
                    e[j]= c[j];else{
                    var k = e[j -1];
                    j % d ?6< d &&4== j % d &&(k = l[k >>>24]<<24| l[k >>>16&255]<<16| l[k >>>8&255]<<8| l[k &255]):(k = k <<8| k >>>24,
                    k = l[k >>>24]<<24| l[k >>>16&255]<<16| l[k >>>8&255]<<8| l[k &255],
                    k ^= H[j / d |0]<<24);
                    e[j]= e[j - d]^ k
                }
            c = this.bse7X =[];for(d =0; d < a; d++)
                j = a - d,
                k = d %4? e[j]: e[j -4],
                c[d]=4> d ||4>= j ? k : b[l[k >>>24]]^ x[l[k >>>16&255]]^ q[l[k >>>8&255]]^ n[l[k &255]]},
        encryptBlock:function(a, b){
            this.DW2x(a, b, this.brW7P, t, r, w, v, l)},
        decryptBlock:function(a, c){
            var d = a[c +1];
            a[c +1]= a[c +3];
            a[c +3]= d;
            this.DW2x(a, c, this.bse7X, b, x, q, n, s);
            d = a[c +1];
            a[c +1]= a[c +3];
            a[c +3]= d
        },
        DW2x:function(a, b, c, d, e, j, l, f){for(var m = this.bgi3x, g = a[b]^ c[0], h = a[b +1]^ c[1], k = a[b +2]^ c[2], n = a[b +3]^ c[3], p =4, r =1; r < m; r++)
                var q = d[g >>>24]^ e[h >>>16&255]^ j[k >>>8&255]^ l[n &255]^ c[p++], s = d[h >>>24]^ e[k >>>16&255]^ j[n >>>8&255]^ l[g &255]^ c[p++], t = d[k >>>24]^ e[n >>>16&255]^ j[g >>>8&255]^ l[h &255]^ c[p++], n = d[n >>>24]^ e[g >>>16&255]^ j[h >>>8&255]^ l[k &255]^ c[p++], g = q
                  , h = s
                  , k = t;
            q =(f[g >>>24]<<24| f[h >>>16&255]<<16| f[k >>>8&255]<<8| f[n &255])^ c[p++];
            s =(f[h >>>24]<<24| f[k >>>16&255]<<16| f[n >>>8&255]<<8| f[g &255])^ c[p++];
            t =(f[k >>>24]<<24| f[n >>>16&255]<<16| f[g >>>8&255]<<8| f[h &255])^ c[p++];
            n =(f[n >>>24]<<24| f[g >>>16&255]<<16| f[h >>>8&255]<<8| f[k &255])^ c[p++];
            a[b]= q;
            a[b +1]= s;
            a[b +2]= t;
            a[b +3]= n
        },
        keySize:8});
    u.AES = p.mO7H(d)})();
function RSAKeyPair(a, b, c){
    this.e =biFromHex(a),
    this.d =biFromHex(b),
    this.m =biFromHex(c),
    this.chunkSize =2*biHighIndex(this.m),
    this.radix =16,
    this.barrett = new BarrettMu(this.m)}
function twoDigit(a){return(10> a ?"0":"")+String(a)}
function encryptedString(a, b){for(var f, g, h, i, j, k, l, c = new Array, d = b.length, e =0; d > e;)
        c[e]= b.charCodeAt(e),
        e++;for(;0!= c.length % a.chunkSize;)
        c[e++]=0;for(f = c.length,
    g ="",
    e =0; f > e; e += a.chunkSize){for(j = new BigInt,
        h =0,
        i = e; i < e + a.chunkSize;++h)
            j.digits[h]= c[i++],
            j.digits[h]+= c[i++]<<8;
        k = a.barrett.powMod(j, a.e),
        l =16== a.radix ?biToHex(k):biToString(k, a.radix),
        g += l +" "}return g.substring(0, g.length -1)}
function decryptedString(a, b){
    var e, f, g, h, c = b.split(" "), d ="";for(e =0; e < c.length;++e)for(h =16== a.radix ?biFromHex(c[e]):biFromString(c[e], a.radix),
        g = a.barrett.powMod(h, a.d),
        f =0; f <=biHighIndex(g);++f)
            d += String.fromCharCode(255& g.digits[f], g.digits[f]>>8);return0== d.charCodeAt(d.length -1)&&(d = d.substring(0, d.length -1)),
    d
}
function setMaxDigits(a){
    maxDigits = a,
    ZERO_ARRAY = new Array(maxDigits);for(var b =0; b < ZERO_ARRAY.length; b++)
        ZERO_ARRAY[b]=0;
    bigZero = new BigInt,
    bigOne = new BigInt,
    bigOne.digits[0]=1}
function BigInt(a){
    this.digits ="boolean"==typeof a &&1== a ? null : ZERO_ARRAY.slice(0),
    this.isNeg =!1}
function biFromDecimal(a){for(var d, e, f, b ="-"== a.charAt(0), c = b ?1:0; c < a.length &&"0"== a.charAt(c);)++c;if(c == a.length)
        d = new BigInt;else{for(e = a.length - c,
        f = e % dpl10,0== f &&(f = dpl10),
        d =biFromNumber(Number(a.substr(c, f))),
        c += f; c < a.length;)
            d =biAdd(biMultiply(d, lr10),biFromNumber(Number(a.substr(c, dpl10)))),
            c += dpl10;
        d.isNeg = b
    }return d
}
function biCopy(a){
    var b = new BigInt(!0);return b.digits = a.digits.slice(0),
    b.isNeg = a.isNeg,
    b
}
function biFromNumber(a){
    var c, b = new BigInt;for(b.isNeg =0> a,
    a = Math.abs(a),
    c =0; a >0;)
        b.digits[c++]= a & maxDigitVal,
        a >>= biRadixBits;return b
}
function reverseStr(a){
    var c, b ="";for(c = a.length -1; c >-1;--c)
        b += a.charAt(c);return b
}
function biToString(a, b){
    var d, e, c = new BigInt;for(c.digits[0]= b,
    d =biDivideModulo(a, c),
    e = hexatrigesimalToChar[d[1].digits[0]];1==biCompare(d[0], bigZero);)
        d =biDivideModulo(d[0], c),
        digit = d[1].digits[0],
        e += hexatrigesimalToChar[d[1].digits[0]];return(a.isNeg ?"-":"")+reverseStr(e)}
function biToDecimal(a){
    var c, d, b = new BigInt;for(b.digits[0]=10,
    c =biDivideModulo(a, b),
    d =String(c[1].digits[0]);1==biCompare(c[0], bigZero);)
        c =biDivideModulo(c[0], b),
        d +=String(c[1].digits[0]);return(a.isNeg ?"-":"")+reverseStr(d)}
function digitToHex(a){
    var b =15, c ="";for(i =0;4> i;++i)
        c += hexToChar[a & b],
        a >>>=4;returnreverseStr(c)}
function biToHex(a){
    var d, b ="";for(biHighIndex(a),
    d =biHighIndex(a); d >-1;--d)
        b +=digitToHex(a.digits[d]);return b
}
function charToHex(a){
    var h, b =48, c = b +9, d =97, e = d +25, f =65, g =90;return h = a >= b && c >= a ? a - b : a >= f && g >= a ?10+ a - f : a >= d && e >= a ?10+ a - d :0}
function hexToDigit(a){
    var d, b =0, c = Math.min(a.length,4);for(d =0; c > d;++d)
        b <<=4,
        b |=charToHex(a.charCodeAt(d));return b
}
function biFromHex(a){
    var d, e, b = new BigInt, c = a.length;for(d = c,
    e =0; d >0; d -=4,++e)
        b.digits[e]=hexToDigit(a.substr(Math.max(d -4,0), Math.min(d,4)));return b
}
function biFromString(a, b){
    var g, h, i, j, c ="-"== a.charAt(0), d = c ?1:0, e = new BigInt, f = new BigInt;for(f.digits[0]=1,
    g = a.length -1; g >= d; g--)
        h = a.charCodeAt(g),
        i =charToHex(h),
        j =biMultiplyDigit(f, i),
        e =biAdd(e, j),
        f =biMultiplyDigit(f, b);return e.isNeg = c,
    e
}
function biDump(a){return(a.isNeg ?"-":"")+ a.digits.join(" ")}
function biAdd(a, b){
    var c, d, e, f;if(a.isNeg != b.isNeg)
        b.isNeg =!b.isNeg,
        c =biSubtract(a, b),
        b.isNeg =!b.isNeg;else{for(c = new BigInt,
        d =0,
        f =0; f < a.digits.length;++f)
            e = a.digits[f]+ b.digits[f]+ d,
            c.digits[f]=65535& e,
            d =Number(e >= biRadix);
        c.isNeg = a.isNeg
    }return c
}
function biSubtract(a, b){
    var c, d, e, f;if(a.isNeg != b.isNeg)
        b.isNeg =!b.isNeg,
        c =biAdd(a, b),
        b.isNeg =!b.isNeg;else{for(c = new BigInt,
        e =0,
        f =0; f < a.digits.length;++f)
            d = a.digits[f]- b.digits[f]+ e,
            c.digits[f]=65535& d,
            c.digits[f]<0&&(c.digits[f]+= biRadix),
            e =0-Number(0> d);if(-1== e){for(e =0,
            f =0; f < a.digits.length;++f)
                d =0- c.digits[f]+ e,
                c.digits[f]=65535& d,
                c.digits[f]<0&&(c.digits[f]+= biRadix),
                e =0-Number(0> d);
            c.isNeg =!a.isNeg
        }else
            c.isNeg = a.isNeg
    }return c
}
function biHighIndex(a){for(var b = a.digits.length -1; b >0&&0== a.digits[b];)--b;return b
}
function biNumBits(a){
    var e, b =biHighIndex(a), c = a.digits[b], d =(b +1)* bitsPerDigit;for(e = d; e > d - bitsPerDigit &&0==(32768& c);--e)
        c <<=1;return e
}
function biMultiply(a, b){
    var d, h, i, k, c = new BigInt, e =biHighIndex(a), f =biHighIndex(b);for(k =0; f >= k;++k){for(d =0,
        i = k,
        j =0; e >= j;++j,++i)
            h = c.digits[i]+ a.digits[j]* b.digits[k]+ d,
            c.digits[i]= h & maxDigitVal,
            d = h >>> biRadixBits;
        c.digits[k + e +1]= d
    }return c.isNeg = a.isNeg != b.isNeg,
    c
}
function biMultiplyDigit(a, b){
    var c, d, e, f;for(result = new BigInt,
    c =biHighIndex(a),
    d =0,
    f =0; c >= f;++f)
        e = result.digits[f]+ a.digits[f]* b + d,
        result.digits[f]= e & maxDigitVal,
        d = e >>> biRadixBits;return result.digits[1+ c]= d,
    result
}
function arrayCopy(a, b, c, d, e){
    var g, h, f = Math.min(b + e, a.length);for(g = b,
    h = d; f > g;++g,++h)
        c[h]= a[g]}
function biShiftLeft(a, b){
    var e, f, g, h, c = Math.floor(b / bitsPerDigit), d = new BigInt;for(arrayCopy(a.digits,0, d.digits, c, d.digits.length - c),
    e = b % bitsPerDigit,
    f = bitsPerDigit - e,
    g = d.digits.length -1,
    h = g -1; g >0;--g,--h)
        d.digits[g]= d.digits[g]<< e & maxDigitVal |(d.digits[h]& highBitMasks[e])>>> f;return d.digits[0]= d.digits[g]<< e & maxDigitVal,
    d.isNeg = a.isNeg,
    d
}
function biShiftRight(a, b){
    var e, f, g, h, c = Math.floor(b / bitsPerDigit), d = new BigInt;for(arrayCopy(a.digits, c, d.digits,0, a.digits.length - c),
    e = b % bitsPerDigit,
    f = bitsPerDigit - e,
    g =0,
    h = g +1; g < d.digits.length -1;++g,++h)
        d.digits[g]= d.digits[g]>>> e |(d.digits[h]& lowBitMasks[e])<< f;return d.digits[d.digits.length -1]>>>= e,
    d.isNeg = a.isNeg,
    d
}
function biMultiplyByRadixPower(a, b){
    var c = new BigInt;returnarrayCopy(a.digits,0, c.digits, b, c.digits.length - b),
    c
}
function biDivideByRadixPower(a, b){
    var c = new BigInt;returnarrayCopy(a.digits, b, c.digits,0, c.digits.length - b),
    c
}
function biModuloByRadixPower(a, b){
    var c = new BigInt;returnarrayCopy(a.digits,0, c.digits,0, b),
    c
}
function biCompare(a, b){if(a.isNeg != b.isNeg)return1-2*Number(a.isNeg);for(var c = a.digits.length -1; c >=0;--c)if(a.digits[c]!= b.digits[c])return a.isNeg ?1-2*Number(a.digits[c]> b.digits[c]):1-2*Number(a.digits[c]< b.digits[c]);return0}
function biDivideModulo(a, b){
    var f, g, h, i, j, k, l, m, n, o, p, q, r, s, c =biNumBits(a), d =biNumBits(b), e = b.isNeg;if(d > c)return a.isNeg ?(f =biCopy(bigOne),
        f.isNeg =!b.isNeg,
        a.isNeg =!1,
        b.isNeg =!1,
        g =biSubtract(b, a),
        a.isNeg =!0,
        b.isNeg = e):(f = new BigInt,
        g =biCopy(a)),
        new Array(f,g);for(f = new BigInt,
    g = a,
    h = Math.ceil(d / bitsPerDigit)-1,
    i =0; b.digits[h]< biHalfRadix;)
        b =biShiftLeft(b,1),++i,++d,
        h = Math.ceil(d / bitsPerDigit)-1;for(g =biShiftLeft(g, i),
    c += i,
    j = Math.ceil(c / bitsPerDigit)-1,
    k =biMultiplyByRadixPower(b, j - h);-1!=biCompare(g, k);)++f.digits[j - h],
        g =biSubtract(g, k);for(l = j; l > h;--l){for(m = l >= g.digits.length ?0: g.digits[l],
        n = l -1>= g.digits.length ?0: g.digits[l -1],
        o = l -2>= g.digits.length ?0: g.digits[l -2],
        p = h >= b.digits.length ?0: b.digits[h],
        q = h -1>= b.digits.length ?0: b.digits[h -1],
        f.digits[l - h -1]= m == p ? maxDigitVal : Math.floor((m * biRadix + n)/ p),
        r = f.digits[l - h -1]*(p * biRadix + q),
        s = m * biRadixSquared +(n * biRadix + o); r > s;)--f.digits[l - h -1],
            r = f.digits[l - h -1]*(p * biRadix | q),
            s = m * biRadix * biRadix +(n * biRadix + o);
        k =biMultiplyByRadixPower(b, l - h -1),
        g =biSubtract(g,biMultiplyDigit(k, f.digits[l - h -1])),
        g.isNeg &&(g =biAdd(g, k),--f.digits[l - h -1])}return g =biShiftRight(g, i),
    f.isNeg = a.isNeg != e,
    a.isNeg &&(f = e ?biAdd(f, bigOne):biSubtract(f, bigOne),
    b =biShiftRight(b, i),
    g =biSubtract(b, g)),0== g.digits[0]&&0==biHighIndex(g)&&(g.isNeg =!1),
    new Array(f,g)}
function biDivide(a, b){returnbiDivideModulo(a, b)[0]}
function biModulo(a, b){returnbiDivideModulo(a, b)[1]}
function biMultiplyMod(a, b, c){returnbiModulo(biMultiply(a, b), c)}
function biPow(a, b){for(var c = bigOne, d = a;;){if(0!=(1& b)&&(c =biMultiply(c, d)),
        b >>=1,0== b)break;
        d =biMultiply(d, d)}return c
}
function biPowMod(a, b, c){for(var d = bigOne, e = a, f = b;;){if(0!=(1& f.digits[0])&&(d =biMultiplyMod(d, e, c)),
        f =biShiftRight(f,1),0== f.digits[0]&&0==biHighIndex(f))break;
        e =biMultiplyMod(e, e, c)}return d
}
function BarrettMu(a){
    this.modulus =biCopy(a),
    this.k =biHighIndex(this.modulus)+1;
    var b = new BigInt;
    b.digits[2* this.k]=1,
    this.mu =biDivide(b, this.modulus),
    this.bkplus1 = new BigInt,
    this.bkplus1.digits[this.k +1]=1,
    this.modulo = BarrettMu_modulo,
    this.multiplyMod = BarrettMu_multiplyMod,
    this.powMod = BarrettMu_powMod
}
function BarrettMu_modulo(a){
    var i, b =biDivideByRadixPower(a, this.k -1), c =biMultiply(b, this.mu), d =biDivideByRadixPower(c, this.k +1), e =biModuloByRadixPower(a, this.k +1), f =biMultiply(d, this.modulus), g =biModuloByRadixPower(f, this.k +1), h =biSubtract(e, g);for(h.isNeg &&(h =biAdd(h, this.bkplus1)),
    i =biCompare(h, this.modulus)>=0; i;)
        h =biSubtract(h, this.modulus),
        i =biCompare(h, this.modulus)>=0;return h
}
function BarrettMu_multiplyMod(a, b){
    var c =biMultiply(a, b);return this.modulo(c)}
function BarrettMu_powMod(a, b){
    var d, e, c = new BigInt;for(c.digits[0]=1,
    d = a,
    e = b;;){if(0!=(1& e.digits[0])&&(c = this.multiplyMod(c, d)),
        e =biShiftRight(e,1),0== e.digits[0]&&0==biHighIndex(e))break;
        d = this.multiplyMod(d, d)}return c
}
var maxDigits, ZERO_ARRAY, bigZero, bigOne, dpl10, lr10, hexatrigesimalToChar, hexToChar, highBitMasks, lowBitMasks, biRadixBase =2, biRadixBits =16, bitsPerDigit = biRadixBits, biRadix =65536, biHalfRadix = biRadix >>>1, biRadixSquared = biRadix * biRadix, maxDigitVal = biRadix -1, maxInteger =9999999999999998;setMaxDigits(20),
dpl10 =15,
lr10 =biFromNumber(1e15),
hexatrigesimalToChar = new Array("0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"),
hexToChar = new Array("0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f"),
highBitMasks = new Array(0,32768,49152,57344,61440,63488,64512,65024,65280,65408,65472,65504,65520,65528,65532,65534,65535),
lowBitMasks = new Array(0,1,3,7,15,31,63,127,255,511,1023,2047,4095,8191,16383,32767,65535);!function(){
    function a(a){
        var d, e, b ="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789", c ="";for(d =0; a > d; d +=1)
            e = Math.random()* b.length,
            e = Math.floor(e),
            c += b.charAt(e);return c
    }
    function b(a, b){
        var c = CryptoJS.enc.Utf8.parse(b), d = CryptoJS.enc.Utf8.parse("0102030405060708"), e = CryptoJS.enc.Utf8.parse(a), f = CryptoJS.AES.encrypt(e, c,{
            iv: d,
            mode: CryptoJS.mode.CBC
        });return f.toString()}
    function c(a, b, c){
        var d, e;returnsetMaxDigits(131),
        d = new RSAKeyPair(b,"",c),
        e =encryptedString(d, a)}
    function d(d, e, f, g){
        var h ={}, i =a(16);return h.encText =b(d, g),
        h.encText =b(h.encText, i),
        h.encSecKey =c(i, e, f),
        h
    }
    function e(a, b, d, e){
        var f ={};return f.encText =c(a + e, b, d),
        f
    }
    window.asrsea = d,
    window.ecnonasr = e
}();

function getData(id){
    let result = window.asrsea(
        JSON.stringify({"ids":[id],"level":"standard","encodeType":"aac","csrf_token":""}),'010001',
        '00e0b509f6259df8642dbc35662901477df22677ec152b5ff68ace615bb7b725152b3ab17a876aea8a5aa76d2e417629ec4ee341f56135fccf695280104e0312ecbda92557c93870114af6c9d05c4f7f0c3685b7a46bee255932575cce10b424d813cfe4875d3e82047b97ddef52741d546b8e289dc6935b3ece0462db0a22b8e7','0CoJUm6Qyw8W8jud');return'params='+encodeURIComponent(result.encText)+'&encSecKey='+result.encSecKey
}

function getParams(keyword){
    let result = window.asrsea(
        JSON.stringify({"hlpretag":"<span class=\"s-fc7\">","hlposttag":"</span>","s":keyword,"type":"1","offset":"0","total":"true","limit":"30","csrf_token":""}),'010001',
        '00e0b509f6259df8642dbc35662901477df22677ec152b5ff68ace615bb7b725152b3ab17a876aea8a5aa76d2e417629ec4ee341f56135fccf695280104e0312ecbda92557c93870114af6c9d05c4f7f0c3685b7a46bee255932575cce10b424d813cfe4875d3e82047b97ddef52741d546b8e289dc6935b3ece0462db0a22b8e7','0CoJUm6Qyw8W8jud');return'params='+encodeURIComponent(result.encText)+'&encSecKey='+result.encSecKey   
}

2、execjs模块调用JS代码

import execjs
with open(file='encode.js', mode='r', encoding='utf-8') as fis:
     js_code = fis.read()  # 读取JS代码文件
js_obj = execjs.compile(js_code)  # 激将JS代码传入
js_obj.call('function','params')  # 调用JS的函数, 参数1:函数名、参数2:该函数所需要的参数

3、更多请关注公众号【程序员 小洲】

五、Pip模块安装

镜像地址

案例使用到的第三方模块以及对应版本

  • requests==2.27.0
  • PyExecJS==1.5.1

pip指定模块安装:pip install 模块名 -i https://pypi.tuna.tsinghua.edu.cn/simple
pip指定requirements.txt文件安装:pip install -i https://pypi.doubanio.com/simple/ -r requirements.txt


注意

本文章中所有内容仅供学习交流,抓包内容、敏感网址、数据接口均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关,若有侵权,请联系我立即删除!

本文章未经许可禁止转载,禁止任何修改后二次传播,擅自使用本文讲解的技术而导致的任何意外,作者均不负责,若有侵权,请在公众号【程序员 小洲】联系作者立即删除!


本文转载自: https://blog.csdn.net/EXIxiaozhou/article/details/128503834
版权归原作者 EXI-小洲 所有, 如有侵权,请联系我们删除。

“Web Spider XHR断点 堆栈跟值 逆向案例(四)”的评论:

还没有评论