js进阶-代码控制流平坦化-某滑块ua加密参数分析

只说下思路吧,毕竟把加密代码公开对人家网站不好。如有权益问题请私信我,我立即删除。

 

2020-06-06更新:

123版本没看,不过最近更新到124版本了,直接把122版本的头部信息带进去,可以直接过124版本,检测过来检测过去也就检测那点东西。所以对于更新频繁来说根本不是事情,写一次头部信息一劳永逸(除非官网把核心检测逻辑改了),还是值得从头到尾过一遍的。不过从122版本开始代码都是三目运算符+顺序表达式(逗号表达式)了,这样做不但提高了代码运行效率,对于反爬来说是无法打断点调试(估计某数下个版本也会朝这个方向发展吧,大些公司的反爬js越来越多是:字符串混淆+三目+逗号表达式了,难搞(*^_^*)哦),不过攻防总有应对办法,那就是AST解析,把三目转if-else,把逗号表达式转成分号结尾的。题主AST解析用的库是js的 require('@babel/core') 和 require('babel-types'),相关知识大家自行搜索。下图是FFF开头的一个系列

js进阶-代码控制流平坦化-某滑块ua加密参数分析_第1张图片

 

 

 

2019-12-08:

目的是让大家多学习js知识,了解国内最优秀的反爬技术,提升自己实力,抵御恶意爬虫,维护网络安全。

     楼主是硬撸的,听说可以ast解析,但技术菜不会。。。时间总共花2周,但楼主还要上班,算了下差不多花了1周空闲时间才分析出来,刚毕业的楼主还是比较清闲,老大安排的事情比较少,时间少的同学建议浏览器自动化工具吧。。。
     先说下楼主掉坑的地方,大家在分析的时候可以注意下:

     1. 修改他的js代码,就会验证不通过,原因是因为检测了自身代码有没有被更改。2天爬上坑,主要关键位置不好找,找位置找了1天+半天。。。

      2. 正则找关键字符串并解析,然后模拟其特征。又是2天才爬上坑。

      3. 传轨迹给e函数时,会检测是哪个函数调用了。3天才爬上坑,原因是app_key是FFFF...开头的,应该是外厂调用他的验证码服务,这个好过,也没检测这个问题。但是它自己的系列,如某bao就死活过不去。开始以为是和um那文件是关联的,花了1天时间也没找到有什么关联。。。

 

看的是滑块那部分,验证成功会返回code:0

js进阶-代码控制流平坦化-某滑块ua加密参数分析_第2张图片

和某数比起来,某数的难度是:动态返回,变量动态加载,变量名混淆,但是变成静态后是很容易根据callstack上下文调试的,是从上到下顺序执行的。而某宝是根据一个vs参数来控制执行步骤的,在由ls,vs, fs,gs,Cs,ws一层层选择case下的语句。
                  , gs = 31 & fs
                  , Cs = fs >> 5
                  , ws

js进阶-代码控制流平坦化-某滑块ua加密参数分析_第3张图片

这不能根据callstack往上跟踪调试,如这里定位到document.body, 但根据callstack的上级是e主函数。

 

js进阶-代码控制流平坦化-某滑块ua加密参数分析_第4张图片

 

这2个前端反爬应该是国内最优秀的了,下面缕一缕它的反爬逻辑,好好学习学习。

 

修改的它的原js代码,楼主在此处统计了下,从刷新到滑动验证完成,vs出现了上万次,所以一步步跳很不现实。

js进阶-代码控制流平坦化-某滑块ua加密参数分析_第5张图片

那么就把它的整个js拿出来调试吧,不一步步跟进了,让他运行,看报错信息,缺什么补什么。这里会涉及到try,catch的问题,也就是说直接运行那个js文件是不报错的,记得是有10个吧,所以这里需要检测一遍正常运行的流程会走哪些catch里的内容。

js进阶-代码控制流平坦化-某滑块ua加密参数分析_第6张图片

最终有3个catch被保留了下来,正常流程会走这3个,所以不要删除,其他catch全部删除,找出报错信息进行模拟。

 

不过在你修改它的主要函数e后,滑块就会验证不通过,这里是因为他会检测自身代码有没有被更改过,这里就需要找到检测的地方,然后把它“骗”过去。这提示下,大家Google:js function to string,慢慢找会有答案的。

过了它的代码检测,就可以任意修改它的js代码了

 

模拟它的浏览器特征也是个痛苦的过程,因为它很多采用的是下面这种方式,你没模拟出来也不报错,继续往下走,这个到现在也没想出什么好的解决办法。我开始是结合下面那些字符串拼接和反转,把涉及到的浏览器的特征值列了一遍,基本把它列的浏览器参数补全,node就可以跑通了。

它的参数大多数是字符串拼接和拼接+反转来的,自己去看分析吧。。。:

js进阶-代码控制流平坦化-某滑块ua加密参数分析_第7张图片

 

浏览器的特征模拟完了就是滑动轨迹了,这里在浏览器滑了一遍,然后把轨迹复制到代码里的,因为主要是想学习它的代码混淆,也不用来搞事情,为了简单就直接复制了。。。

下面是某网站的的注册用了这滑块,复制的轨迹可以顺利通过,参数长度在800左右。但是在过某宝的滑块时过不去,看了下正常参数长度大于1000,我的代码生成长度只有800左右。。。看了一天也没找到原因,以后有空闲时间在看下到底是什么原因,多多学习。

补充:后来看了下,参数长度短是因为每次传入轨迹参数的间隔过短,每传一次轨迹,sleep 0.1秒,参数就边长了,不过短的也可以验证通过,就没看它的js内部是怎么做的。

 

-----------------------------------------

断断续续花了4天时间左右,看出问题了,原因是它的js在某处检测了是否调用了外部方法,到这步的同学可以看看这问题。我外部写了个轨迹函数传进去,结果被检测到了。。。把这关键地方改了就行,其全系都能过。位置在哪想看的自己去找吧,我也只是把踩过的坑说下。哎,花了4天时间,最终改了5个字符就好了,这个坑大家多注意下

-------------------------------------------

最近更新到122了,看了下只要是switch case改成了三目运算形式,使调试难度加大,不过没多大影响,因为整体加密上还是同一套,之前模拟的浏览器特征直接拿过来用。122版本好像没检测自身代码有没有被更改,轨迹有没有调用外部函数。目前这2处楼主没看,也能验证通过,等之后验证失败了在细看。

 

js进阶-代码控制流平坦化-某滑块ua加密参数分析_第8张图片

 

 

 

 

你可能感兴趣的:(js进阶-代码控制流平坦化-某滑块ua加密参数分析)