赞
踩
"""
逆向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)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。