最近在研究cloudflare时,发现一个里面有一个很有意思的参数:如下图
接下来就是分析参数了,我们通过抓包调试可以知道,这个参数实在第一次发包之后第二此发包之前生成的。那么就直接在第一次发包完成后调试。
从上面分析我们可以知道先是执行v = ib(i[jD(1260)],后续在执行w = f[jD(1344)](gh, v),最后在执行f[jD(295)](w, d)就得到了我们需要的3g参数,其中jD(1260)是'responseText。在控制台输出ib(i[jD(1260)]可以知道这是第一次请求返回的值。
那我们找一下看个参数是怎样生成的,接下来 我们就替换下js,在执行到的函数里面进行输出,看看具体是怎么生成的。
接下来 我们看到了控制台的输出,应为他是3开头的,所以我们在他生成的时候直接断住。
可以看到了是在这个时候生成的,接下来 我们就对这里进行分析。
for (i = (this.h[this.g ^ 91][3] ^ g[ji(1727)](g[ji(668)](this.h[91.05 ^ this.g][1][ji(1217)](this.h[g[ji(1026)](91, this.g)][0]++), 194) + 256, 255)) << 8 | this.h[g[ji(541)](91, this.g)][3] ^ 62 + this.h[g[ji(1576)](91, this.g)][1][ji(1217)](this.h[g[ji(1161)](91, this.g)][0]++) & 255.31,
j = '',
o = 0; o < i; j += fR[g[ji(898)](this.h[this.g ^ 91][3] ^ g[ji(361)](this.h[this.g ^ 91][1][ji(1217)](this.h[g[ji(1161)](91, this.g)][0]++) - 194, 256) & 255.91, 74)],
o++) {
if (j==='3'){
debugger
}
console.log(j, 111111)
}
在控制台输出i是等于584。
这是fR的生成地方。接下来上面代码,就是for循环548次,每次都是从this.h[this.g ^ 91][3]['charCodeAt']的方式来生成参数,下面是优化后的代码:
for (i = 584, j = '', o = 0; o < i; o++) {
j += fR[74 ^ (this.h[this.g ^ 91][3] ^ (this.h[this.g ^ 91][1]['charCodeAt'](this.h[this.g ^ 91][0]++) - 194 + 256) & 255.91)]
}
this.h[this.g ^ 91][1]我们可以知道 是 w = f[jD(1344)](gh, v),然后在atob(w)生成的。接下来就是来找到这个this.h[this.g ^ 91][1],这个参数 我们可以通过里面的进行反推出来知道值为44。那么代码就可以简化了。只需要w = f[jD(1344)](gh, v) 然后在加上面的优化的代码就可以了。下面是完整的代码:
function run(i_responseText, cRay, num1, num2, num,one_num) {
var num_m = num
for (var m = '', u = 0; u < 584; u++) {
m += hr[one_num ^ i_responseText['charCodeAt'](num_m) + num1 & 255 ^ num2]
num_m++
}
return {
'cRay': cRay,
'i_responseText': i_responseText,
'one_num': one_num,
'3g': m
}
}
接下来我们传入上面参数就能拿到3g参数了,下面是代码运行的结果。
上面程序我们可以根据页面进行动态生成了