声明:本文只作学习研究,禁止用于非法用途,否则后果自负,如有侵权,请告知删除,谢谢!
前言
目标网站:https://music.163.com/
注:看了下其他博主写的,咋说呢,都没有写全,checkToken这个参数是需要动态的,你可能hook下来的时候有用,但是过几分钟他就失效了。
一、页面分析
请求包里的两个参数params和encSecKey,是比较简单的,包含了AES和RSA的加密,其中里面的key是随机生成的
二、抓包分析
1.主要加密方法分析
在这个JS里面嗷,直接定位到加密的位置,里面主要的是a、b、c方法,然后加密的参数主要是这个d
先说a、b、c这三方法吧,a断点进去就可以看到是一个16位的随机数
再看这个b,是一个AES的加密,其中key是a方法生成的16位随机数
c方法是一个RSA加密,16进制的公钥跟生成位数都已经有了,然后加密参数a是那个16位随机数,这里注意AES加密的key和RSA加密的参数,都是这个16位随机数(只生成一次)
2.加密的参数d分析
主要的加密方法已经知道了,然后需要这个加密后的参数,先来看看参数d里面有什么值吧,这里就直接讲了,不细说
password:MD5(原密码)
checkToken:根据环境加密生成的随机值
然后这里主要的是一个checkToken,由于他的生成方法里有时间戳,所以有一定的失效性,那总不可能失效了就在去hook吧。
追一下栈到这里,就是生成的位置了。
里面有两参数,其中C的值t是一个随机数,ka好像是固定的false
t的值是这里生成的,用了一个$b方法,我们进去瞅瞅看
也不知道啥玩意,反正到时候直接扣代码,现在控制台看看
是个32位的随机数
checkToken的加密参数已经分析好了,然后这个加密方法bc(),看看就行,到时候也直接扣。
三、模拟请求
在经过一系列的扣加密代码后,发送请求,看看结果是正确的
四、源码分享
需要JS代码的可以添加wx:zwj1314520-y
# -*- coding: utf-8 -*-
'''
@File: login.py
@SourceUrl:
@Author: 阿J
@Date: 2021/4/2 16:34
@Software: PyCharm
@Desc:
'''
import requests, execjs, hashlib
with open('./code.js', encoding='utf8') as f:
js_fun = execjs.compile(f.read())
with open('./my.js', encoding='utf8') as f:
xx = execjs.compile(f.read())
headers = {
'authority': 'music.163.com',
'pragma': 'no-cache',
'cache-control': 'no-cache',
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36',
'nm-gcore-status': '1',
'content-type': 'application/x-www-form-urlencoded',
'accept': '*/*',
'origin': 'https://music.163.com',
'sec-fetch-site': 'same-origin',
'sec-fetch-mode': 'cors',
'sec-fetch-dest': 'empty',
'referer': 'https://music.163.com/',
'accept-language': 'zh-CN,zh;q=0.9',
}
session = requests.session()
session.get('https://music.163.com/#',headers=headers)
phone = ''
pwd = ''
# checkToken 为前环境生成的随机值
checkToken = xx.call('get_acToken')
print('参数checkToken:',checkToken)
password = hashlib.md5(pwd.encode(encoding='UTF-8')).hexdigest()
p1 = '{"phone":"'+phone+'","password":"'+password+'","rememberLogin":"true","checkToken":"'+checkToken+'","csrf_token":""}'
data = js_fun.call('d',p1)
print('加密后的data:',data)
response = session.post('https://music.163.com/weapi/w/login/cellphone', headers=headers, data=data)
print('登入信息:',response.text)
cookies = dict(session.cookies)
csrf_token = cookies.get('__csrf')
print('登入后的csrf_token:',csrf_token)