宣告:本文只作學習研究,禁止用于非法用途,否則后果自負,如有侵權,請告知洗掉,謝謝!
文章目錄
- 前言
- 一、頁面分析
- 二、抓包分析
- 1.主要加密方法分析
- 2.加密的引數d分析
- 三、模擬請求
- 四、原始碼分享
前言
目標網站: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)
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/271993.html
標籤:python
