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
大大减少了时间