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

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

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

image-20230218171547008
这里注意关键函数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返回数据解密