有道翻译-最新js分析
网页分析
查找参数
成果展示
网页分析
定位关键接口
打开开发者工具,network,翻译窗口中输入内容后触发接口如图一:
图一
图二
图三
图四
发现使用post请求,对比两次请求后Form Data中有两个加密参数sign和mysticTime。mysticTime分析是13位的时间戳。通过响应内容(包含我们需要的翻译结果)是加密的。
破解目标—需要分析请求中的加密参数和接口数据解密。
分析加密参数以及接口数据解密
ctrl+F 全局搜索sign或者sign:,查看相关js文件,定位加密参数所在位置。(新手查看每一个文件,把所有对sign字段赋值的地方都打上断点,)
图五
在response中点击右键中的open in sources panel专挑到Source打开文件,点击下图红色地方,将文件格式化。
图六
ctrl+F搜索sign观察如果存在sign加密就打上断点调试,发现如下图
图七
从图中可以观察到, sign: v(t, e就是我们要找的加密地方,观察知道sign是md5加密的。t = (new Date).getTime()是时间戳,e是固定值"fsdsogkndfokasodnaso"(多调试几次)。生成sign的函数是function v(e, t),生成v函数的是g函数,观察知g函数就是md5加密
function v(e, t) {
return g(`client=${
l}&mysticTime=${
e}&product=${
d}&key=${
t}`)
}
图八
function g(e) {
return c.a.createHash("md5").update(e.toString()).digest("hex")
}
通过分析后修改js代码:
const crypto=require('crypto')
function p(e) {
return crypto.createHash("md5").update(e.toString()).digest("hex")
}
const time = (new Date).getTime()
function sign(e, t) {
return p(`client=${
"fanyideskweb"}&mysticTime=${
time}&product=${
"webfanyi"}&key=${
"fsdsogkndfokasodnaso"}`)
}
python 中调用js代码生成sign
import execjs
#js中md5加密
js='''
const crypto=require('crypto')
function p(e) {
return crypto.createHash("md5").update(e.toString()).digest("hex")
}
const time = (new Date).getTime()
function sign(e, t) {
return p(`client=${"fanyideskweb"}&mysticTime=${time}&product=${"webfanyi"}&key=${"fsdsogkndfokasodnaso"}`)
}
'''
print(execjs.compile(js).call('p','"fsdsogkndfokasodnaso"'))
根据js代码修改成python代码
注意,这里有一个小坑(client=${l}&mysticTime=${e}&product=${d}&key=${t}
)通过分析上一张图知输出的结果是:‘client=fanyideskweb&mysticTime=fsdsogkndfokasodnaso&product=webfanyi&key=1681794509199’。但是mysticTime应该传入时间戳,key里是’fsdsogkndfokasodnaso’。所以正确的是:client=fanyideskweb&mysticTime=1681803557799&product=webfanyi&key=fsdsogkndfokasodnaso。所以要注意修改参数。
l='fanyideskweb'
e='fsdsogkndfokasodnaso'
d='webfanyi'
ts=str( int(time.time() * 1000))
#`client=${l}&mysticTime=${e}&product=${d}&key=${t}`
#'client=fanyideskweb&mysticTime=fsdsogkndfokasodnaso&product=webfanyi&key=1681734811804'
j='client={}&mysticTime={}&product={}&key={}'.format(l,ts,d,e)
print(j)
sign =hashlib.md5(j.encode('utf-8')).hexdigest()
print(sign)
print(len(sign))
现在通过带上参数,发送请求,看能否得到数据。
import hashlib
import execjs
import time
import datetime
import requests
from lxpy import copy_headers_dict
url ='https://dict.youdao.com/webtranslate'
heards={
'Accept': 'application/json, text/plain, */*',
'Acc