某翻译平台翻译接口逆向之加解密参数刨析

news2024/12/23 5:14:40

上文链接

某翻译平台翻译接口逆向之webpack学习


分析参数

加密参数: ${t}

function S(e, t) {
	return _(`client=${u}&mysticTime=${e}&product=${d}&key=${t}`)
}
function k(e, t) {
	const n = (new Date).getTime();
	return {
		sign: S(n, e),
		client: u,
		product: d,
		appVersion: p,
		vendor: g,
		pointParam: m,
		mysticTime: n,
		keyfrom: f,
		mid: h,
		screen: A,
		model: v,
		network: b,
		abtest: T,
		yduuid: t || "abcdefg"
	}
}

线上跟栈找到关键位置

fetchTextTranslateSecretKey: async({commit: e},t)=>{
	const n = "webfanyi-key-getter"
	  , a = "asdjnjfenknafdfsdfsd";
	return new Promise((t=>{
		o.A.getTextTranslateSecretKey({
			keyid: n
		}, a).then((n=>{
			0 === n.code && n.data.secretKey && (e("UPDATE_SECRET_KEY", n.data.secretKey),
			e("UPDATE_DECODE_KEY", n.data.aesKey),
			e("UPDATE_DECODE_IV", n.data.aesIv),
			t(n.data.secretKey))
		}
		)).catch((e=>{}
		))
	}
	))
}

发现新请求接口

aHR0cHM6Ly9kaWN0LnlvdWRhby5jb20vd2VidHJhbnNsYXRlL2tleQ==


逆向网址

 aHR0cHM6Ly9mYW55aS55b3VkYW8uY29tLw==


 

逆向链接

aHR0cHM6Ly9mYW55aS55b3VkYW8uY29tLyMv

逆向接口 

aHR0cHM6Ly9kaWN0LnlvdWRhby5jb20vd2VidHJhbnNsYXRlL2tleQ==

 

逆向过程 

请求方式

        GET

逆向参数

        sign 7ce3cf3d4cf7ded169f40a8562b2722b

        yduuid abcdefg 

过程分析

上文逆向链接:某翻译平台翻译接口逆向之webpack学习

可以看出该接口进行加密参数构建时候参数【${t}】=== 'asdjnjfenknafdfsdfsd'

此接口返回数据:

secretKey  ===  ${t}                  // 加密参数

aesKey      ===  t                       // AES 解密key

aesIv         === n                      // AES 解密iv

代码结构

Python

def getSign( param, key ):
    """
    获取加密参数 sign
    """
    with open( 'translation.js', 'r', encoding='utf-8', errors='ignore' ) as f:
        js_tamp = f.read()
    jsDrive = execjs.compile( js_tamp )
    data = {
        'client': param[ 'client'] ,
        'time': iTime,
        'product': param[ 'product' ],
        'key': key
    }
    sign = jsDrive.call( 'getSign', data )
    return sign
def getAesInfo():
    """
    获取加密key及解密key与iv数据
    """
    query = {
        'keyid': 'webfanyi-key-getter',
        'client': 'fanyideskweb',
        'product': 'webfanyi',
        'appVersion': '1.0.0',
        'vendor': 'web',
        'pointParam': 'client,mysticTime,product',
        'mysticTime': iTime,
        'keyfrom': 'fanyi.web',
        'mid': 1,
        'screen': 1,
        'model': 1,
        'network': 'wifi',
        'abtest': 0,
        'yduuid': '2f9fca73d004ffed88121a15b5e4b717'
    }
    key = 'asdjnjfenknafdfsdfsd'
    query[ 'sign']  = getSign( query, key )
    response = requests.get( url, headers=headers, params=query )
    if response.status_code == 200:
        result = json.loads( response.text )
        return { 'key': result['data']['secretKey'], 'aesKey': result['data']['aesKey'], 'aesIv': result['data']['aesIv'] }
    else:
        print( response )
        print( response.text )

