【Python】逆向爬虫-----模拟steam登录(RSA)

栗子是:Sign In        js调试工具:发条js调试工具.rar-桌面系统文档类资源-CSDN下载

一、拿到加密代码

 由图可以看到password被加密了。我们在搜索框里搜索 “password =” ,找到并打开包含该关键词的js文件,查看里面的代码。

 我们在这行代码中找到了加密代码的语句,是一个RSA的加密。我们在这里设置一个断点。再次提交登录。

我们复制这两行代码到js调试工具。

 把复制过来的代码放进一个函数里,接下来我们要补全函数 。

 我们回到检测工具定位到getPublicKey()这个函数,进入他所在的js文件。

通过观察可知,这个js文件里面写的是RSA加密的内容, 所以我们把文件里的全部代码都复制到js调试工具里。

 加载代码,然后计算表达式。报了一下错误。我们先解决BigInteger()这个函数的定义。回到检查工具搜索BigInteger。

 找到了,把代码复制到调试工具。再次加载计算。

 继续解决报错问题。它说result还未定义,那我们就定义两个变量,再将变量作为函数的实参。

 复制对应的mod和exp的数据到定义的变量里。再次加载计算。

继续解决报错问题。可以看见报错那行的代码中包含了'this'关键词,在方法中,this 表示该方法所属的对象,那么我们接下来继续查找BigInteger所属的对象。

可以看到在这个js文件里有很多BigInteger所调用的东西,为了减少不必要的麻烦,干脆把这个文件里的全部代码都复制到调试工具里(先把刚刚复制的BigInteger函数删了)。

 再次加载出现了'navigator' 未定义的报错,'navigator' 是js内置的对象,我们在代码开头加上navigator = this; 再次执行加载、计算,成功出现了加密出来的结果⇩⇩⇩


 二、用PyExecJS模块运行js代码拿到加密后的密码

在执行前先修改一下js代码。因为mod和exp的值不一定是固定的,要实时地抓取。

function getPwd(password,mod,exp) {
var pubKey = RSA.getPublicKey(mod,exp);
var encryptedPassword = RSA.encrypt(password, pubKey);
return encryptedPassword;
}

 

用requests发送请求拿到publickey_exp和publickey_mod的数据,然后把他们传入getPwd()函数,拿到加密后的密码。

import execjs
import  requests

header = {
"user-agent" : "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.45 Safari/537.36"
}
url = "https://store.steampowered.com/login/getrsakey/"
data ={
    "donotcache": "1639109728248",
    "username": "123@qq.com"
}
resp = requests.post(url,headers=header,data= data).json()
mod = resp['publickey_mod']
exp = resp['publickey_exp']
print("publickey_mod:",mod)
print("publickey_exp:",exp)


# 实例化一个node对象
node = execjs.get()
#js源文件编译
ctx = node.compile(open('nsa.js',encoding='utf-8').read())
#执行getPwd函数
funcName = 'getPwd("{0}","{1}","{2}")'.format('123456',mod,exp)
pwd =  ctx.eval(funcName)
print("密码:",pwd)


输出效果 


三、模拟登录steam

#续上代码

url_login = 'https://store.steampowered.com/login/dologin/'
data_login = {
    "donotcache": "1639124407636",
    "password": pwd,
    "username": "123@qq.com",
    "twofactorcode":"",
    "emailauth":"",
    "loginfriendlyname":"",
    "captchagid": "-1",
    "captcha_text": "",
    "emailsteamid": "",
    "rsatimestamp": "118875800000",
    "remember_login": "false"
}
resp_login = requests.post(url_login,headers=header,data=data_login).json()
print(resp_login)

输出效果 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SamRol

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值