网址:空中网
通过浏览器自带的开发者工具,我们可以点击登录按钮,抓到登录有关的包,对比其中的参数,发现加密的参数是password,也就是我们的密码。
找到加密的地方,打上断点。
发现密码在这里被encrypt函数加密,加密的秘钥为data[“dc”],我们进入encrypt函数,获取加密函数。
将加密函数保存为空中网.js
js代码:
function encrypt(str, pwd) {
if (pwd == null || pwd.length <= 0) {
return null
};
var prand = "";
for (var i = 0; i < pwd.length; i++) {
prand += pwd.charCodeAt(i).toString()
};
var sPos = Math.floor(prand.length / 5);
var mult = parseInt(prand.charAt(sPos) + prand.charAt(sPos * 2) + prand.charAt(sPos * 3) + prand.charAt(sPos * 4) + prand.charAt(sPos * 5));
var incr = Math.ceil(pwd.length / 2);
var modu = Math.pow(2, 31) - 1;
if (mult < 2) {
return null
};
var salt = Math.round(Math.random() * 1000000000) % 100000000;
prand += salt;
while (prand.length > 10) {
var a = prand.substring(0, 1);
var b = prand.substring(10, prand.length);
if (b.length > 10) {
prand = b
} else {
prand = (parseInt(a) + parseInt(b)).toString()
}
};
prand = (mult * prand + incr) % modu;
var enc_chr = "";
var enc_str = "";
for (var i = 0; i < str.length; i++) {
enc_chr = parseInt(str.charCodeAt(i) ^ Math.floor((prand / modu) * 255));
if (enc_chr < 16) {
enc_str += "0" + enc_chr.toString(16)
} else enc_str += enc_chr.toString(16);
prand = (mult * prand + incr) % modu
};
salt = salt.toString(16);
while (salt.length < 8) salt = "0" + salt;
enc_str += salt;
return enc_str
}
//pwd为加密函数,dc为秘钥,password为密码
function pwd(password,dc) {
p = encrypt(password, dc);
return p;
}
通过ctrl f 进行搜索data[‘dc’],或者一个个找已经抓到的包,找到response里面带dc的包:
现在,加密的函数需要的参数,password跟dc都已经找到,接下来进行加密。
获取dc:
import requests
import re
obj=re.compile(f'.*?"dc":"(?P.*?)"' )
session = requests.session()
dc_url='https://sso.kongzhong.com/ajaxLogin?j=j&jsonp=j&service=https://passport.kongzhong.com/&_=1655189024190'
dc_headers={
'Referer': 'https://passport.kongzhong.com/',
'Cookie': 'SSO-KGZQRT=8E929D7FA75940B571F1760DE296F920; KZLBS=fb5ae79f63fee9d7; Hm_lvt_1287c2225a527abe3386233dd9316f99=1655194302; Hm_lpvt_1287c2225a527abe3386233dd9316f99=1655194302; SSO-KGZLT=86a49ab7-35b5-4f26-a6df-9fd87f35f7fd; SSO-KGZIT=09c99173-a767-4d71-9643-790ed67b370f',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.5005.115 Safari/537.36'
}
dc_text=session.get(dc_url,headers=dc_headers).text
dc=obj.search(dc_text)
dc=dc.group('dc')
对密码进行加密:
import execjs
f=open('空中网.js',mode='r',encoding='utf-8')
js=execjs.compile(f.read())
password=js.call('pwd','1234567',dc)
加密完成,模拟登录。
把参数都写上之后,对登录页面发送请求。
import time
ts = int(time.time() * 1000)
from urllib.parse import quote
import request
login_headers={
'Referer': 'https://passport.kongzhong.com/',
'Cookie': 'KZLBS=bea9e7c1e9b0a090; trackingId=6aa07d04-400d-49b4-a2ab-6aede0ef1895; kzu-er=123456; Hm_lvt_1287c2225a527abe3386233dd9316f99=1655172174; Hm_lpvt_1287c2225a527abe3386233dd9316f99=1655192768; SSO-KGZQRT=D04464C96A6815DA1AFC0EADE2481C50; SSO-KGZLT=0c2d5529-2ba2-4ffd-80f2-0011d5756852'
}
login_url=f'https://sso.kongzhong.com/ajaxLogin?j=j&&type=1&service={quote("https://passport.kongzhong.com")}/&username=这里写你的用户名&password={password}&vcode=&toSave=0&_={ts}'
#quote防止"https://passport.kongzhong.com"搞事情
resp=session.get(login_url,headers=login_headers)
print(resp.text)
记得一定要用
session = requests.session()
创建一个会话,保存请求头的一些信息,并且在每次请求时都要保持cookies的一致
然后我们会发现:
好像缺少了验证码.
抓取验证码所在的包:
请求并解析获得验证码:
yanzhengma_url='https://sso.kongzhong.com/createVCode?w=80&h=30&0.12952182054496464'
tu=session.get(url=yanzhengma_url,headers=dc_headers).content
with open('tu.png',mode='wb')as f:
f.write(tu)
def base64_api(uname, pwd, img, typeid):#某个打码平台的接口
with open(img, 'rb') as f:
base64_data = base64.b64encode(f.read())
b64 = base64_data.decode()
data = {"username": uname, "password": pwd, "typeid": typeid, "image": b64}
result = json.loads(requests.post("http://api.ttshitu.com/predict", json=data).text)
if result['success']:
return result["data"]["result"]
else:
return result["message"]
return ""
result = base64_api(uname='账号', pwd='密码',
img=r'图片路径\tu.png', typeid=3)
加入验证码,重新请求:
login_url=f'https://sso.kongzhong.com/ajaxLogin?j=j&&type=1&service={quote("https://passport.kongzhong.com")}/&username=用户名&password={password}&vcode={result}&toSave=0&_={ts}'
resp=session.get(login_url,headers=login_headers)
print(resp.text)
登录成功!