混淆JS破解-极验滑动验证

极验滑动验证主要可分为两步:

  • 点击按钮进行验证
  • 拖动滑块完成拼图

这两步分别由一个纯混淆的js文件实现(fullpage.8.5.3.js和slide.7.3.7.js),极验的混淆js版本更新极快,但加密逻辑基本不变,只是改改函数名参数名罢了。本文通过Chrome的js调试功能成功分析出其逻辑,并抠出关键js代码,利用Python的execjs库,结合nodejs环境(PyV8引擎)执行。由于破解过程比较复杂,所以只是讲个大概。

初始化

首先通过register接口获取验证参数challenge和gt,作为后面用到的接口参数。

fullpage

如下图,点击按钮进行验证。需要先后GET请求get.php和ajax.php两个接口。get.php用于生成按钮,ajax.php用于点击按钮。

这两个接口的关键在于做了混淆加密的w参数,加密代码都在fullpage.8.5.3.js中。

首先尝试着ctrl+f搜索接口参数challenge,但在这个混淆js文件中,这些参数名都做了编码处理,因此需要搜索'\x63\x68\x61\x6c\x6c\x65\x6e\x67\x65'。将找到的几处打上断点,然后刷新页面。在F9对象通过prototype属性添加的'\x46'函数,即L函数中断住。

这里的'\x77'就是需要拿到的w参数,然后一步步往上推,会发现这里需要创建F9的实例对象,于是找到F9函数。改写该函数,如下:

function F9(L1, Z1) {
    var z0M = 4;
    var A1 = this,
    V1 = new f9(L1);
    V1[r6Y.e0M(321)] = 12 || 0,
    V1[r6Y.e0M(760)] = true,
    A1[r6Y.r0M(1372)] = new N9(),
    A1[r6Y.e0M(1294)] = V1,
    A1[r6Y.r0M(120)] = L1,
    A1[r6Y.e0M(438)] = new Y9(),
    A1[r6Y.r0M(1202)] = Z1,
    A1[r6Y.e0M(1181)] = V5 && z0M * (z0M + 1) % 2 + 5 ? 3 : 0;
    return A1;
}

然后用new创建该函数的实例对象,并调用其上面提到的L函数,如下:

var s = new F9(data);
return s['L']();

代码中的data是传入F9函数的参数,打断点查看并写死。

改写L函数,使其返回给Python有两个值,F9对象和get.php的w参数(F9对象在ajax.php的破解中会用到)

接下来将其余必需的各个函数都加上即可,可以一次次执行js代码,看缺少哪些函数。

完成之后保存为fullpage1.js,在nodejs下执行,这里注意nodejs环境不支持dom、windows和navigator等浏览器相关操作,所以js代码中涉及到这些的操作和参数要去掉或写死。用PhantomJS可以不考虑这个问题,但其运行速度比nodejs慢太多,用起来不舒服。

拿到w参数,请求get.php接口,得到response。

至于ajax.php的w参数,其破解与get.php类似。同样创建F9的实例对象,只是这里的F9需要增加三个值:

A1[r6Y.e0M(74)] = A1[r6Y.e0M(462)]()
A1[r6Y.e0M(1069)] = new k9()
A1[r6Y.e0M(217)] = new l9()

另外调用的不再是L函数,而是Pe函数('\x50\x65'):

var s = new F9(data);
return s['Pe'](F_object, res);

我们需要给该函数增加两个传递参数:执行fullpage1.js返回的F9对象和请求get.php得到的response,即代码中的F_object、res。因为ajax.php用到的F9对象必须是来自get.php中用的F9对象,且其中的B属性需要添加上response的值。接下来要做的应该不需要多说了,与get.php一样,并保存为fullpage2.js

slide

如果fullpage的混淆js能够成功破解,那么slide的应该不需要费太多心,做法都差不多。同样是两个接口:get.php和ajax.php。get.php用于生成滑动验证码,ajax.php用于拖动滑块。

不过有三点需要注意:

  1. 成功请求get.php之后,需要获取图片(带滑块缺口的验证码背景图和完整的验证码图片),但是这两张图片都用js打乱了像素块,需要还原回去,通过调试js可以找到一个对应关系的字典
  2. 图片还原之后用简单的图像处理方法求出两种图片的像素差,由此得出滑块缺口所在的位置
  3. 在处理ajax.php的过程中需要模拟合适的滑块拖动轨迹,否则很容易报forbidden

具体大家可以自己耐心研究,但破解极验确实需要耗不少时间和精力,此坑慎入。

最后附上程序运行结果图:

0

评论