关于js逆向破解的过程全记录
第一步:熟悉需求
目标网站:fanyi.youdao.com/
在左侧输入英文单词会时时的在右侧展示出来翻译的结果
第二步:找到异步加载的接口,分析参数
其实异步加载ajax的方法我们在google调试台中可以直接找xhr的请求
点击接口,我们查看详细信息
我们可以发现请求方法post,请求地址是:fanyi.youdao.com/translate_o…
请求头部信息
请求参数信息(form-data)
我们换一个单词再次请求一下
对比两次的请求参数我们发现i,salt,sign,lts是不同的,同时lts和salt之间只是相差一位
第三步:我们要找到加密参数
3.1 搜索参数所在生成文件
我们发现sign只是在这个文件中出现过
3.2 进入js文件定位变量
直接ctrl + f 进行搜索
发现有15处是和sign有关,逐一排查
发现了一个和sign和salt的生成,值得注意,然后我们可以通过打断点的方式,来看是不是我们想要的参数的数据
因为是xhr的加载方式,所以我们改变页面上的单词,就会触发js的执行(调试过程如下动图)
我们可以从中看到参数
- r:带有毫秒的时间戳
- i:在r的基础上增加了一个随机整数 16462039897241
- e: 我们输入的单词
- salt: "fanyideskweb" + 单词 + 毫秒时间戳随机整数 + "Ygy_4c=r#e#4EX^NUGUc5" 的字符串的md5加密
3.3 通过控制台进行验证
我们将断点全部放掉,就能得到一个完整的请求过程
我们看到和我们的参数中的salt是一致的,证实猜想
第四步:改写成python代码
import requests
import time
import random
from hashlib import md5
cookies = {
'DICT_UGC': 'be3af0da19b5c5e6aa4e17bd8d90b28a|',
'OUTFOX_SEARCH_USER_ID': '-635751482@10.108.162.139',
'JSESSIONID': 'abcL8h0EqUeYZcCgVpj9x',
'OUTFOX_SEARCH_USER_ID_NCOO': '1881106502.3134365',
'_ntes_nnid': 'cf8b29d90f0eb53bf1bbffdb840725e3,1646201347832',
'___rl__test__cookies': '1646203985713',
}
headers = {
'Connection': 'keep-alive',
'Accept': 'application/json, text/javascript, */*; q=0.01',
'X-Requested-With': 'XMLHttpRequest',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36
(KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36',
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
'Origin': 'https://fanyi.youdao.com',
'Sec-Fetch-Site': 'same-origin',
'Sec-Fetch-Mode': 'cors',
'Sec-Fetch-Dest': 'empty',
'Referer': 'https://fanyi.youdao.com/',
'Accept-Language': 'zh-CN,zh;q=0.9',
}
params = (('smartresult', ['dict', 'rule']),)
word = input("请输入你要翻译的单词:")
lts = str(int(time.time() * 1000))
salt = lts + str(random.randint(0,9))
str1 = "fanyideskweb" + word + salt + "Ygy_4c=r#e#4EX^NUGUc5"
md = md5()
md.update(str1.encode())
sign = md.hexdigest()
data = {
'i': word,
'from': 'AUTO',
'to': 'AUTO',
'smartresult': 'dict',
'client': 'fanyideskweb',
'salt': salt,
'sign': sign,
'lts': lts,
'bv': 'b0ff5d17f404993192085bf8b1e93587',
'doctype': 'json',
'version': '2.1',
'keyfrom': 'fanyi.web',
'action': 'FY_BY_REALTlME'
}
response = requests.post('https://fanyi.youdao.com/translate_o',
headers=headers, params=params, cookies=cookies, data=data).json()
print("翻译的结果为:{}".format(response["translateResult"][0][0]["tgt"]))