分析主要逻辑
抓包定位到/webtranslate
接口就是翻译接口,先看参数(如下图)
可以明显看到是有一个加密参数sign,再看服务器响应的数据(如下图)
可以看到它是以密文形式返回,因此这里一定是数据返回在前端,通过JS将密文解密了。
知道主要逻辑就可以开工了,接下来的话,主要就是:
- 分析一个加密参数sign(请求参数值)
- 解密返回的密文数据,将密文还原为明文
现在知道整体的逻辑就可以开工啦~
逆向sign参数
通过JS断点调试,最终发现sign加密参数的生成位置,其中o是时间戳,e是写死了的字符串
所以就找到了加密函数的入口,即S
函数,进入S函数就进入核心的加密逻辑了(如下图)
可以看到将几个值拼接出的长字符串传入了_
函数进行加密处理,所以具体的加密规则一定在_
函数中
好啦看到这里,熟悉的md5
字样,盲猜是标准库中的md5算法,直接通过在线工具对字符串进行加密,将得到的结果与网页中比对~
哎~让我赌对了,就是标准的md5加密算法,连魔改都没有。
这是我还原出的JS代码:
const CryptoJS = require('crypto-js')
function _(e) {
return CryptoJS.MD5(e.toString()).toString(CryptoJS.enc.Hex);
}
function S(e, t) {
return _(`client=fanyideskweb&mysticTime=${e}&product=webfanyi&key=fsdsogkndfokasodnaso`)
}
console.log(S('1719148432059'))
解密返回的密文数据
接下来就是分析JS的主要逻辑,定位到解密数据的位置
进入解密函数可以看到函数主要的加密逻辑是AES
加密,采用CBC
的方式
知道加密逻辑了,就可以用python
进行复现了
"""
-*- coding: utf-8 -*-
@File : Youdao.py
@author : @鲨鱼爱兜兜
@Time : 2024/06/23 22:09
"""
def decrypt(self, decrypt_str):
"""核心解密函数"""
key = "ydsecret://query/key/B*RGygVywfNBwpmBaZg*WT7SIOUP2T0C9WHMZN39j^DAdaZhAnxvGcCY6VYFwnHl"
iv = "ydsecret://query/iv/C@lZe2YzHtZ2CYgaXKSVfsb7Y4QWHjITPPZ0nQp87fBeJ!Iv6v^6fvi2WN@bYpJ4"
key_md5 = hashlib.md5(key.encode('utf-8')).digest()
iv_md5 = hashlib.md5(iv.encode('utf-8')).digest()
aes = AES.new(key=key_md5, mode=AES.MODE_CBC, iv=iv_md5)
code = aes.decrypt(base64.urlsafe_b64decode(decrypt_str))
return unpad(code, AES.block_size)
使用浏览器中返回的密文进行测试
可以看到解密后的就是非常哇瑟的JSON格式的字典数据了,至此完美解密!
金山词霸API逆向:金山词霸API详解
源码放在github仓库:四大API的个性化翻译工具
@鲨鱼爱兜兜