【验证码逆向专栏】某验证四代滑块验证码逆向分析

 2024-02-25 03:03:45  阅读 0

反向目标通信流程

python解锁触发式滑块验证码_滑动验证码代码_滑动验证码破解python

验证码流程分析

进入网页后,打开开发者工具抓包,点击滑动拼图验证,在点击按钮开始验证之前,捕获到一个名为load?=xxx的包。 查询包含一些参数

响应预览返回的关键内容如下。 与第三代相比,基础镜像没有进行混淆:

点击按钮开始验证,会弹出滑块验证码。 滑动滑块并捕获数据包到 ?=xxx。 查询还包含一些参数:

滑动验证码代码_滑动验证码破解python_python解锁触发式滑块验证码

响应预览返回的内容如下。 如果值为fail,则表示验证失败。 如果验证通过,则后续业务请求通过后会携带以下参数:

逆向分析参数

全局搜索,在gt4.js文件中跟进:

进入后在第307行打断点,刷新页面时就会中断。 此时参数的值已经生成,下一行定义参数:

滑动验证码代码_滑动验证码破解python_python解锁触发式滑块验证码

顺着堆栈向上一直到该值,即--demo.js文件,你会发现它是一个固定值。 事实上,这个值对于每个网站来说都是不同的。 由管理员通过应用后端获取:

滑动验证码代码_python解锁触发式滑块验证码_滑动验证码破解python

范围

前面提到,在参数的下一行定义参数,并在gt4.js文件的第309行设置断点:

滑动验证码代码_python解锁触发式滑块验证码_滑动验证码破解python

可以看到,参数值是由uuid函数生成的,可以扣除。

w 参数

从?=xxx接口的堆栈开始跟踪堆栈:

python解锁触发式滑块验证码_滑动验证码代码_滑动验证码破解python

设置断点并滑动滑块后,沿着堆栈向上移动到 s。 如果你对第三代滑块做过一些实验,第6249行有一个很熟悉的东西,“\u0077”:r,“\u0077”是字母w的值,r是w参数的值:

r参数定义在第6237行。e也是与第三代类似的参数。 r是对i参数和e参数加密转换为字符串得到的:

沿着堆栈向上查找 e 参数各部分定义的位置。 跟随它到$_BHIH。 _先生生成四个键值对:

和track是我们熟悉的滑动时间和轨迹,是识别的间隙距离,定义在第19593行,a是参数的值,t[$(1909)]是固定值1.66665:

a / t[$_GDFCG(1909)] + 2

然后$_BCFj后面的第6201行定义了e,下面几行定义了e中的,,,:

同一个网站有一个固定值,由负载响应返回。 控制台打印结果:

滑动验证码破解python_滑动验证码代码_python解锁触发式滑块验证码

显然它是由几个部分组成的。 加密后,后续堆栈到init,分别在第5837行和第5838行定义。 它们是d字典的键,根据键名获取值:

d 定义在第 5835 行。如果你恢复这部分就很明显了:

var c = t["toDataURL"]()["replace"]("data:image/png;base64,", "")
    , _ = new w["default"]["MD5"]()["hex"](c);
a["options"]["deviceId"] = _;
var h = a["options"]
    , l = h["powDetail"]
    , p = h["lotNumber"]
    , f = h["captchaId"]
    , d = v["default"](p, f, l["hashfunc"], l["version"], l["bits"], l["datetime"], "")

紧接着 v[""],该函数在第 6945 行定义,并在第 6978 行设置断点:

python解锁触发式滑块验证码_滑动验证码代码_滑动验证码破解python

从 _ + h 得到,_ 定义在第 6960 行:

_ = i + "|" + r + "|" + n + "|" + s + "|" + t + "|" + e + "|" + o + "|";

h定义在第6269行,后面跟着一个16位的随机数串,即p,经过MD5加密后得到:

滑动验证码代码_python解锁触发式滑块验证码_滑动验证码破解python

至此,这四者的分析已经完成,还缺少以下部分:

em等固定值不会被分析。 注意kqg5:“”。 该参数值与第三代滑块相同。 每隔几个小时就会改变一次。 跟踪堆栈一直到$_BCFj,并在第6207行设置断点。这里e中的值还没有生成:

滑动验证码代码_python解锁触发式滑块验证码_滑动验证码破解python

下一行断点,下一步断点,即n[$(791)](e);之后执行后,生成了这个参数值,证明是n[$(791)]方法生成的。 跟进:

python解锁触发式滑块验证码_滑动验证码代码_滑动验证码破解python

跳转到5766行,在5779行设置断点,此时n中还没有生成这个参数:

滑动验证码代码_滑动验证码破解python_python解锁触发式滑块验证码

执行_gct(n)后,生成:

滑动验证码破解python_python解锁触发式滑块验证码_滑动验证码代码

可以看到它的生成位置是在_gct方法中。 跟着它走之后,你会看到gct4.js文件,它与第三代有很大不同:

该值可以导出。 至此,e已经分析完毕。 然后回到第6238行,跟进加密函数d[$(84)],其定义在第11669行, d[$(177)](c) + u 即r参数的值, c是一个大数组,而u显然是加密的,所以r参数的值就是加密数组c加u:

滑动验证码代码_滑动验证码破解python_python解锁触发式滑块验证码

首先跟进u,定义在第11705行,反混淆后如下:

u = new l["default"]()["encrypt"](i);

所以u是对i加密后得到的,i的定义在第11702行:

i = (0,d[$_DIEIq(103)])()

跟进第 852 行定义的 d[$(103)],这是另一个熟悉的 16 位随机数:

滑动验证码代码_python解锁触发式滑块验证码_滑动验证码破解python

i是一个随机数,跟进加密函数l[($(84))],在第12725行,在第12741行下断点,可以看到这是一个RSA加密,直接扣代码或者直接导入图书馆 :

滑动验证码代码_滑动验证码破解python_python解锁触发式滑块验证码

回到c参数,c参数的值是一个大数组,定义在第11705行,反混淆后的内容如下:

var c = s[a]["symmetrical"]["encrypt"](e, i);

e之前已经分析过,i是随机数,两个参数都分析过了。 跟进加密方法。 在第12174行,在第12186行设置断点。控制台打印出令人困惑的部分。 这是非常熟悉的。 这里是AES加密,iv是初始向量,加密方式是CBC。 如果对各种加密算法不熟悉,可以阅读K哥的文章【爬虫知识】爬虫常用加解密算法:

python解锁触发式滑块验证码_滑动验证码代码_滑动验证码破解python

c参数最终由d[$(177)]函数加密。 后续在547行定义了,直接扣除,改一下:

python解锁触发式滑块验证码_滑动验证码代码_滑动验证码破解python

结果验证

标签: 加密 参数 跟进

如本站内容信息有侵犯到您的权益请联系我们删除,谢谢!!


Copyright © 2020 All Rights Reserved 京ICP5741267-1号 统计代码