def getTranslation( trans, keyInfo ):
    """
    请求翻译接口并对结果解密
    """
    data = {
        'i': trans,
        'from': 'auto',
        'to': '',
        'domain': 0,
        'dictResult': 'true',
        'keyid': 'webfanyi',
        'client': 'fanyideskweb',
        'product': 'webfanyi',
        'appVersion': '1.0.0',
        'vendor': 'web',
        'pointParam': 'client,mysticTime,product',
        'mysticTime': iTime,
        'keyfrom': 'fanyi.web',
        'mid': 1,
        'screen': 1,
        'model': 1,
        'network': 'wifi',
        'abtest': 0,
        'yduuid': '2f9fca73d004ffed88121a15b5e4b717',
    }
    data['sign'] = getSign( data, keyInfo['key'] )

    response = requests.post( url, headers=headers, data=data )
    if response.status_code == 200:
        with open( 'translation.js', 'r', encoding='utf-8', errors='ignore' ) as f:
            js_tamp = f.read()
        jsDrive = execjs.compile(js_tamp)

        arg = {
            't': keyInfo['aesKey'],
            'n': keyInfo['aesIv']
        }
        info = jsDrive.call('aesDecrypt', response.text, arg )
        print( info )
    else:
        print( response )
        print( response.text )

 

 结果验证

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time   : 2024/4/22 18:38
# @Author : Carey
# @File : translation.py
# @Description
import subprocess
from functools import partial
subprocess.Popen = partial(subprocess.Popen, encoding="utf-8")

import time
import json
import requests
import execjs

iTime = round( time.time()*1000 )

headers = {
    'Accept': 'application/json, text/plain, */*',
    'Accept-Encoding': 'gzip, deflate, br, zstd',
    'Accept-Language': 'en,zh-CN;q=0.9,zh;q=0.8,ja;q=0.7',
    'Content-Type': 'application/x-www-form-urlencoded',
    'Origin': 'https://fanyi.youdao.com',
    'Referer': 'https://fanyi.youdao.com/',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36',
    'Cookie': 'OUTFOX_SEARCH_USER_ID=2832382@117.22.144.72; OUTFOX_SEARCH_USER_ID_NCOO=1947820840.9198918; DICT_DOCTRANS_SESSION_ID=YWRiYTJjYmUtNmMwZC00MTA4LTgyMWItOTBmMDQ5MzUzZmI2'
}


def getSign( param, key ):
    """
    获取加密参数 sign
    """
    with open( 'translation.js', 'r', encoding='utf-8', errors='ignore' ) as f:
        js_tamp = f.read()
    jsDrive = execjs.compile( js_tamp )
    data = {
        'client': param[ 'client'] ,
        'time': iTime,
        'product': param[ 'product' ],
        'key': key
    }
    sign = jsDrive.call( 'getSign', data )
    return sign

def getAesInfo():
    """
    获取加密key及解密key与iv数据
    """
    query = {
        'keyid': 'webfanyi-key-getter',
        'client': 'fanyideskweb',
        'product': 'webfanyi',
        'appVersion': '1.0.0',
        'vendor': 'web',
        'pointParam': 'client,mysticTime,product',
        'mysticTime': iTime,
        'keyfrom': 'fanyi.web',
        'mid': 1,
        'screen': 1,
        'model': 1,
        'network': 'wifi',
        'abtest': 0,
        'yduuid': '2f9fca73d004ffed88121a15b5e4b717'
    }
    key = 'asdjnjfenknafdfsdfsd'
    query[ 'sign']  = getSign( query, key )
    response = requests.get( url, headers=headers, params=query )
    if response.status_code == 200:
        result = json.loads( response.text )
        return { 'key': result['data']['secretKey'], 'aesKey': result['data']['aesKey'], 'aesIv': result['data']['aesIv'] }
    else:
        print( response )
        print( response.text )


