JS逆向1: 有道翻译sign参数还原以及api返回数据解密
发现有道翻译的api返回结果现在改成密文了,来试试看
1. 目标
目标API: https://dict.youdao.com/webtranslate
请求方式为POST方式,表单提交的内容中字段sign为签名,并且接口返回内容为密文,看起来是base64。
2. 还原SIGN
老规矩,还是先全局搜索sign,在文件app.f59abb30.js中发现可疑的地方。

调试一下,b函数接受的参数中t为毫秒时间戳、e的值固定:fsdsogkndfokasodnaso。b内部对e和t进行了拼接,后由p函数进行计算得出最终sign值。
p函数中拼接的字符串为:client=fanyideskweb&mysticTime=1676711201946&product=webfanyi&key=fsdsogkndfokasodnaso。
然后对p函数传一个空值得出d41d8cd98f00b204e9800998ecf8427e,明显p函数是直接调用了md5算法。

小总结:sign的结果由当前的毫秒时间戳与一些固定字符串拼接后进行md5得出。
3. 解密接口返回结果
3.1 Hook javascript的json相关函数:
1 | const my_stringify= JSON.stringify; |
在console语句上打debugger查看调用栈后找到解密位置:

这里注意关键函数createDecipheriv这是nodejs中用于对称加密算法解密相关的,其中第一个参数为加密算法类型,第二值参数为加密的key,因为这里是aes的cbc模式所以第三个值应该为iv值。
3.2 用python还原:
1 | from Crypto.Cipher import AES |
3.3 小细节
这里有一个小细节,接口返回的base64值并不是一个标准的base64值,而是一个变种:将Base64中的+和/改为了在url中不会被编码的_和/。在python解码base64时需要用urlsafe_b64decode函数。
4. 总结
这个网站还是很简单的,只是base64解码那需要注意一下,作者在这卡了好久。
JS逆向1: 有道翻译sign参数还原以及api返回数据解密