本教程仅限于学术探讨,也没有专门针对某个网站而编写,禁止用于非法用途、商业活动、恶意滥用技术等,否则后果自负。观看则同意此约定。如有侵权,请告知删除,谢谢!
目录
一、接口请求流程
二、C1包
三、ac
四:测试结果
总结
前言
本期逆向一下顶像滑块,官网介绍:采用设备环境、行为特征、访问频率等多个风险判断要素,以及业内最丰富的验证方式帮助客户进行人机风险防控。并通过顶象防御云进行感知迭代, 能够有效拦截批量撞库扫号、批量注册等机器风险行为。
看起来很牛逼的勒,越牛逼越想肝他,简单的反而不想肝它,因为顶像滑块它的JS是动态的,参数、函数都是变化的,所以只能补环境,没法做到算法还原,怎么实现的函数动态?这也就不清楚了,函数一直没变只是加密顺序与参数变了,比如本来的加密流程是:A>B>C,它呢在一定时间能可能变成了:B>A>C的加密顺序.更多的介绍百度了,很多大佬对这方面详细解答了.
但是找到一个网站JS参数、函数是不变的,这大大减低了难度(了解一下流程补环境了相对也就简单),也就是说可以还原成python算法了😄
本期滑块练手网址:aHR0cHM6Ly93d3cudml2by5jb20uY24vc2VydmljZS9tb2JpbGVQaG9uZUF1dGhlbnRpY2l0eUNoZWNrL2luZGV4
提示:以下是本篇文章正文内容,下面案例可供参考
一、接口请求流程
1.先看看获取滑块图片的接口参数,大致看看也没什么重要参数,jsv的加密的JS版本(也就是之前介绍的动态参数函数所对应的版本,不过这个网址是定制的,不会变的,所以固定就好了),ak是产品id,aid呢是时间戳加随机数,w、h、s等这些参数就不介绍了用处不是很大,固定就好了,
2.在看响应内容有什么玩意,p1、p2就是滑块了不过呢是撕裂的,需要通过o值去还原撕裂的图像,老版本的顶像不是通过o值,可以看下我之前的图像还原,算法还是一样的算法,只不过从url提值变成了o,减少了url提值的步骤摆了。还有一个y、sid值后面加密要用,其它的没啥鸟用了.
3.验证接口/api/v1,这个就是最好一步了,验证滑块了,恶心人的ac它来了不过问题不大,sid就是滑块的安全验证id咯,c值是通过c1两个包请求得来的,aid呢嘿嘿发现了吧有什么不同自己领悟,xy就不用说了
4.c1两次请求包,请求头的Param咯,又是长长的一串欸,问题大吗?应该问题不大吧.
好了,吉时已到,是时候上邢法了
二、C1包
图像还原呢就不说了,看我之前的文章
1.看下c1这两次请求有什么吧,第一次请求的包,老办法anonymous一顿乱点
2.下个断点加密了什么一目了然,简单还原下python算法,其它网站的就不要想着还原了,都是动态的,我只是想借此让你们了解一下顶像的流程
import time
import json
import math
import random
def get_lid():
a = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
return "".join(a[math.floor(random.random() * len(a))] for _ in range(32))
def getParam(data, lid=None):
if lid is None or not data.get("lid", False):
lid = str(int(time.time() * 1000)) + get_lid()
data["lid"] = lid
u = "=x1LItAH4sf8gp6ewnXQTiKuF_5EkC2m7WjdrM"
f = "UlGhvYo3aRzcq-VPyJBb9NZOD0S"
o = (u + f)[::-1]
if not isinstance(data, str):
data = json.dumps(data, separators=(",", ":"), ensure_ascii=False)
g = ""
len_data = len(data)
for p in range(0, len_data, 3):
i = ord(data[p])
a = ord(data[p + 1]) if p + 1 < len(data) else 0
u = ord(data[p + 2]) if p + 2 < len(data) else 0
f = i >> 2
c = ((3 & i) << 4) | (a >> 4)
s = ((15 & a) << 2) | (u >> 6)
ll = 63 & u
if not a:
s = ll = 64
elif not u:
ll = 64
g += o[f] + o[c] + o[s] + o[ll]
return g
3.第二次请求,还是一顿乱点进去看看在哪加密的
4.加密的代码还是刚刚的加密,只不过内容变了而已简简单单搞定C1
5.验证一下结果,成功拿到响应的data数值
三、ac
1.除了ac其它都搞定了,很好接下来看看它怎么搞的,乱披风锤法,瞎几把乱点
2.进来大致看下吧,我总共下了两个断点两个插桩日志
第一个断点:这个是对滑块轨迹进来加密,与xy轴加密
第二个断点:刚开始拿到滑块呢,进来reload重载ua(ac)加密
第一个插桩:我主要用来打印轨迹,因为我在其它地方进行了轨迹push
第二个插桩:对加密完成的ac打印出来
3.进来看看reload(重载)干了啥事情咯,看懂了吗?朋友们?ok这里检测浏览器的环境就自己慢慢扣了,也不多
function () { var i = r[133] , a = this; this["ge" + E + en](),// 1.检测时间 this[t[134]](),// 2.检测浏览器 this[kt(e[139])](),// 3.检测防盗链 this[Zt(r[134])](),// 4.检测代码 this[e[140]](),// 5.检测浏览器高度,画图用 this[n[137]](),// 6.检测自动化 this[Kt(on + M)](),// 7.检测js版本 this["getTK"](),// 8.检测sid(token) Rt[Kt(an + i)][Qt(r[135])](function () { a[t[135]](),// 9.检测screen a[Nt(o[133])]()// 10.监听轨迹 }) }
4.简单介绍一下第10个检测吧,绑定的监听轨迹吧,欸哟喂,还是挺多了监听了一大堆,自己慢慢调式吧,相信你能找到对轨迹数组加密的地方,这下知道为什么我第一个插桩push明文的轨迹了吧,用于加密对比.
5.看下sendSA,这个是对被加密的轨迹数组进行app加密到ua(ac)中,sendTemp就是x轴与滑块接口的y轴了,OK整体流程就这样搞定,扣下来吧不难的
6.小提示:大部分加密都是围绕app这个函数加密的,实在找不到轨迹的加密,可以尝试着断点app,根据栈去找到轨迹的加密
四:测试结果
基本都成功了,二次验证滑块多了才会触发,也是正常通过的,二次验证的坑自己慢慢领悟了,上面也有介绍了,看你有没有注意到了
总结
以上就是顶像的所有埋坑,能搞定这个的话,其它网站的滑块相信你也能将环境补出来,再见咯~