js逆向-renren为例

"""
逆向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)

 

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值