摘要
本文内容转自网络,个人学习记录使用,请勿传播
STEAM逆向分析
url:https://store.steampowered.com/login/?redir=&redir_ssl=1
分析思路:
输入用户名和密码后,点击登录按钮,通过抓包工具捕获点击登录按钮后发起请求对应的相关数据包。
定位了登录的数据包:
- 发现只有密码是加密的,因此需要对密码进行逆向,加密的密码对应的请求参数名称是:password,接下来打开全局搜索框,搜索password即可。
打开全局搜索框:
- 点击右上角的三个点,打开search表示的全局搜索框即可,在其内部搜索password。
- 在进行了password全局搜索后,定位了一批的数据包,在这些数据包中重点关注js文件对应的代码,在其内部找寻加密解密的相关操作。
- 如果定位到了一个数据包,记得点击左下角的大括号进行js文件代码的格式化显示。
- 在该数据包内部代码中点击一下,按下contrl+f进行局部搜索,搜索password即可,在可以位置打下断点即可!
- 在可以之处打上断点后,需要基于抓包工具进行请求的重新发送,查看是否会停留在断点的位置。
- 看到是调用了RSA的encryt进行数据加密,该函数有两个参数,参数1是明文密码(已知),参数2是pubkey公钥,公钥具体的数值(未知)。
如果断点生效,下一步进行js改写
重要的经验分享:
- js的内置对象有:window,document,navigator
- 在js改写的过程中,如果出现了上述内置对象未定义的情况,直接给该内置对象赋值this即可!window = this; navigator = this;
改写成功后的js代码:
1
见项目代码
小问题:上述改写的js代码中,getPublicKey函数需要的公钥是写死在程序中,如何实现动态获取公钥的数据呢?
公钥和私钥都不会明文的写在程序中,网站中加密算法的公钥/私钥一般都是隐藏在前台的html页面中或者是通过单独的请求获取的!
重新改写好的最终js代码:
1
见项目代码
完整的python代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22import requests
#动态获取rsa的公钥数据
headers = {
'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.51 Safari/537.36',
}
url = 'https://store.steampowered.com/login/getrsakey/'
data = {
"donotcache": "1647951542258",
"username": "bobo@qq.com"
}
json_data = requests.post(url,headers=headers,data=data).json()
mod = json_data['publickey_mod']
exp = json_data['publickey_exp']
import execjs
node = execjs.get()
fp = open('steam.js','r',encoding='utf-8')
ctx = node.compile(fp.read())
pwd = "123456"
jsFunc = 'getPwd("%s","%s","%s")'%(pwd,mod,exp)
result = ctx.eval(jsFunc)
print(result)
完美世界逆向分析
url:https://passport.wanmei.com/login?location=L3NhZmUv
- 定位到正确的断点位置
- 进行js改写操作
- 断点代码的关键字:setPublicKey,encrpt
- 通过这两个关键字确定该算法为非对称秘钥加密算法!
- 注意:e.setPublicKey($(‘#e’).val()); 该行代码是在设置公钥,因此函数的参数应该是公钥表示的字符串。$(‘#e’).val()就是公钥表示的字符串。$(‘#e’).val()的意思是,获取id为e的标签中存储的数据值,将该数据值作为公钥使用。
- 断点代码的关键字:setPublicKey,encrpt
注意:直接将js代码粘贴到发条改写工具中,可能会出现编码问题,则可以将js代码先粘贴到pycharm中,再将pycharm中的代码复制粘贴到发条改写工具中,不要点击格式化按钮,然后直接点击加载代码按钮,会出现一个错,定位在了s = “…”,可以将该行代码删除,自己重新写一遍即可!至此编码问题就解决了!
python代码
1
2
3
4
5
6
7
8
9import execjs
node = execjs.get()
fp = open('wanmeishijie.js','r',encoding='utf-8')
ctx = node.compile(fp.read())
pwd = "123456"
key = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCjfeE0MIYsZes/HwV06/kvRw34Hmhn9WPt0feLPp1PVqdqZz1/xFvPPEAJ/lAvfqt5kyn+A06bvYXIhizTjlOzPgLE4897ihuSYXgfwcUshPZvydRLbftU6Exj5SLbv5tw4GInbgQv7RWLWOKyQA81q6lWae2Kcgd1XpDRsQNXVwIDAQAB"
jsFunc = 'getPwd("%s","%s")'%(pwd,key)
result = ctx.eval(jsFunc)
print(result)