"""
逆向js是一个什么过程:由结果往前推,得到这些结果需要哪些条件,
然后准备好这些条件,用代码去模拟浏览器js生成结果的过程,获得想要的
结果
分析
网页:密码加密,参数较多 -> 移动端 :密码还是加密,但参数较少。另外:移动端登录之后,
登录状态保持,能直接登录网页端
破解移动端:post 请求,要携带4个参数才能登录成功,寻找4个参数来源路径,然后通过逆向js
将符合条件的参数准备好,其实只需准备2个参数,rKey与加密后的password。
分析js,js代码里面:登录之前要发起 get 请求 http://activity.renren.com/livecell/rKey 获取 n
rKey 可根据 n 获取
password 加密 需要 提供变量 t ,n ,需要提供 函数setMaxDigits(),RSAKeyPair(),encryptedString()
上述3个函数在对应的 BigInt.js , RSA.js 里面,而RSA.js 要运行涉及 Barrett.js 文件。所以
模拟浏览器提供rKey 与 password 加密过程需要 提供 两个变量 t 和 n, 三个js文件 BigInt.js , RSA.js
,Barrett.js。
涉及js与python代码互动,需要用js2py模块
涉及状态保持,需要用到request.session()
"""
""" renren为例: 登录请求: http://activity.renren.com/livecell/ajax/clog phoneNum: XXXXXXXXXXX password: 29f159776d004d165c188bbdee199a1e4d4db66b2303d2fd404c9 c1: -100 rKey: 31e26fc9b340645a2da2a4e84c3b950e : password,rKey怎么来的。 发起登录请求前发起另一个请求和js代码,生成rKey与加密后的password: get http://activity.renren.com/livecell/rKey 的响应 n -> rKey js代码 -> 加密password 由js post代码来看,t是表单 """
代码实现
import requests
import json
import js2py
rKey_url = "http://activity.renren.com/livecell/rKey"
headers = {
"User-Agent": "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Mobile Safari/537.36"
}
response = requests.get(rKey_url, headers=headers)
n = json.loads(response.text)["data"]
# print(n)
rkey = n["rkey"]
context = js2py.EvalJs()
with open("BigInt.js", "r", encoding="utf-8") as f:
context.execute(f.read())
with open("RSA.js", "r", encoding="utf-8") as f:
context.execute(f.read())
with open("Barrett.js", "r", encoding="utf-8") as f:
context.execute(f.read())
phoneNum = input('请输入用户名:')
password = input('请输入密码:')
context.t = {
"password": password,
}
context.n = n
js = """
t.password = t.password.split("").reverse().join("");
setMaxDigits(130);
var o = new RSAKeyPair(n.e,"",n.n);
r = encryptedString(o, t.password);
t.password = r,
t.rKey = n.rkey
"""
context.execute(js)
# print(context.t)
login_url = "http://activity.renren.com/livecell/ajax/clog"
session = requests.session()
data = {
"phoneNum": phoneNum,
"password": context.t["password"],
"c1": -100,
"rKey": context.t["rKey"]
}
session.post(login_url, headers=headers, data=data)
response = session.get("http://www.renren.com/")
with open("09-人人.html", "wb") as f:
f.write(response.content)