def getTranslation( trans, keyInfo ):
    """
    请求翻译接口并对结果解密
    """
    data = {
        'i': trans,
        'from': 'auto',
        'to': '',
        'domain': 0,
        'dictResult': 'true',
        'keyid': 'webfanyi',
        'client': 'fanyideskweb',
        'product': 'webfanyi',
        'appVersion': '1.0.0',
        'vendor': 'web',
        'pointParam': 'client,mysticTime,product',
        'mysticTime': iTime,
        'keyfrom': 'fanyi.web',
        'mid': 1,
        'screen': 1,
        'model': 1,
        'network': 'wifi',
        'abtest': 0,
        'yduuid': '2f9fca73d004ffed88121a15b5e4b717',
    }
    data['sign'] = getSign( data, keyInfo['key'] )

    response = requests.post( url, headers=headers, data=data )
    if response.status_code == 200:
        with open( 'translation.js', 'r', encoding='utf-8', errors='ignore' ) as f:
            js_tamp = f.read()
        jsDrive = execjs.compile(js_tamp)

        arg = {
            't': keyInfo['aesKey'],
            'n': keyInfo['aesIv']
        }
        info = jsDrive.call('aesDecrypt', response.text, arg )
        print( arg )
        print( info )
    else:
        print( response )
        print( response.text )



if __name__ == '__main__':
    keyInfo = getAesInfo()
    getTranslation( '你叫什么名字', keyInfo )

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1617546.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

STM32 软件I2C方式读取MT6701磁编码器获取角度例程

STM32 软件I2C方式读取MT6701磁编码器获取角度例程 📍相关篇《STM32 软件I2C方式读取AS5600磁编码器获取角度例程》🌿《Arduino通过I2C驱动MT6701磁编码器并读取角度数据》🔰MT6701芯片和AS5600从软件读取对比,只是读取的寄存器和…

掉落回弹问题(C语言)

一、N-S流程图&#xff1b; 二、运行结果&#xff1b; 三、源代码&#xff1b; # define _CRT_SECURE_NO_WARNINGS # include <stdio.h>int main() {//初始化变量值&#xff1b;float b 100;float sum 0;int i 0;//运算&#xff1b;for (i 1; i < 10; i){//运算&…

2024平替电容笔买哪个品牌好?iPad电容笔全能榜单热门款TOP5分享!

2024年&#xff0c;随着科技的不断发展和消费者对生活品质的追求&#xff0c;电容笔作为一种创新的无纸化工具&#xff0c;逐渐走进人们的生活和工作中。然而&#xff0c;在电容笔市场的繁荣背后&#xff0c;也隐藏着品质良莠不齐的现象。众多品牌为了追求利润&#xff0c;推出…

用Python将原始边列表转换为邻接矩阵

&#x1f47d;发现宝藏 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 在图论和网络分析中&#xff0c;图是一种非常重要的数据结构&#xff0c;它由节点&#xff…

美业连锁多门店收银系统源码-美业系统iPad端使用前准备工作分享

美业管理系统源码 博弈美业SaaS系统 连锁多门店美业收银系统源码 多门店管理 / 会员管理 / 预约管理 / 排班管理 / 商品管理 / 促销活动 PC管理后台、手机APP、iPad APP、微信小程序 1、 购买一台iPad并安装应用 请使用系统版本在10.0.0或以上的苹果iPad&#xff08;建议购…

node-sass安装失败解决

老项目安装node-sass4.14.1一直失败 "node-sass": "^4.14.1",报错环境变量Path 中没有 python2.7 gyp verb check python checking for Python executable "python2.7" in the PATH安装python2.7,然后设置npm config set python C:\Python27 …

HART协议

一、HART协议 HART 协议采用美国电话通讯系统Bell202频移键控(FSK)标准&#xff0c;在4&#xff5e;20mA的模拟0.5mA的正弦波&#xff0c;波特率是 1200bps。因为所叠加的正弦信号平均值为0&#xff0c;而且相位连续频移键控技术要求在波特率为 1200Hz的数据位 1 和 0 的边界的…

【CVPR2024】文本到图像的行人再识别中的噪声对应学习

