第一个js逆向项目--破解有道词典

786 阅读2分钟

关于js逆向破解的过程全记录

第一步:熟悉需求

目标网站:fanyi.youdao.com/

image.png

在左侧输入英文单词会时时的在右侧展示出来翻译的结果

第二步:找到异步加载的接口,分析参数

其实异步加载ajax的方法我们在google调试台中可以直接找xhr的请求

image.png

点击接口,我们查看详细信息

我们可以发现请求方法post,请求地址是:fanyi.youdao.com/translate_o…

image.png

请求头部信息

image.png

请求参数信息(form-data)

image.png

我们换一个单词再次请求一下

image.png

对比两次的请求参数我们发现i,salt,sign,lts是不同的,同时lts和salt之间只是相差一位

第三步:我们要找到加密参数

3.1 搜索参数所在生成文件

image.png

image.png

我们发现sign只是在这个文件中出现过

3.2 进入js文件定位变量

image.png

image.png

直接ctrl + f 进行搜索

image.png

发现有15处是和sign有关,逐一排查

image.png

发现了一个和sign和salt的生成,值得注意,然后我们可以通过打断点的方式,来看是不是我们想要的参数的数据

image.png

因为是xhr的加载方式,所以我们改变页面上的单词,就会触发js的执行(调试过程如下动图)

image.png

我们可以从中看到参数

image.png

  • r:带有毫秒的时间戳
  • i:在r的基础上增加了一个随机整数 16462039897241
  • e: 我们输入的单词
  • salt: "fanyideskweb" + 单词 + 毫秒时间戳随机整数 + "Ygy_4c=r#e#4EX^NUGUc5" 的字符串的md5加密

3.3 通过控制台进行验证

image.png

我们将断点全部放掉,就能得到一个完整的请求过程

image.png

我们看到和我们的参数中的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"]))

第五步:结果展示

image.png