JS逆向|某验三代一键通过模式(2023-3-6)
前言该文章为学习使用严禁用于商业用途和非法用途否则由此产生的一切后果均与作者无关如有侵权请私信联系作者删除~需求网址9779f3db29102216253fa52d7e56074b步骤通过抓包其实分析到完成整个验证需要四次请求1、请求demo/gt/register-fullpage请求参数是一个时间戳返回challenge和gt2、请求get.php请求参数是challenge和gt和第一次w返回一个列表c和字符串s3、请求ajax.php这个接口是验证接口请求参数是challenge和gt和第二次w返回validate4、请求gt/validate-fullpage这个是提交接口请求参数是validate和challenge返回登录成功信息因此我们只要还原2次w的生成过程即可。目前js版本号为fullpage.9.1.3.js先看结果正文第一次W值JS是对于变量名做了Unicode混淆的w对应的Unicode编码是\u0077。所以直接搜\u0077就能对位到生成位置。在7945行i和r都能在上方找到r值r t$_CFAAK(1392)进入方法内部实际上t就是r的值还原一下e参数实际上不用传vartnewX()[encrypt](this[$_CCGQ)]())// 拆分一下this[$_CCGQ)]()// 这里是生成16位的随机数写死就可以了newX()[encrypt]()// 用导出的方法实现关于16位的随机数建议写死就好了接下来有好几处需要用到必须是一样的否则会报错。搜X 可以定位2046行把代码全扣下来导出方法如下后面的一些加密算法基本上是用这种方式导出的i值o$_BEZ()[encrypt1](ge[$_CFAAK(330)](t[$_CFAAK(275)]),t[$_CFAAK(1381)]())im[$_CFAAK(1343)](o)i的生成需要o所以先还原oge[$_CFAAK(330)](t[$_CFAAK(275)])// 是以下的一段字符串这里只需要把上一个接口获取到的gt和challenge写进去就可以了其它的没有进行校验。t[$_CFAAK(1381)]()// 是上文提到的随机数。i值的话就把m这个对象导出来调用’$_EJv’这个方法就可以了第一次w的值就出来了。w i r第二次W值第二次w的值加密位置是不一样的可以通过跟栈去跟到。在8236行i[$_CGCFE(1466)]就是w的值。还原一下r{i[$_CGDAc(1469)]captcha_token:1080767038};// captcha_token我这里是写死的不过js版本如果更新的话估计这个也会变var_$_BEZ();i[$_CGCFE(1466)]m[$_EJv](_[encrypt](r,i[$_CGCFE(1381]()));// i[$_CGCFE(1381]() 是16位随机数// 这里需要把_这个对象导出 _ $_BEZ()实际上是把$_BEZ这个方法导出。i[$_CGDAc(1469)] 是一个很大的字典转为的字符串这里面的某些参数我们需要写活的。它的生成位置在8174行a参数。a是一个很大的列表。这里其实我们只要看每个参数的值是如何生成的然后模拟她生成其中里面的tt、h、hh、hi、fp、lp、em、passtime、rp这些参数我是写活了。以下就是这些参数的写活方式tt由一个方法生成这个方法可以直接扣下来如下。传了3个参数第一个参数与轨迹相关这个可以写死的。第二第三参数是上一个接口返回的c和stt_function(e,t,n){if(!t||!n)returne;varr,o0,ie,at[0],st[2],ct[4];while(rn[substr](o,2)){o2;varuparseInt(r,16),lString[fromCharCode](u),_(a*u*us*uc)%e[length];ii[substr](0,_)li[substr](_);}returni;}(M*d8PjAA3(2N45((((BA((5:,GJTK))hMMJUG0GBK7HO5I.-IVkhRTG1/0i_,QM)d-BLq((,,80WY:ML1:MAb9q)*Y-1b9L))P9P(?/)(),*M9b9/*M)qqM)O((8bq8bn?ZHjM-U3)M93)(?*)(E-(M9-13)ME7)MP/)(U-(I(,c,s)hh是由n参数经过了几个加密方法这几个加密方法之前有导出过大家测试一下就知道了。然后外层是一个md5加密而成的。n参数里面有一个时间戳需要写活一下。hhhh是把上面的n参数进行了md5加密hihi是以下参数通过md5加密而成也是有个时间戳写活就可以了fp、lp这两个参数也是把时间戳写活em这个的话实际上是window.profermance.timing貌似写死也可以简单模拟一下tm_{a:newDate().getTime(),b:newDate().getTime(),c:newDate().getTime(),d:0,e:0,f:newDate().getTime(),g:newDate().getTime(),h:newDate().getTime(),i:newDate().getTime(),j:newDate().getTime(),k:newDate().getTime(),l:newDate().getTime(),m:newDate().getTime(),n:newDate().getTime(),o:newDate().getTime(),p:newDate().getTime(),q:newDate().getTime(),r:newDate().getTime(),s:newDate().getTime(),t:newDate().getTime(),u:newDate().getTime()}passtime这里我是把lp和fp两个时间戳相减得出。不过js里貌似不是这样做的。反正这样也能过就没管了rprp是gtchallengepasstime的值然后通过md5加密————————————————————————到此第二次w的值就可以通过以上所说去生成出来了。接下来的流程就很简单了~~~~~最后欢迎联系作者交流更多