JS逆向:逆向登录流程,逆向简单,重在分析思路
文章目录
- 概要
- 整体流程
- 实操阶段
- 加密部分
- 去验证登录试试
- 1 流程梳理
- 2 实操
- 加载js代码
- 准备登陆信息
- 去登陆
概要
使用的库:
import requests
import execjs
import base64
import ddddocr
import json
基础命令安装
pip install requests execjs ddddocr
整体流程
实操阶段
- 首先进入网页,打开F12抓包工具,在登陆页面的选项卡中选择"密码登录页面"。将登录所需信息全部填完(错误信息),点击"登录"按钮

- 在抓包工具中找到登录的数据包,查看payload信息,很明显发现,password参数是被经过加密的,且属于request payload。
- 此时,可判断一定属于POST请求,且数据是直接被挂载到请求体上的
- 在控制台搜索框中搜索这个数据包的url后半部分

- 可以发现有两个有用的而数据包,此时并不知道程序走哪一个,也不需要知道,直接让程序告诉我们走哪,分别进去下两个断点即可。

- 然后再在页面上重复第1步的操作点击"登录",断下来。

- 此时发现pwd是我们输入的密码,而ress.data不知道是什么(思考)。
- ress是通过一个函数zdAjax传过来的一个参数,并且该参数是一个箭头函数。那么我们只需要通过调用栈找其上一步,观察其怎么传参就可以解决这个问题。

- 参数为n,并且为ajax请求,url也可以看到是一个getTime,显而易见,我们需要的这个参数是跟getTIme数据包有关,找到getTime数据包。基本断定这是返回了服务器时间

加密部分
-
进入加密函数

-
特征很明显,这是一个rsa加密,并且没有任何不确定的数值

-
直接撸代码
var JSEncrypt = require("node-jsencrypt")
encryptFn = function (e) {
var o = new JSEncrypt;
return o.setPublicKey("公钥"),
o.encrypt(e)
}
去验证登录试试
1 流程梳理
1.1 先加载登录页面,需要加载验证码
1.2 识别验证码图片
1.3 拿到getTime返回的data数据
1.4 加载js代码
1.5 准备登陆信息
1.6 去登陆
2 实操
- 加载登录页面
session = requests.Session()
session.headers = {
浏览器里的头信息
}
login_page_url = '加载页面url'
session.get(login_page_url) # 访问登录页面
- 识别验证码图片
verify_url = "验证码数据包url"
resp = session.post(verify_url, headers={
"content-type":"application/json;charset=UTF-8"
})
bs = base64.b64decode(resp.json()['data'].split(',')[-1])
dddd = ddddocr.DdddOcr(show_ad=False)
verify_number = dddd.classification(bs)
- getTime返回的data数据
getTime_url = "getTime数据包url"
getTime_resp = session.post(getTime_url, headers={
"content-type": "application/json;charset=UTF-8" # 特殊的头信息
})
tm = getTime_resp.json()['data']
加载js代码
f = open("逆向.js", mode='r', encoding="utf-8")
js_code = f.read()
f.close()
js = execjs.compile(js_code)
准备登陆信息
pws = js.call('encryptFn', 密码 + str(tm))
payload_data = {
"imageCaptchaCode": verify_number,
"userName": "账号",
"password": pws
}
去登陆
login_url = "登录数据包url"
login_resp = session.post(login_url, data=json.dumps(payload_data, separators=(',', ':')), headers={
"content-type":"application/json;charset=UTF-8"
})






