)
演示地址:aHR0cHM6Ly9kZW1vcy5nZWV0ZXN0LmNvbS9zbGlkZS1mbG9hdC5odG1s先分析数据包流程1、获取challenge和gt2、获取第一个w值3、获取第二个w值4、获取验证图片5、获取第三个w值6、提交代码分析i生成定位r生成定位先分析数据包流程1、获取challenge和gt在register-slide这个接口获取这两个值2、获取第一个w值首先加载fullpage.9.2.0-guwyxh.js获取到w值然后请求get.php获取到c和s的值这两个值用来后面过滑块3、获取第二个w值第二个w值也在fullpage.9.2.0-guwyxh.js中获取到第二个w值后请求ajax.php会返回当前的验证码是什么类型4、获取验证图片请求get.php获取到验证图片这个响应中主要获取c、s、bg、fullbg和一个新的challenge5、获取第三个w值第三个w值由slide生成这个就是滑块滑动后生成的6、提交提交后message返回success代表通过并且会返回一个validate在后续的请求中需要使用这个值提交比如bilibili的登录有一个seccode参数有两个部分第一个部分就是这个值代码分析首先定位到fullpage.9.2.0-guwyxh.js这个js是一个混淆的代码可以用ast解混淆不算是很难解混淆后搜索w可以定位到w生成的位置这里就是第一次生成w的位置直接替换文件打断点就可以这里如果不知道是第几次的可以打印到控制台上然后和数据包里的对比这里不再演示现在需要定位的是i和r是怎么生成的i生成定位在上面可以找到o $_BFr()[encrypt1](de[stringify](t[$_EJN]), t[$_CCHP]()) i p[$_HEJ](o)这里在看o是加密的什么数据t[$_EJN]的值为{ gt: xxxxx, challenge: xxxxxxx, offline: false, new_captcha: true, product: float, width: 300px, https: true, api_server: apiv6.geetest.com, protocol: https://, type: fullpage, static_servers: [ static.geetest.com/, static.geevisit.com/ ], click: /static/js/click.3.1.2.js, beeline: /static/js/beeline.1.0.1.js, voice: /static/js/voice.1.2.6.js, fullpage: /static/js/fullpage.9.2.0-guwyxh.js, slide: /static/js/slide.7.9.3.js, geetest: /static/js/geetest.6.0.9.js, aspect_radio: { slide: 103, click: 128, voice: 128, beeline: 50 }, cc: 11, ww: true, i: -1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1 }这里主要需要改动的只有gt和challenge替换为我们获取到的值就可以r生成定位在上面可以定位到var r t[$_CCGr]()跟踪$_CCGr定位到$_CCGr: function (e) { var t new X()[encrypt](this[$_CCHP](e)); while (!t || 256 ! t[length]) t new X()[encrypt](this[$_CCHP](!0)); return t; }先分析this[$_CCHP](e)$_CCHP: function (e) { return this[$_EIc][aeskey] !e || (this[$_EIc][aeskey] te()), this[$_EIc][aeskey]; }这段代码通过分析可以发现走的是te()te function () { function e() { return (65536 * (1 Math[random]()) | 0)[toString](16)[substring](1); } return function () { return e() e() e() e(); }; }();这里就很明了了就是生成点随机数然后拼接到一起这个生成的随机数需要保存下来后面还会用到这里直接补环境不算是很难最后运行结果可以获取到第一个w的值然后通过get.php接口获取到c和s的值