这篇论文的标题是《Noisy-Correspondence Learning for Text-to-Image Person Re-identification》,作者是来自中国四川大学、英国诺森比亚大学、新加坡A*STAR前沿人工智能研究中心和高性能计算研究所的研究人员。论文主要研究了文本到图像的行人再识别(Text-to-Image Person…

mybatis拦截器和mybatis plus的拦截器

MyBatis拦截器和MyBatis Plus的拦截器在概念上是一致的&#xff0c;都是通过拦截器机制对MyBatis的SQL执行过程进行扩展和控制&#xff0c;但是在实现细节和功能上有所差异。MyBatis Plus的拦截器是建立在MyBatis拦截器基础之上&#xff0c;通过封装简化了开发流程&#xff0c;…

动物解剖流程3d仿真展示动画支持反复观看和使用

在兽医专业的广袤领域中&#xff0c;动物解剖学作为基石学科&#xff0c;为组织胚胎学、生理学、病理解剖学、外科手术学、临床诊断学等科研教学提供了坚实的基础。而如今&#xff0c;随着科技的飞速发展&#xff0c;我们迎来了一个全新的学习时代——3D数字动物解刨虚拟仿真实…

ESP32-Thonny 拍摄图片到SD卡

前言&#xff1a; 代码运行在Thonny 添加main.py到单片机中&#xff1a; 可以先运行一下试试&#xff1a;会输出以下信息&#xff1a; 没有问题的话&#xff08;SD卡挂载成功&#xff0c;摄像头初始化成功&#xff09;运行一次主程序后&#xff0c;闪光灯会闪烁一下。 代码&…

autodesk系列软件安装错误1603,手动安装Autodesk Desktop Licensing Service之后,启动服务提示错误1067

一般Autodesk Desktop Licensing Service这个服务没安装或者不正常会导致autodesk系列软件安装错误1603或者其他报错。 手动安装Autodesk Desktop Licensing Service之后&#xff0c;启动服务提示错误1067&#xff0c; 解决方法如下 打开autoremove点击扩展功能&#xff0c;输…

一维递归:递去

示例&#xff1a; /*** brief how about recursive-forward-1? show you here.* author wenxuanpei* email 15873152445163.com(query for any question here)*/ #define _CRT_SECURE_NO_WARNINGS//support c-library in Microsoft-Visual-Studio #include <stdio.h>…

李廉洋:4.23黄金休市之后一蹶不振,原油小幅度上涨。晚间策略!

美国利率居高不下&#xff0c;降低了黄金等非收益资产的吸引力。今天的经济数据可能会影响美联储的利率决定&#xff0c;从而可能影响金价走势。美国货币政策对黄金价格的影响&#xff0c;美元走强以及对美国利率持续高企的预期&#xff0c;正对金价施加额外压力。美联储对持续…

​Gu‘reum 工作室在The Sandbox推出 2024 年农历新年活动!

通过区块链游戏分享韩国文化并建立社区&#xff01; 去年 12 月&#xff0c;Gurenum 工作室 在The Sandbox 元宇宙上发起了 2023 年年末 Lan Party 直播活动。 https://sandboxgame.medium.com/gureum-studio-hosts-a-year-end-lan-party-in-the-sandbox-metaverse-b9a3fc6e7b9…

我的世界服务器设计思路应该是什么样?

我的世界服务器设计思路可以从这4个方面展开&#xff1a;1.选择你喜欢的东西&#xff1b;2.认识你的极限&#xff1b;3.注入新鲜元素&#xff1b;4.让服务器变得享受且有回报。 1.选择你喜欢的东西 设计服务器的首要规则是创造一些你自己会积极享受玩的东西。没有人愿意花费宝…

js some对比forEach

some&#xff1a;return true可以停止循环 forEach&#xff1a;return true无法停止循环 <!DOCTYPE html> <html ng-app"my_app"><head><script type"text/javascript">const array [10, 20, 30];const targetValue 10;// 检测…

2010年认证杯SPSSPRO杯数学建模C题(第一阶段)高校图书馆的智能服务全过程文档及程序

2010年认证杯SPSSPRO杯数学建模 C题 高校图书馆的智能服务 原题再现&#xff1a; 图书馆源于保存记事的习惯。图书馆是为读者在馆内使用文献而提供的专门场所。而高校的图书馆为教学和科研服务&#xff0c;具有服务性和学术性强的特点。   现在的高校图书馆存在着许多不良的…

刷题训练之二分查找

> 作者&#xff1a;დ旧言~ > 座右铭&#xff1a;松树千年终是朽&#xff0c;槿花一日自为荣。 > 目标&#xff1a;熟练掌握二分查找算法 > 毒鸡汤&#xff1a;学习&#xff0c;学习&#xff0c;再学习 ! 学&#xff0c;然后知不足。 > 专栏选自&#xff1a;刷题…