前言
验证码我没这么搞过,之前搞完易盾点选就没弄过了,今天搞了一下极验4滑块,据说这个比较简单,实验了后也的确比较容易,居然没轨迹检测
分析
首先分析请求
从这里可以看到我们真正需要的只有w(challenge可以忽略不计,直接搜索就出来了,环境也不用就行)
w的加密位置分析
这个不是xhr请求,但是我们可以在发起程序找到堆栈,打上断点
这里可以发现w已经生成就往上跟栈就好了
看到for和switch有没有什么感觉???
不会真的傻乎乎的去跟栈吧,找都找烦,我们可以先跳出这个在看看参数有没有生成
打上断点重新运行代码
还是有,继续往上
往上追,同样方法过控制平坦
w的生成
不讲那么多,慢慢找肯定可以找到这里
找到r的生成位置,可以看出w参数是i
关键位置,解析得
w=m['default'](f['default']['stringify'](e), n)我们需要知道e是什么,n是什么
经过分析差不多这3个有要求,f['default']['stringify']看起来就是用来将键值对转化为字符串,为了稳妥起见,我们采样字符串拼接的方式
我们先不看参数怎么来,先把简单的扣了
n的生成
然后扣e,这个忘了截图懒得弄,反正就这样
function e(){ function aa(){ return (65536 * (1 + Math['random']()) | 0)['toString'](16)['substring'](1) }; return aa()+aa()+aa()+aa() }所有return打上断点,找返回值
解析得
w=d['arrayToHex'](u) + _;u和_需要
_ = r[a][‘asymmetric']['encrypt'](n);u=r[1]['symmetrical']['encrypt'](e, n)
_的生成
r[a][‘asymmetric']['encrypt']把这个扣下来,这个加密函数肯定在这里嘛,这个扣下来很容易,环境都不怎么需要补,
点进去
找外层的函数,还是自执行函数,扣起来多舒服,把T导出
然后js代码这样
myT = new window.T(); var myT = new window.T(); var _ = myT['encrypt'](n) 这样就好了这个n看这个
也就知道和前面那个一样了
u的生成
点进去
这个看起来有点难办,我们可以看到这个函数是外层函数返回的,一般情况就会想把外层函数扣下来,全扣,但是这个u怎么办呢,没办法手动调用,扣外层跟没扣一样,当然也可以扣算法。我们全扣,这种情况解决不了可以找它导出地方,它既然能够调用这个函数肯定已经调用了外层
在外层开头打断点,往上跟
我们发现了什么
return t[$_DBCDZ(1041)] = g[$_DBCDZ(1079)](D),
t[$_DBCDZ(1041)];
这不就是把那个函数导出去了吗,所以我们自己把n函数扣下来就行了
w=d['arrayToHex'](u) + _;这个我们就搞定了,(这个d['arrayToHex']就是复制粘贴的事)
所以就差e参数了
e参数
接上之前讲的
找参数生成位置
往上跟栈
找到userresponse
经过这3步操作,不过这个是this指针,所以不好搞定,另外,我们可以发现this中有pow生成了,我开始以为是pow_msg轨迹,找了我好久都没找到,原来它在还没滑动就生成了,我们不好找就另寻出路,我们可以看到所有键值对的名字都是unicode编码,所以我们搜索pow的unicode编码
\u0070\u006f\u0077
pow_msg=c + h
c = n + $_CAGHS(130) + i + $_CAGIV(130) + s + $_CAGHS(130) + r + $_CAGHS(130) + t + $_CAGHS(130) + e + $_CAGHS(130) + o + $_CAGHS(130)
h = v[$_CAGIV(111)]() 这个h进去就知道和我们之前的n一样随机生成,
p = new m[($_CAGIV(37))][('MD5')]()[$_CAGIV(699)](l) 猜测是md5标准()
这样就搞定这俩,就差
userresponse
不用看这个肯定要有检测鼠标位置函数,先回到这里
进去分析
可以看出这东西不就是返回这东西的x坐标嘛,那这个i应该就是滑动距离
所以全部分析完了,没有轨迹还是比较轻松的搞起来。
有用的话点个关注加赞吧