爬虫JS逆向之空中网模拟登录

爬虫JS逆向之空中网模拟登录

网址:空中网

开发者工具抓包逆向分析

在这里插入图片描述

通过浏览器自带的开发者工具,我们可以点击登录按钮,抓到登录有关的包,对比其中的参数,发现加密的参数是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<dc>.*?)"')
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)

登录成功!

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值