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

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

一、拿到加密代码

【Python】逆向爬虫-----模拟steam登录(RSA)_第1张图片

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

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

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

【Python】逆向爬虫-----模拟steam登录(RSA)_第2张图片

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

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

【Python】逆向爬虫-----模拟steam登录(RSA)_第3张图片

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

【Python】逆向爬虫-----模拟steam登录(RSA)_第4张图片

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

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

【Python】逆向爬虫-----模拟steam登录(RSA)_第5张图片

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

【Python】逆向爬虫-----模拟steam登录(RSA)_第6张图片 复制对应的mod和exp的数据到定义的变量里。再次加载计算。

【Python】逆向爬虫-----模拟steam登录(RSA)_第7张图片

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

【Python】逆向爬虫-----模拟steam登录(RSA)_第8张图片

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

【Python】逆向爬虫-----模拟steam登录(RSA)_第9张图片

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

【Python】逆向爬虫-----模拟steam登录(RSA)_第10张图片


 二、用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": "[email protected]"
}
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)


输出效果 

【Python】逆向爬虫-----模拟steam登录(RSA)_第11张图片


三、模拟登录steam

#续上代码

url_login = 'https://store.steampowered.com/login/dologin/'
data_login = {
    "donotcache": "1639124407636",
    "password": pwd,
    "username": "[email protected]",
    "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)

输出效果 


你可能感兴趣的:(Python记录册,python,爬虫,开发语言)