logo

百度翻译JS逆向工程全解析:从原理到实践

作者:KAKAKA2025.09.19 13:11浏览量:0

简介:本文深度剖析百度翻译JS逆向技术,涵盖加密参数解析、动态令牌获取及实战案例,助力开发者突破接口限制。

一、百度翻译JS逆向技术背景与核心挑战

百度翻译作为国内领先的机器翻译服务,其Web端接口通过动态加密参数与令牌机制实现安全防护。开发者在调用翻译API时,需破解前端JS生成的signtoken等关键参数,否则将面临403错误或请求失败。这一过程涉及三大技术难点:

  1. 代码混淆与压缩:百度前端JS经过Webpack打包,变量名被替换为_0x1a2b3c等随机字符串,函数调用链复杂。
  2. 动态参数生成token参数依赖时间戳、随机数及加密算法动态生成,每次请求均不同。
  3. 反调试机制:页面加载时执行debugger断点检测,发现开发者工具开启后终止脚本执行。

以Chrome开发者工具为例,直接分析百度翻译页面时,会频繁触发debugger语句导致调试中断。破解此类防护需结合代码重写与自动化工具。

二、逆向工程关键步骤详解

1. 环境准备与代码获取

  • 工具链:Chrome DevTools(禁用缓存)、AST Explorer(代码解析)、Fiddler(请求抓包)。
  • 代码提取
    1. // 通过Chrome DevTools的Sources面板定位加密函数
    2. // 示例:定位到生成token的核心函数
    3. function _0x1a2b3c() {
    4. const _0x3d4e5f = Date.now();
    5. const _0x6f7e8d = Math.random().toString(36).substr(2);
    6. return CryptoJS.HmacSHA256(_0x3d4e5f + _0x6f7e8d, 'secret-key').toString();
    7. }
    实际代码中,变量名与字符串均被混淆,需通过上下文推断逻辑。

2. 动态参数解析

(1)token生成机制

百度翻译的token由三部分组成:

  • 时间戳Date.now()的13位毫秒数。
  • 随机字符串Math.random().toString(36).substr(2)生成8-12位随机字符。
  • HMAC-SHA256加密:使用预置密钥对前两者拼接结果加密。

破解步骤:

  1. Sources面板设置XHR断点,捕获翻译请求。
  2. 跟踪调用栈,定位到加密函数入口。
  3. 使用console.log输出中间变量,验证加密逻辑。

(2)sign参数反推

sign参数通过RSA公钥加密请求体生成。需从JS中提取公钥模数(n)和指数(e),再使用jsencrypt库本地复现加密过程:

  1. const JSEncrypt = require('jsencrypt');
  2. const encryptor = new JSEncrypt();
  3. encryptor.setPublicKey('-----BEGIN PUBLIC KEY-----...');
  4. const sign = encryptor.encrypt(JSON.stringify({q: 'hello', from: 'en', to: 'zh'}));

3. 反调试绕过技术

百度通过以下方式检测开发者工具:

  • debugger陷阱:在代码中插入无限循环的debugger语句。
  • 窗口尺寸检测:判断window.outerHeight - window.innerHeight > 100(开发者工具占用空间)。

绕过方案:

  • 代码重写:使用Chrome扩展覆盖debugger语句。
  • 自动化工具:通过Puppeteer无头浏览器模拟用户操作:
    1. const puppeteer = require('puppeteer');
    2. (async () => {
    3. const browser = await puppeteer.launch({headless: false});
    4. const page = await browser.newPage();
    5. await page.setJavaScriptEnabled(true);
    6. await page.goto('https://fanyi.baidu.com');
    7. // 拦截并修改响应
    8. await page.setRequestInterception(true);
    9. page.on('request', request => {
    10. if (request.url().includes('translate')) {
    11. request.continue({
    12. postData: JSON.stringify({q: 'test', sign: '破解后的sign', token: '破解后的token'})
    13. });
    14. }
    15. });
    16. })();

三、实战案例:构建本地翻译服务

1. 参数破解与复现

以翻译”hello”为例,完整流程如下:

  1. 抓包分析:通过Fiddler捕获翻译请求,记录tokensigngt等参数。
  2. 代码提取:从混淆的JS中提取加密函数,重命名为可读形式:
    1. function generateToken() {
    2. const timestamp = Date.now();
    3. const nonce = Math.random().toString(36).substr(2, 8);
    4. return CryptoJS.HmacSHA256(timestamp + nonce, 'BAIDU_TRANSLATE_KEY').toString();
    5. }
  3. 本地验证:使用Node.js复现加密逻辑,对比服务器返回的token是否一致。

2. 接口封装与调用

破解参数后,可封装为Python请求:

  1. import requests
  2. import hashlib
  3. import random
  4. import time
  5. def generate_token():
  6. timestamp = str(int(time.time() * 1000))
  7. nonce = ''.join(random.choices('abcdefghijklmnopqrstuvwxyz0123456789', k=8))
  8. secret = 'BAIDU_TRANSLATE_KEY'
  9. return hashlib.sha256((timestamp + nonce + secret).encode()).hexdigest()
  10. def translate(text, from_lang, to_lang):
  11. url = 'https://fanyi.baidu.com/v2transapi'
  12. headers = {
  13. 'User-Agent': 'Mozilla/5.0',
  14. 'X-Requested-With': 'XMLHttpRequest'
  15. }
  16. data = {
  17. 'from': from_lang,
  18. 'to': to_lang,
  19. 'query': text,
  20. 'token': generate_token(),
  21. 'sign': '破解后的sign值' # 需通过RSA加密生成
  22. }
  23. response = requests.post(url, headers=headers, data=data)
  24. return response.json()

四、法律与伦理边界

逆向工程需严格遵守《计算机软件保护条例》与百度服务条款。建议:

  1. 仅用于学习:破解技术应限于研究加密算法与安全机制。
  2. 避免高频请求:控制请求频率,防止触发反爬机制。
  3. 尊重知识产权:不将破解成果用于商业用途或公开传播。

五、总结与展望

百度翻译JS逆向是理解前端安全与加密技术的经典案例。通过分析混淆代码、动态参数生成及反调试机制,开发者可掌握:

  • Webpack打包代码的解析技巧。
  • 常见加密算法(HMAC、RSA)的实战应用。
  • 无头浏览器与自动化测试的集成。

未来,随着前端安全技术的演进(如WebAssembly加密),逆向工程将面临更高挑战。开发者需持续关注安全动态,平衡技术创新与合规边界。

相关文章推荐

发表评论