上次分析了第一个w生成的逻辑现在分析第二个
第二个w点击验证就会触发
这里定位w生成的文件还是fullpage但是位置不一样,还是搜索"w"
n["w"] = t["$_CEAp"]这里w是已经生成好了定位$_CEAp是怎么生成的
i["$_CEAp"] = p["$_HEJ"](c["encrypt"](r, i["$_CCHP"]()))前面的这些方法和第一个w生成的逻辑其实都差不多主要是分析入参r和i["$_CCHP"]()
i["$_CCHP"]()分析
在控制台输出为
这个值其实如果分析了第一个w生成的逻辑后就会发现这个就是te()生成的值这里可以跟进去看一下
"$_CCHP": function (e) { return this["$_EIc"]["aeskey"] && !e || (this["$_EIc"]["aeskey"] = te()), this["$_EIc"]["aeskey"]; }生成第一个w的时候已经赋值给aeskey为te()所以直接走了this["$_EIc"]["aeskey"] && !e这里的逻辑
r参数分析
在上面可以定位到
r = "{" + i["$_CECm"] + "\"captcha_token\":\"" + n(o["toString"]() + n(n["toString"]()) + n(e["toString"]())) + "\",\"tsfq\":\"xovrayel\"}"先分析captcha_token
获取的是js的代码,因为这个代码是替换后的肯定是和原本的不一样,这里直接在浏览器上拿一个新的代码然后找到对应的位置替换就可以
分析i["$_CECm"]
"$_CDJC":function () { var i = this, e = i["$_BJJT"]["$_BIBC"](), t = i["$_BJJT"]["$_BICU"](), n = i["$_BJCe"]["$_BICU"](), r = i["$_BDHn"]["$_BIBC"](), o = i["$_EIc"], s = $_Gx() - rt; i["$_CECm"] = ""; for (var a = [["lang", o["lang"] || "zh-cn"], ["type", "fullpage"], ["tt", function (e, t, n) { if (!t || !n) return e; var r, o = 0, i = e, s = t[0], a = t[2], _ = t[4]; while (r = n["substr"](o, 2)) { o += 2; var c = parseInt(r, 16), l = String["fromCharCode"](c), u = (s * c * c + a * c + _) % e["length"]; i = i["substr"](0, u) + l + i["substr"](u); } return i; }(e, o["c"], o["s"]) || -1], ["light", r || -1], ["s", H(p["$_HDl"](t))], ["h", H(p["$_HDl"](n))], ["hh", H(n)], ["hi", H(i["$_CCFV"])], ["vip_order", i["vip_order"] || -1], ["ct", i["ct"] || -1], ["ep", i["$_CEDb"]() || -1], ["passtime", s || -1], ["rp", H(o["gt"] + o["challenge"] + s)]], _ = 0; _ < a["length"]; _++) i["$_CECm"] += "\"" + a[_][0] + "\":" + de["stringify"](a[_][1]) + ","; var c = $_BFr(); i["$_CEEQ"] = function l() { var t = ["bbOy"]; return function (e) { t["push"](e["toString"]()); var r = ""; !function o(e, t) { function n(e) { var t = 5381, n = e["length"], r = 0; while (n--) t = (t << 5) + t + e["charCodeAt"](r++); return t &= ~(1 << 31); } 100 < new Date()["getTime"]() - t["getTime"]() && (e = "qwe"), r = "{" + i["$_CECm"] + "\"captcha_token\":\"" + n(o["toString"]() + n(n["toString"]()) + n(e["toString"]())) + "\",\"tsfq\":\"xovrayel\"}"; }(t["shift"](), new Date()), i["$_CEAp"] = p["$_HEJ"](c["encrypt"](r, i["$_CCHP"]())); }; }(), i["$_CEEQ"](""); }e是鼠标轨迹因为现在还没有开始过滑块还不需要轨迹暂时忽略
t、n、r固定即可
s是时间戳相减这个其实可以写一个合理的值固定下来,如果实在想折腾一下可以记录下开始执行js的时间然后用当前时间戳减去这个时间
后面可以看到
"lang": "zh-cn", "type": "fullpage",这两个值是固定的
然后是tt
function (e, t, n) { if (!t || !n) return e; var r, o = 0, i = e, s = t[0], a = t[2], _ = t[4]; while (r = n["substr"](o, 2)) { o += 2; var c = parseInt(r, 16), l = String["fromCharCode"](c), u = (s * c * c + a * c + _) % e["length"]; i = i["substr"](0, u) + l + i["substr"](u); } return i; }这个直接把已知的三个值传过去就行t是上一步获取的c,n是上一步回去的s,如果不知道怎么获取的可以看geetest滑块(一)的内容
后面这些就没什么好说的了,补环境补好了就可以,唯一就是rp需要gt和challenge
生成好后再组装上captcha_token和otpj
这样就可以了,到此其实已经可以过点击的模式了但是滑块和点选还需要再过一次,因为我这个测试demo是点击弹出滑块(无感)+滑块的所以相当于要过两次,正常网站一般点击登录后直接就会弹滑块或者点选,之前甚至有些网站会有无感的但是比较少一半都需要人来过,只需要生成两次w就可以了,这个demo的比较全所以要生成三次w
比如像字母站的登录就是生成两次就可以