声明
此次案例只为学习交流使用,抓包内容、敏感网址、数据接口均已做脱敏处理,切勿用于其他非法用途;
文章目录
前言
目标网站地址: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模块安装
镜像地址
- 清华:https://pypi.tuna.tsinghua.edu.cn/simple
- 阿里云:http://mirrors.aliyun.com/pypi/simple/
- 中国科技大学 https://pypi.mirrors.ustc.edu.cn/simple/
- 华中理工大学:http://pypi.hustunique.com/
- 山东理工大学:http://pypi.sdutlinux.org/
- 豆瓣:http://pypi.douban.com/simple/
案例使用到的第三方模块以及对应版本
- 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
注意
本文章中所有内容仅供学习交流,抓包内容、敏感网址、数据接口均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关,若有侵权,请联系我立即删除!
本文章未经许可禁止转载,禁止任何修改后二次传播,擅自使用本文讲解的技术而导致的任何意外,作者均不负责,若有侵权,请在公众号【程序员 小洲】联系作者立即删除!
版权归原作者 EXI-小洲 所有, 如有侵权,请联系我们删除。