JS逆向过滑块加密

 前几天有人需要注册账号,但是网页注册登录都有滑块,原本是用selenium过的,但是处理一次要60s效率大大降低,于是开始研究网站的验证码

 

 打开F12调试工具,滑动一次滑块,获得以下的包

 

 这里可以看出,validData就是验证的加密,op应该就是轨迹的加密,搜索validData,发现只有一个数据,

 

 

 

 validData是i,op是e ,i和e都是通过Encrypt来的,在Encrypt处下个断点,再次拖动滑块,

 

 果然断了下来,进入en函数查看,传入参数是t 和 Z(S)

 

 发现这就是普通的Aes加密,密码和偏移量都是t,t就是Z(S)

那我们进入Z中查看他的代码

 

 只是对字符串进行简单的分割拼接,而S对比一下就知道他是capKey

这里用解密一下

 

 length是滑块滑动的长度,后面的那个是时间

 

下面是Op轨迹加密的算法

在上面可以看出e也是由Encrpyt加密而来,我们只需要知道 明文和密码就行,再函数里面加上断点

 

 e应该就是滑动的轨迹,密码和之前的是一样的

解密一下看看,

 

 既然都解决了,那就用python伪造op和validdata了

代码如下:

def Check(end_x):
    lists = [] #存放轨迹
    x = random.randint(200, 300) #起点的x坐标
    current = 0 #当前移动了多少位置
    y = random.randint(400, 500) #起点的y坐标
    t = 0 #用的时间
    lists.append([x, y, 1, t])
    while current < end_x:
        t += random.randint(150, 200)
        y += random.randint(-2, 2)
        current += random.randint(-2, 10)
        lists.append([x + current, y, 3, t])
    lists.append([end_x + x, y + random.randint(-2, 2), 3, t + random.randint(100, 700)])
    return lists
def getKey(key): #获取密钥
    return key[1:3] + key[10:13] + key[20:22] + key[26:31] + key[21:25]
def add(data): #Aes补位
    if len(data) % 16:
        data = data + chr(16 - len(data) % 16).encode() * (16 - len(data) % 16)
    return data

def Aes(str, key):
    s = AES.new(key.encode(),AES.MODE_CBC,key.encode())
    end = s.encrypt(add(str.encode()))
    return base64.b64encode(end).decode()
if __name__ == '__main__':
    x = 滑块的x坐标
    key = getKey("9d71287db8c54fd5ab929c6aaab3cd86")
    path = Check(x)
    valid = "{\"length\":" + str(x) + ",\"validateTimeMilSec\":" + str(path[-1][3] - path[0][3]) + "}"
    Aes(valid,key)
    Aes(str(path).replace(" ",""),key)

至此就大功告成了,

 运行一下只需要1.5s

大大减少了时间

posted @ 2021-09-26 22:42  富贵平安。  阅读(567)  评论(0)    收藏  举报