有道翻译js逆向

有道翻译最新js逆向 前台识别

POST内容分析

我们需要获取翻译内容

首先F12查找network翻译时用到的传输内容和js文件

定位到请求网址为:”https://dict.youdao.com/webtranslate

同时发现 响应内容(包含我们需要的翻译结果)是加密的

js内容解析

POST-Request内容解析

查看荷载(Payload)有一下内容需要留意:signmysticTime

同时查看相关js文件,定位到app.fcc4646e.js

在js文件中定位到Payload内容

可以看到mysticTime js代码实现内容为const t = (new Date).getTime(); 这是一个时间戳

同时其他值固定且容易获取

sign进行分析,可以看到定义了b()函数而且使用了多函数引用

进行断点测试

同时需要特别注意这段js代码

function b(e, t) {
                return p(`client=${r}&mysticTime=${e}&product=${i}&key=${t}`)
            }

在控制终端进行输出`client=${r}&mysticTime=${e}&product=${i}&key=${t}`查看

'client=fanyideskweb&mysticTime=fsdsogkndfokasodnaso&product=webfanyi&key=1672407825637'

目前看到key定义为了t函数,这个稍后可以使用代码实现

同时注意sign的加密函数构建:

  function m(e) {
            return c.a.createHash("md5").update(e).digest()
        }
        function p(e) {
            return c.a.createHash("md5").update(e.toString()).digest("hex")
        }

对sign进行对比:(可以使用firfox浏览器进行抓取,定位时间戳同时间段不容易发生变化,而Chrome浏览器会及时变化,对比不清晰)

POST内容获取代码编写

我们需要自己写代码来或者这几个值,以达到绕过Request识别

主要是进行signmysticTime值获取,我们对这段js代码进行处理和编写

function m(e) {
  return crypto.createHash("md5").update(e).digest();
}

function p(e) {
  return crypto.createHash("md5").update(e.toString()).digest("hex");
}

function b(e, t) {
  return p(`client=${r}&mysticTime=${e}&product=${i}&key=${t}`);
}

function f(e) {
  const t = Date.now();
  return {
    sign: b(t, e),
    client: r,
    product: i,
    appVersion: l,
    vendor: d,
    pointParam: s,
    mysticTime: t,
    keyfrom: u,
  };
}

编写后的输出

const r = "fanyideskweb";
const i = "webfanyi";
const l = "1.0.0";
const d = "web";
const s = "client,mysticTime,product";
const u = "fanyi.web";
const crypto = require("crypto");

function m(e) {
  return crypto.createHash("md5").update(e).digest();
}

function p(e) {
  return crypto.createHash("md5").update(e.toString()).digest("hex");
}

function b(e, t) {
  return p(`client=${r}&mysticTime=${e}&product=${i}&key=${t}`);
}

function f(e) {
  const t = Date.now();
  return {
    sign: b(t, e),
    client: r,
    product: i,
    appVersion: l,
    vendor: d,
    pointParam: s,
    mysticTime: t,
    keyfrom: u,
  };
}

const e = "fsdsogkndfokasodnaso";
const { sign, mysticTime } = f(e);
console.log(i);
console.log(sign);
console.log(r);
console.log(i);
console.log(l);
console.log(d);
console.log(s);
console.log(mysticTime);
console.log(u);

调试内容:

我们可以用python写一段输出

import hashlib
import time

def sign(r, i, e, t):
    s = f"client={r}&mysticTime={t}&product={i}&key={e}"
    h = hashlib.md5()
    h.update(s.encode())
    return h.hexdigest()

def get_sign(r, i, e):
    t = int(time.time() * 1000)
    return sign(r, i, e, t)

r = "fanyideskweb"
i = "webfanyi"
e = "fsdsogkndfokasodnaso"
sign = get_sign(r, i, e)
print(sign)

前端输出加密内容解密

先要查找到加密函数

查看定义栈

然后对输出的json内容进行解密就可以了

有道翻译的 `sign` 参数是其翻译请求中一个关键的加密参数,用于防止未经授权的请求。通过对相关 JavaScript 代码的逆向分析,可以发现 `sign` 参数的生成方法。以下是其生成逻辑的详细说明: 1. `ts` 参数的生成: `ts` 参数通常是通过获取当前时间戳生成的。具体代码如下: ```javascript r = "" + (new Date).getTime() ``` 这段代码获取了当前的时间戳,并将其转换为字符串形式 [^3]。 2. `bv` 参数的生成: `bv` 参数是通过 `navigator.appVersion` 的 MD5 加密生成的。具体代码如下: ```javascript t = n.md5(navigator.appVersion) ``` 这里使用了 MD5 加密算法对 `navigator.appVersion` 进行加密 [^3]。 3. `salt` 参数的生成: `salt` 参数是通过 `ts` 参数的基础上加上一个随机整数生成的。具体代码如下: ```javascript i = r + parseInt(10 * Math.random(), 10) ``` 这段代码在 `ts` 的基础上加上了一个 0 到 9 之间的随机整数 [^3]。 4. `sign` 参数的生成: `sign` 参数是通过将特定字符串与 `e`(翻译内容)、`i`(salt)以及另一个固定字符串进行拼接后,再进行 MD5 加密生成的。具体代码如下: ```javascript sign = md5("fanyideskweb" + e + i + "@6f#X3=cCuncYssPsuRUE") ``` 这里 `e` 是翻译的内容,`i` 是前面生成的 `salt` 值,`md5` 是 MD5 加密函数 [^3]。 ### 示例代码 以下是一个 Python 示例代码,用于生成 `sign` 参数: ```python import hashlib import time import random def generate_sign(e): ts = str(int(time.time() * 1000)) bv = hashlib.md5("navigator.appVersion".encode()).hexdigest() # 假设navigator.appVersion为固定字符串 salt = ts + str(random.randint(0, 9)) sign = hashlib.md5(f"fanyideskweb{e}{salt}@6f#X3=cCuncYssPsuRUE".encode()).hexdigest() return sign # 示例使用 translation_text = "Hello World" sign = generate_sign(translation_text) print("Sign:", sign) ``` ### 注意事项 - 在实际应用中,`navigator.appVersion` 的值可能会根据浏览器的不同而有所变化,因此需要根据实际情况进行调整。 - `salt` 参数的生成依赖于 `ts` 和一个随机数,因此每次生成的 `salt` 都会不同。 - `sign` 参数的生成逻辑可能会随着有道翻译的更新而发生变化,因此需要定期检查和更新代码。
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值