栗子是: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)
输出效果