反向目标通信流程
验证码流程分析
进入网页后,打开开发者工具抓包,点击滑动拼图验证,在点击按钮开始验证之前,捕获到一个名为load?=xxx的包。 查询包含一些参数:
响应预览返回的关键内容如下。 与第三代相比,基础镜像没有进行混淆:
点击按钮开始验证,会弹出滑块验证码。 滑动滑块并捕获数据包到 ?=xxx。 查询还包含一些参数:
响应预览返回的内容如下。 如果值为fail,则表示验证失败。 如果验证通过,则后续业务请求通过后会携带以下参数:
逆向分析参数
全局搜索,在gt4.js文件中跟进:
进入后在第307行打断点,刷新页面时就会中断。 此时参数的值已经生成,下一行定义参数:
顺着堆栈向上一直到该值,即--demo.js文件,你会发现它是一个固定值。 事实上,这个值对于每个网站来说都是不同的。 由管理员通过应用后端获取:
范围
前面提到,在参数的下一行定义参数,并在gt4.js文件的第309行设置断点:
可以看到,参数值是由uuid函数生成的,可以扣除。
w 参数
从?=xxx接口的堆栈开始跟踪堆栈:
设置断点并滑动滑块后,沿着堆栈向上移动到 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中的,,,:
同一个网站有一个固定值,由负载响应返回。 控制台打印结果:
显然它是由几个部分组成的。 加密后,后续堆栈到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 行设置断点:
从 _ + h 得到,_ 定义在第 6960 行:
_ = i + "|" + r + "|" + n + "|" + s + "|" + t + "|" + e + "|" + o + "|";
h定义在第6269行,后面跟着一个16位的随机数串,即p,经过MD5加密后得到:
至此,这四者的分析已经完成,还缺少以下部分:
em等固定值不会被分析。 注意kqg5:“”。 该参数值与第三代滑块相同。 每隔几个小时就会改变一次。 跟踪堆栈一直到$_BCFj,并在第6207行设置断点。这里e中的值还没有生成:
下一行断点,下一步断点,即n[$(791)](e);之后执行后,生成了这个参数值,证明是n[$(791)]方法生成的。 跟进:
跳转到5766行,在5779行设置断点,此时n中还没有生成这个参数:
执行_gct(n)后,生成:
可以看到它的生成位置是在_gct方法中。 跟着它走之后,你会看到gct4.js文件,它与第三代有很大不同:
该值可以导出。 至此,e已经分析完毕。 然后回到第6238行,跟进加密函数d[$(84)],其定义在第11669行, d[$(177)](c) + u 即r参数的值, c是一个大数组,而u显然是加密的,所以r参数的值就是加密数组c加u:
首先跟进u,定义在第11705行,反混淆后如下:
u = new l["default"]()["encrypt"](i);
所以u是对i加密后得到的,i的定义在第11702行:
i = (0,d[$_DIEIq(103)])()
跟进第 852 行定义的 d[$(103)],这是另一个熟悉的 16 位随机数:
i是一个随机数,跟进加密函数l[($(84))],在第12725行,在第12741行下断点,可以看到这是一个RSA加密,直接扣代码或者直接导入图书馆 :
回到c参数,c参数的值是一个大数组,定义在第11705行,反混淆后的内容如下:
var c = s[a]["symmetrical"]["encrypt"](e, i);
e之前已经分析过,i是随机数,两个参数都分析过了。 跟进加密方法。 在第12174行,在第12186行设置断点。控制台打印出令人困惑的部分。 这是非常熟悉的。 这里是AES加密,iv是初始向量,加密方式是CBC。 如果对各种加密算法不熟悉,可以阅读K哥的文章【爬虫知识】爬虫常用加解密算法:
c参数最终由d[$(177)]函数加密。 后续在547行定义了,直接扣除,改一下:
结果验证