作者声明:文章仅供学习交流与参考!严禁用于任何商业与非法用途!否则由此产生的一切后果均与作者无关!如有侵权,请联系作者本人进行删除!
第二个W值
目标: aHR0cHM6Ly93d3cuZ2VldGVzdC5jb20vZGVtby9zbGlkZS1mbG9hdC5odG1s
点击按钮验证
接口分析:
ajax.php这个接口就带上了第二个w作为参数以及gt和challenge,它们是从register-slide这个接口返回的
get.php接口,返回了滑块图片信息,以及c和s参数,这两个参数在验证滑块的第三个w需要用到
开始逆向第二个w值,第二个w我们搜索就不行了,它在代码里面不是明文也不是unicode编码的格式,只能断点发包位置,通过跟堆栈的方式找到
var n = {};
大概这个位置,就是我们w参数生成的位置了,n[$_CFCIM(852)] = t[$_CFCJe(1132)]
我们断点var n = {};
这个位置,然后控制台打印t[$_CFCJe(1132)]
发现已经出值了,所有生成我们的w参数一定还要在前面所以在当前方法的第一行打上断点单步调试,找到w生成的位置
发现在经过t[$_CFCIM(1144)]();
这个函数后,我们的w值 t[$_CFCJe(1132)]
就生成了,所以我们跟进去看w是如何生成的
发现在i[$_CFFJQ(1132)] = p[$_CFFJQ(1138)](c[$_CFFJQ(40)](r, i[$_CFFIu(1120)]()));
这行i[$_CFFJQ(1132)]
被赋值了,关键代码是这里:
i[$_CFFJQ(1132)] = p[$_CFFJQ(1138)](c[$_CFFJQ(40)](r, i[$_CFFIu(1120)]()));
在调用= p[$_CFFJQ(1138)]
方法后,就会得到w值,先看看参数
发现c这个对象下面,有加密方法,
第一个参数,r是一个对象
{
"lang": "zh-cn",
"type": "fullpage",
"tt": "M?d8Pjp8Pjp8Pjp8Pjp8Pjp8PjB)9U*S(e5,(q(e(5be,5e5,bbe55bn((5ne(e,(,5,((8e(b(-ee,55b8b((091j/)3-(@MM-N3*M?-U/)ME3)(?-U/)3,M?-PN1-U-)9U7)3)M@3,(?MM-U?)?)(?,N(-d/)(U-)1E-*-U-)3)(?ME.)M91/E---j-)M95N9d5PM91j-*M9-U-)?)(?-U5)3)M?7,M?-N3-(?ME-N3*(?-d-NM93)(E-*/)(N1E-*9A.f4gM91j-*M99E-*.1-)7)(P3)M?MU-N3)(j/*ME-f5@J2INM9.)M4l(((((,((b(((b(,(q(e@5,((bnq(e8b(e(555e,,(5b((,(n(qb8e,e5(bbb5(8IJJIZfdiZh9XH5-.ZEZ/b9B/NUC5ORb9?S646I--Ajb9@*)n--6/b965/,.,b91n-*5Pb92D1d8*MN4)(n-*0)(Y-)b91B8)(p@b9-Y-)bE4)(c5N4)M@b9-N15/)1I-*-n1)4,(?bb-Mbb-db9-P-Y/)4)(0A6?-c1?b95S0*MY-)5?0)N5-*b90)(N25-)b98*M?cM-)M9,)(9bM-5/)(?,)(9/)(),)(9-5/)(M-5?)ME)qqqqqqqqqqqqqqqqqqqq(9G)SFNkTM(/E()SELpEE/0jFNj/FSFSFSFNSEE///()SFmUMA,(R(M295*-.(Q5*)91(A,(R(b5-)(9Q2)(M999*9Q)*A,(N(b291(2b5,(b-,(b1)(M191*(b1(1,(b(N(M5.(91*(bA(5*(*-*(b5(1,)9(b1(50(,,((bI(5.(,)b(bE(5/(,)9(c((5J(*/*(NNb1E5*)E1*(NMM1,(M(NMb1*(M5*(,(M(b5(5*((((((((8qM",
"light": "DIV_0",
"s": "c7c3e21112fe4f741921cb3e4ff9f7cb",
"h": "321f9af1e098233dbd03f250fd2b5e21",
"hh": "39bd9cad9e425c3a8f51610fd506e3b3",
"hi": "09eb21b3ae9542a9bc1e8b63b3d9a467",
"vip_order": -1,
"ct": -1,
"ep": {
"v": "9.1.9-dbjg5z",
"te": false,
"me": true,
"ven": "Google Inc.",
"ren": "ANGLE (NVIDIA GeForce GTX 1650#0x1700ddb7cd8f5644# Direct3D11 vs_5_0 ps_5_0)",
"fp": [
"move",
1821,
221,
1725339552126,
"pointermove"
],
"lp": [
"up",
1022,
309,
1725339552763,
"pointerup"
],
"em": {
"ph": 0,
"cp": 0,
"ek": "11",
"wd": 0,
"nt": 0,
"si": 0,
"sc": 0
},
"tm": {
"a": 1725339547052,
"b": 1725339547078,
"c": 1725339547078,
"d": 0,
"e": 0,
"f": 1725339547054,
"g": 1725339547054,
"h": 1725339547054,
"i": 1725339547054,
"j": 1725339547054,
"k": 0,
"l": 1725339547060,
"m": 1725339547073,
"n": 1725339547075,
"o": 1725339547080,
"p": 1725339547150,
"q": 1725339547150,
"r": 1725339547152,
"s": 1725339547158,
"t": 1725339547158,
"u": 1725339547158
},
"dnf": "dnf",
"by": 0
},
"passtime": 109030,
"rp": "dd5f9924b2303ca49b5887b10e8abfc9",
"captcha_token": "2091149465",
"du6o": "eyjf7nne"
}
第二个参数是一个随机字符串可以写死
r值有5个参数需要通过方法计算得出来:tt
,s
,h
,hh
,hi
,rp
好了,现在开始分析r值
r = $_CFGDl(700) + i[$_CFGDl(1181)] + $_CFGDl(1142) + n(o[$_CFGEr(56)]() + n(n[$_CFGDl(56)]()) + n(e[$_CFGDl(56)]())) + $_CFGEr(1197);
i[$_CFGDl(1181)]
保存了这个r对象部分的参数
我们去找来源,找到是来自当前方法前面一部分,断点过去
把这段代码格式化一下
for (var a = [[$_CFEEZ(226), o[$_CFEDW(226)] || $_CFEDW(230)], //a[0][0],a[0][1]
[$_CFEDW(310), $_CFEEZ(1123)],//a[1][0],a[1][1]
[$_CFEDW(1143), //a[2][0],
function(e, t, n) {
var $_CFEIO = rvhWY.$_CI
, $_CFEHs = ['$_CFFBQ'].concat($_CFEIO)
, $_CFEJf = $_CFEHs[1];
$_CFEHs.shift();
var $_CFFAx = $_CFEHs[0];
if (!t || !n)
return e;
var r, o = 0, i = e, s = t[0], a = t[2], _ = t[4];
while (r = n[$_CFEIO(285)](o, 2)) {
o += 2;
var c = parseInt(r, 16)
, l = String[$_CFEJf(415)](c)
, u = (s * c * c + a * c + _) % e[$_CFEIO(96)];
i = i[$_CFEJf(285)](0, u) + l + i[$_CFEIO(285)](u);
}
return i;
}(e, o[$_CFEDW(816)], o[$_CFEEZ(520)]) || -1], //a[2][1]
[$_CFEEZ(1177), r || -1], //a[3][0],a[3][1]
[$_CFEEZ(520), H(p[$_CFEEZ(978)](t))],//a[4][0],a[4][1]
[$_CFEEZ(1166), H(p[$_CFEEZ(978)](n))],//a[5][0],a[5][1]
[$_CFEEZ(1134), H(n)], //a[6][0],a[6][1]
[$_CFEEZ(1107), H(i[$_CFEDW(1109)])], //a[7][0],a[7][1]
[$_CFEEZ(1126), i[$_CFEDW(1126)] || -1],//a[8][0],a[8][1]
[$_CFEDW(1135), i[$_CFEEZ(1135)] || -1],//a[9][0],a[9][1]
[$_CFEDW(1184), i[$_CFEEZ(1112)]() || -1], //a[10][0],a[10][1]
[$_CFEDW(1125), s || -1], //a[12][0],a[12][1]
[$_CFEEZ(1196), H(o[$_CFEDW(354)] + o[$_CFEEZ(355)] + s)]],//a[13][0],a[13][1]
_ = 0; _ < a[$_CFEDW(96)]; _++)
i[$_CFEDW(1181)] += "'" + a[_][0] + ":" + JSON['Stringify'](a[_][1]) +"'";//循环的这段代码
可以发现 a[_][0]
是key,a[_][1]
是value
-
找tt生成位置
a[2][1]
他是调用了一个方法得到的结果,这个方法有三个参数e, o[$_CFEDW(816)], o[$_CFEEZ(520)]
第一个参数
e
固定第二个参数
o[$_CFEDW(816)]
是c值第三个参数
o[$_CFEEZ(520)]
是s值 -
s位置是
a[4][1]
,是H(p[$_CFEEZ(978)](t))
直接扣即可 -
h位置是
a[5][1]
,是H(p[$_CFEEZ(978)](n))
-
hh位置是
a[6][1]
,是H(n)
-
hi位置是
a[7][1]
,是H(i[$_CFEDW(1109)])
-
rp位置是
a[12][1]
,是H(o[$_CFEDW(354)] + o[$_CFEEZ(355)] + s)
这里分析这三个参数发现
o[$_CFEDW(354)]
是gt,o[$_CFEEZ(355)]
是challenge, s是passtime可以跟对象里面的passtime要保持一致最后分析w的加密
i[$_CFFJQ(1132)] = p[$_CFFJQ(1138)](c[$_CFFJQ(40)](r, i[$_CFFIu(1120)]())); //w = p[$_CFFJQ(1138)](c["encrypt"](r, 随机字符串固定即可);
最后分析w的加密
i[$_CFFJQ(1132)] = p[$_CFFJQ(1138)](c[$_CFFJQ(40)](r, i[$_CFFIu(1120)]())); //w = p[$_CFFJQ(1138)](c["encrypt"](r, 随机字符串固定即可);