IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> 【Python】逆向爬虫-----模拟steam登录(RSA) -> 正文阅读

[Python知识库]【Python】逆向爬虫-----模拟steam登录(RSA)

栗子是:Sign In

一、拿到加密代码

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

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

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

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

?我们回到检测工具定位到getPublicKey()这个函数。

通过观察可知,这个js文件里面写的是NSA加密的内容,?所以我们把文件里的全部代码都复制到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)

输出效果?


?

  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2021-12-11 15:40:40  更:2021-12-11 15:42:43 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/16 4:49:21-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码