当前位置: 首页 > news >正文

【python 逆向分析某有道翻译】分析有道翻译公开的密文内容,webpack类型,全程扣代码,最后实现接口调用翻译,仅供学习参考

文章日期:2024.12.24

使用工具:Python,Node.js

逆向类型:webpack类型

本章知识:sign模拟生成,密文的解密(webpack),全程扣代码,仅供学习参考

文章难度:低等(没难度)

文章全程已做去敏处理!!!  【需要做的可联系我】 

AES解密处理(直接解密即可)(crypto-js.js 标准算法):​​​​​​在线AES加解密工具

仅供学习!!仅供测试!!仅供参考!!

声明:本文逆向的所有内容文件仅供学习,从网站扣的代码不会公开,但博主自己写的代码内容将会公开在文章最底部,望谅解!!!

先看成品图,效果就是这个样子,可以直接翻译,支持多种不同语言(没有试过高并发)

给大家提前讲一下,比较简单的内容我将会快速讲解,不会很细,小白可能会不懂,不懂只能去看我之前的逆向文章,或者留言都可以,有志向的人,一起学习发展。

1、打开某某网站(使用文章开头的AES在线工具解密):

OI1Y7IeHDHWVFvw4Yo05CnrGO+zxG4b5OFpdZvnuG2WEWj/TsHjdLb2bzhvR/PvI

2、【sign】我们打开页面后随便输入中文进行翻译,然后找到刻意的接口,我们打开看一下,没想到一上来就有个sign,而且返回的数据还是密文

3、【sign】别着急,我们把这个接口的请求先转移到python文件内,然后经过我不断的测试,发现他的cookie必须要加【OUTFOX_SEARCH_USER_ID】参数,而且这个参数是通过服务器返回的,而且有效期为20年,我决定直接生成,我从来没见过一个cookie有效期为20年的,纯扯淡,他一定不是在服务器存储着,所以我们直接随机生成即可

其次是载荷data里【from】【to】这两个参数我就不多介绍了,看注释即可。

剩下的就是sign和一个时间戳,直接全局搜索

4、【sign】全局搜索接口的链接路径,发现搜索到了两个,直接点进去都打上断点,然后再次触发翻译

5、【sign】断住了,看图说话,直接跟进去。

6、【sign】跟进来后发现了sign,而且加密方法就在头上。这就不用多说了,口算就能知道是md5加密。

7、【sign】直接用 python 模拟出来,标准的MD5,就不用讲太多了

8、【密钥】接下来看一下那个密钥,这个也不用多说,他是另一个请求返回的,而且这个请求里也有一个sign,用的也是md5加密,只是加密的内容有点不一样,直接看结果吧,没什么难度

9、【代码整理】我将代码进一步整合,方便下一步的调试

10、【解密密文】接下来重点来了,解密返回的密文,本次全程扣代码,文章结尾我将会附上模拟解密的代码,并非扣下来的代码,供大家参考学习

注意:文章结尾的代码并非官网扣下来的,放心测试学习!!!

11、遇到这种密文解密其实也没多难,我接下来用两种方法帮大家找到这个加密位置。

12、【找加密位置1】我们找到返回密文的接口,复制一下链接路径,然后ctrl+shift+f全局搜索,搜索到后,对第二个打上断点,第一个不用打断点,因为第一个很明显,他的链接路径和我要找到不一样,直接排除

13、【找加密位置1】我们打上断点后,随便输入内容使其触发翻译,然后会自动断住,这时候我们就一步一步跟进

14、【找加密位置1】大约跟进了5次左右,看到了一个加密方法,虽然目前没有看到密文在此处解密,但我的职业素养告诉我,“有疑问?直接打上断点好了”,记住,做逆向,只要看到疑似加解密的位置,直接打断点就好,这是找解密位置或加密位置的一种方法。我们直接打上断点,然会放开运行

14、【找加密位置2】使用HOOK大法(配合油猴插件会更方便好用),将HOOK代码直接在控制台执行,然会再次输入内容触发翻译,你会发现断住了(HOOK代码在文章结尾)

HOOK原理:首先我们要知道他解密密文要做什么事情,像这种一般都是字典传输,那么他在解密内容后,一定会执行【JSON.parse】,将字符串的字典转为格式化后的字典,如果他不执行转换,那他就读取不了内容,所以我们用这个HOOK代码进行拦截,相当于这个HOOK代码就是中间商,你所做的事情要经过这个中间商后,这个中间商在觉定是拦截还是放行,这个中间商把别人替代了,所以你不得不经过他,这就是大概的HOOK的原理(有些场景的HOOK需要搭配油猴)

15、【找加密位置2】我们一边放行一遍观察他的内容参数,才走了几步就看到了解密后的密文数据,我们在堆栈里看他上一步的操作,看看都干了什么,点击上一个堆栈,嘿,成功找到加密位置。

16、【解密密文】接下来我们开始解密,我们将他的解密函数在控制台运行,他会自动暴露源函数,这时我们点进去

17、【解密密文】点击进来后,可以看到他解密的方法,我们直接转移到本地js文件内,然会尝试运行看缺少什么,发现缺少【l】函数,我们直接去源代码里找

18、【解密密文】找到了,直接看图,直接复制到文件内,然后再次运行,发现缺少a函数,我们直接去找

19、【解密密文】我们对当时找到的参数位置的a打上断点,然后刷新页面,会发现断住了,然后我们控制台输出一下,然后点击进去,会发现他是一个webpack加载器文件,直接把当前js全部复制到js内

20、【解密密文】复制到了本地js文件内,运行后发现缺少两个环境,我直接补上了,就不细讲了。然后我看出来这个加载器的主函数是a,所以直接把他的主运行函数导出全局,让外部可以访问,既然a已经被导出为jzq了,那么下面的两个函数也有修改一下,都改为jzq即可,然后再次运行看看缺少什么

21、【解密密文】运行发现报错了,找到报错的行,然后打印一下他运行什么导致的报错,打印结果发现他缺少方法,加载器没有找到这个方法,无法调用,那我们直接去找

22、【解密密文】我们回到浏览器控制台,运行一下图片里的函数,然后随便打开任意字段,点击链接进到加载器的函数里

23、【解密密文】进来后,我们直接搜索缺少的方法,找到后,直接放入到本地js里,可以让加载器读取,但要注意了,看下面第二张图,你的加载器需要修改一下代码,否则他不会读取你导入的方法

24、【解密密文】这次运行成功了,他已经能正常读取到91565了,但他缺少另一个方法,我们继续去搜索,一种重复这种方法。由于太多,我就不一个一个尝试了,我直接把全部都复制过来

25、【解密密文】我把所有的都复制过来,运行后发现没有问题了,成功解密了。一般情况不要无脑全部复制,这会导致卡顿,具体怎么复制还是根据大家的个人习惯

26、【全部代码整理】直接看成品

注意:没有用扣下来的代码做解密是因为文件量太大,而且扣代码是教程并不是一定要用扣下来的代码,要懂得变通

【AES-128-CBC.js】 js文件,用于解密,扣下来的代码不能用于公开,只能给大家展示模拟出来的源代码

// 导入 crypto 模块
const crypto = require('crypto');
// 安装 express 服务包
// npm install express --save
const express = require('express');const app = express();
app.use(express.json());// AES-128-CBC 解密函数
function aesDecrypt(ciphertext, key, iv) {try {// 创建解密器const decipher = crypto.createDecipheriv('aes-128-cbc', key, iv);// 执行解密操作let decrypted = decipher.update(ciphertext, "base64", "utf-8");decrypted += decipher.final('utf8');return decrypted;} catch (error) {console.error('解密失败:', error);}
}function generateMD5Hash(input) {// 创建 MD5 哈希const hash = crypto.createHash('md5');// 更新哈希对象内容hash.update(input);// 输出结果为 Buffer 对象return hash.digest(); // 默认是二进制 Buffer 格式
}app.post('/', (req, res) => {const {text, key, iv} = req.body;decrypt_data = aesDecrypt(text,generateMD5Hash(key),generateMD5Hash(iv))console.log('【解密结果】 - ',decrypt_data)res.status(200).json({code: 1, data: JSON.parse(decrypt_data)});
});// 检测服务是否已打开
app.get('/run', (req, res) => {res.status(200).json({code: 1});
});app.listen(4000, () => {console.log('Node.js 服务监听端口 127.0.0.1:4000');
});

【翻译请求.py】运行此代码前,请先运行js文件,js文件运行后会启动接口,python要调用接口实现解密

import json
import random
import requests
import time
import hashlib
import base64# base64 解密
def base64_decode(str):# print(base64.b64decode('MTIz'.encode()))return base64.b64decode(str).decode('utf-8')
# 这个是链接被base64加密了,此步骤只用于去敏,无其他作用
URL = base64_decode('aHR0cHM6Ly9kaWN0LnlvdWRhby5jb20=')class youdao:# MD5 - SHA3_512 加密def md5_encrypt(self, string):''''md5', 'sha1', 'sha224', 'sha256', 'sha384', 'sha512','blake2b', 'blake2s','sha3_224', 'sha3_256', 'sha3_384', 'sha3_512','shake_128', 'shake_256''''md5 = hashlib.md5()md5.update(string.encode('utf-8'))return md5.hexdigest()# 获取 secretKey / aesKey / aesIvdef obtain_key(self):'''获取 secretKey / aesKey / aesIv'''headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36",}url = URL + "/webtranslate/key"# 13位时间戳mysticTime = time.time()# 立马的key是官网固定的sign = self.md5_encrypt(f'client=fanyideskweb&mysticTime={mysticTime}&product=webfanyi&key=asdjnjfenknafdfsdfsd')params = {"keyid": "webfanyi-key-getter","sign": sign,"client": "fanyideskweb","product": "webfanyi","pointParam": "client,mysticTime,product","mysticTime": f"{mysticTime}",}response = requests.get(url, params=params, headers=headers).json()['data']# sign密钥self.secretKey = response['secretKey']# key密钥self.aesKey = response['aesKey']# iv向量self.aesIv = response['aesIv']# 翻译请求 返回密文def translate(self, text, froms, tos):'''执行翻译请求,返回密文'''headers = {"Accept": "application/json, text/plain, */*","Content-Type": "application/x-www-form-urlencoded","Referer": "1","User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36",}# 13位时间戳mysticTime = time.time()sign = self.md5_encrypt(f'client=fanyideskweb&mysticTime={mysticTime}&product=webfanyi&key={self.secretKey}')# 随机,伪装一下cookies = {"OUTFOX_SEARCH_USER_ID": f"-{random.randint(10000000, 99999999)}@{random.randint(1, 255)}.{random.randint(1, 255)}.{random.randint(1, 255)}.{random.randint(1, 255)}"# 防封,刷新一次可以使用20年有效期}url = URL + "/webtranslate"data = {"i": text,# "from": "en",  # 输入日文  en英文 ja日文  fr法语 zh-CHS中文 de德语 es西班牙语# "to": "zh-CHS",  # 翻译为中文"dictResult": "true","keyid": "webfanyi","sign": sign,"client": "fanyideskweb","product": "webfanyi","appVersion": "1.0.0","vendor": "web","pointParam": "client,mysticTime,product","mysticTime": f"{mysticTime}","keyfrom": "fanyi.web",}if froms:data['from'] = fromsif tos:data['to'] = tosresponse = requests.post(url, headers=headers, cookies=cookies, data=data).textself.ciphertext = response.strip()# AES-128-CBC 解密def decrypt_AES_128_CBC(self):'''AES-128-CBC 解密'''import requestsheaders = {'Content-Type': 'application/json'}data = {"text": self.ciphertext, "key": self.aesKey, "iv": self.aesIv}url = "http://127.0.0.1:4000/"response = requests.post(url, headers=headers, data=json.dumps(data)).json()text = ''if response['code'] == 1:for data_list in response['data']['translateResult']:text += data_list[0]['tgt']print('----- 翻译结果 -----\n' + text + '\n')main = youdao()
# 获取 secretKey / aesKey / aesIv 只需要运行一次即可,经过我的分析,他每天返回的key都不一样
main.obtain_key()
# 发送翻译请求  # 输入日文  en英文 ja日文  fr法语 zh-CHS中文 de德语 es西班牙语
# froms:当前输入的是什么语言  输入None则自动识别
# tos:要翻译为什么语言    输入None则自动识别
main.translate('你是谁,你叫什么名字?\n怎么称呼大哥\n我的名字是哈哈,请叫我哈哈哥', froms=None, tos=None)   # 自动识别 翻译为 英文(默认)
# 解密请求内容
main.decrypt_AES_128_CBC()

【HOOK代码】

// 【json.parse 解密对象专用  JSON字符串转换为JS对象】
(function () {var parse_ = JSON.parse;JSON.parse = function (arg) {console.log("[J] - 正在执行[*json.parse] -> ", arg);debugger;return parse_(arg);  // 不改变原来的执行逻辑}
})();

相关文章:

【python 逆向分析某有道翻译】分析有道翻译公开的密文内容,webpack类型,全程扣代码,最后实现接口调用翻译,仅供学习参考

文章日期:2024.12.24 使用工具:Python,Node.js 逆向类型:webpack类型 本章知识:sign模拟生成,密文的解密(webpack),全程扣代码,仅供学习参考 文章难度:低等(没…...

tensorflow_probability与tensorflow版本依赖关系

参考:Tensorflow Probability 与 TensorFlow 的版本依赖关系_tensorflow与tensorflow-probability对应版本的网址-CSDN博客 tensorflow2.10对应tensorflow_probability0.18.0,安装命令:pip install tensorflow_probability0.18.0 版本对应关…...

构建安全的用户认证系统:PHP实现

构建安全的用户认证系统:PHP实现 用户认证是任何Web应用的重要组成部分,确保只有授权用户才能访问特定资源。构建一个安全的用户认证系统需要考虑多种因素,包括密码存储、会话管理和防止常见gongji。本文将介绍如何使用PHP实现一个安全的用户…...

VMD-SSA-BiLSTM、VMD-BiLSTM、BiLSTM时间序列预测对比

VMD-SSA-BiLSTM、VMD-BiLSTM、BiLSTM时间序列预测对比 目录 VMD-SSA-BiLSTM、VMD-BiLSTM、BiLSTM时间序列预测对比预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.MATLAB实现VMD-SSA-BiLSTM、VMD-BiLSTM、BiLSTM时间序列预测对比; 2.单变量时间序列预测 就是先vmd把变…...

天融信网络架构安全实践

1、医院客户想通过等保2.0三级,推荐哪几款网络安全产品?(至少6个) TopSAg(运维安全审计系统) TopNAC(网络准入系统) TopEDR(终端威胁防御系统) TDSM-SBU(存储备份一体机…...

腾讯云云开发 Copilot具有以下优势

与其他代码生成工具相比,腾讯云云开发 Copilot具有以下优势: 功能特性方面 自然语言处理能力更强:许多代码生成工具仅能实现简单的代码补全或根据特定模板生成代码,而云开发 Copilot可直接通过自然语言生成完整的小程序/web全栈…...

electron-vite【实战系列教程】

创建项目 安装必要的插件 UI 库 element-plus npm install element-plus --save 安装 element-plus 图标 npm install element-plus/icons-vue 安装插件 – 自动注册组件 vs 自动导入框架方法 npm install -D unplugin-vue-components unplugin-auto-import electron.vite.conf…...

【微信小程序】微信小程序中的异步函数是如何实现同步功能的

在微信小程序中,虽然很多 API 都是异步的,但可以通过一些方法来实现类似同步的功能。以下是几种常见的方法: 1. 使用 async/await async/await 是 ES2017 引入的语法糖,它基于 Promise 来实现异步操作的同步化写法。 示例代码 …...

贪心算法(三)

目录 一、k次取反后最大化的数组和 二、优势洗牌 三、最长回文串 四、增减字符串匹配 一、k次取反后最大化的数组和 k次取反后最大化的数组和 贪心策略&#xff1a; 解题代码&#xff1a; class Solution { public:int largestSumAfterKNegations(vector<int>&am…...

uniApp打包H5发布到服务器(docker)

使用docker部署uniApp打包后的H5项目记录&#xff0c;好像和VUE项目打包没什么区别... 用HX打开项目&#xff0c;首先调整manifest.json文件 开始用HX打包 填服务器域名和端口号~ 打包完成后可以看到控制台信息 我们可以在web文件夹下拿到下面打包好的静态文件 用FinalShell或…...

【AI落地应用实战】篡改检测技术前沿探索——从基于检测分割到大模型

在数字化洪流席卷全球的当下&#xff0c;视觉内容已成为信息交流与传播的核心媒介&#xff0c;然而&#xff0c;随着PS技术和AIGC技术的飞速发展&#xff0c;图像篡改给视觉内容安全带来了前所未有的挑战。 本文将探讨篡改检测技术的现实挑战&#xff0c;分享篡改检测技术前沿…...

使用 VSCode 学习与实践 LaTeX:从插件安装到排版技巧

文章目录 背景介绍编辑器编译文件指定输出文件夹 usepackagelatex 语法列表插入图片添加参考文献 背景介绍 最近在写文章&#xff0c;更喜欢latex的论文引用。然后开始学习 latex。 编辑器 本文选择vscode作为编辑器&#xff0c;当然大家也可以尝试overleaf。 overleaf 有网…...

使用scrapy框架爬取微博热搜榜

注&#xff1a;在使用爬虫抓取网站数据之前&#xff0c;非常重要的一点是确保遵守相关的法律、法规以及目标网站的使用条款。 &#xff08;最底下附下载链接&#xff09; 准备工作&#xff1a; 安装依赖&#xff1a; 确保已经安装了Python环境。 使用pip安装scrapy&#xff…...

瑞吉外卖项目学习笔记(七)新增菜品、(批量)删除菜品

瑞吉外卖项目学习笔记(一)准备工作、员工登录功能实现 瑞吉外卖项目学习笔记(二)Swagger、logback、表单校验和参数打印功能的实现 瑞吉外卖项目学习笔记(三)过滤器实现登录校验、添加员工、分页查询员工信息 瑞吉外卖项目学习笔记(四)TableField(fill FieldFill.INSERT)公共字…...

es快速扫描

介绍 Elasticsearch简称es&#xff0c;一款开源的分布式全文检索引擎 可组建一套上百台的服务器集群&#xff0c;处理PB级别数据 可满足近实时的存储和检索 倒排索引 跟正排索引相对&#xff0c;正排索引是根据id进行索引&#xff0c;所以查询效率非常高&#xff0c;但是模糊…...

前端对页面数据进行缓存

页面录入信息&#xff0c;退出且未提交状态下&#xff0c;前端对页面数据进行存储 前端做缓存&#xff0c;一般放在local、session和cookies里面&#xff0c;但是都有大小限制&#xff0c;如果页面东西多&#xff0c;比如有上传的图片、视频&#xff0c;浏览器会抛出一个Quota…...

leetCode322.零钱兑换

题目&#xff1a; 给你一个整数数组coins,表示不同面额的硬币&#xff1b;以及一个整数amount,表示总金额。 计算并返回可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额&#xff0c;返回-1。 你可以认为每种硬币的数量是无限的。 示例1&#xff1…...

jsp-servlet开发

STS中开发步骤 建普通jsp项目过程 1.建项目&#xff08;非Maven项目&#xff09; new----project----other----Web----Dynamic Web Project 2.下载包放到LIB目录中,如果是Maven项目可以自动导包&#xff08;pom.xml中设置好&#xff09; 3.设置工作空间&#xff0c;网页…...

从零玩转CanMV-K230(7)-I2C例程

文章目录 前言一、IIC API二、示例总结 前言 K230内部包含5个I2C硬件模块&#xff0c;支持标准100kb/s&#xff0c;快速400kb/s模式&#xff0c;高速模式3.4Mb/s。 通道输出IO配置参考IOMUX模块。 一、IIC API I2C类位于machine模块下。 i2c I2C(id, freq100000) 【参数】…...

n阶Legendre多项式正交性的证明

前言 在《n次Legendre(勒让德)多项式在区间(-1, 1)上根的分布及证明》这篇文章中&#xff0c;我们阐述了Legendre多项式在 [ − 1 , 1 ] [-1,1] [−1,1]上的根分布情况并给出了证明。本文将证明Legendre多项式在 [ − 1 , 1 ] [-1,1] [−1,1]上的正交性质。 正交多项式的定义…...

HarmonyOS NEXT - Dialog 和完全自定义弹框

demo 地址: https://github.com/iotjin/JhHarmonyDemo 组件对应代码实现地址 代码不定时更新&#xff0c;请前往github查看最新代码 在demo中这些组件和工具类都通过module实现了&#xff0c;具体可以参考HarmonyOS NEXT - 通过 module 模块化引用公共组件和utils HarmonyOS NE…...

内容与资讯API优质清单

作为开发者&#xff0c;拥有一套API合集是必不可少的。这个开发者必备的API合集汇集了各种实用的API资源&#xff0c;为你的开发工作提供了强大的支持&#xff01;无论你是在构建网站、开发应用还是进行数据分析&#xff0c;这个合集都能满足你的需求。你可以通过这些免费API获…...

开源 JS PDF 库比较

原文查看&#xff1a;开源JavaScript PDF Library对比 对于需要高性能、复杂功能或强大支持处理复杂 PDF 的项目&#xff0c;建议选择商业​​ PDF 库, 如ComPDFKit for Web。但是&#xff0c;如果您的目标只是在 Web 应用程序中显示 PDF&#xff0c;则可以使用几个可靠的开源…...

AnaPico信号源在通信测试中的应用案例

AnaPico信号源在通信测试中的应用案例广泛&#xff0c;涉及多种通信技术和测试需求。以下是一些具体的应用实例&#xff1a; 1. APPH系列信号源分析仪&#xff08;相位噪声分析仪&#xff09; APPH系列是一款高性能相位噪声分析仪和VCO测试仪&#xff0c;其不同型号的频率范围…...

《智启新材:人工智能重塑分子结构设计蓝图》

在当今科技飞速发展的时代&#xff0c;新材料的研发宛如一场激烈的竞赛&#xff0c;而人工智能&#xff08;AI&#xff09;作为一匹黑马&#xff0c;正以前所未有的速度和力量驰骋于这片赛场&#xff0c;为新材料的分子结构设计带来了革命性的突破&#xff0c;成为推动行业发展…...

进阶岛-L2G5000

茴香豆&#xff1a;企业级知识库问答工具 茴香豆本地标准版搭建 环境搭建 安装茴香豆 知识库创建 测试知识助手 Gradio UI 界面测试...

单点登录平台Casdoor搭建与使用,集成gitlab同步创建删除账号

一&#xff0c;简介 一般来说&#xff0c;公司有很多系统使用&#xff0c;为了实现统一的用户名管理和登录所有系统&#xff08;如 GitLab、Harbor 等&#xff09;&#xff0c;并在员工离职时只需删除一个主账号即可实现权限清除&#xff0c;可以采用 单点登录 (SSO) 和 集中式…...

PaddlePaddle飞桨Linux系统Docker版安装

PaddlePaddle飞桨Linux系统Docker版安装 最近学习和了解PP飞桨&#xff0c;一切从安装开始。官网的安装教程很详细&#xff1a; https://www.paddlepaddle.org.cn/install/quick?docurl/documentation/docs/zh/install/docker/linux-docker.html 记录我在安装过程中遇到的问题…...

一款基于.NET开发的简易高效的文件转换器

前言 今天大姚给大家分享一款基于.NET开发的免费&#xff08;GPL-3.0 license&#xff09;、简易、高效的文件转换器&#xff0c;允许用户通过Windows资源管理器的上下文菜单来转换和压缩一个或多个文件&#xff1a;FileConverter。 使用技术栈 ffmpeg&#xff1a;作为文件转换…...

Spring Boot教程之三十一:入门 Web

Spring Boot – 入门 Web 如今&#xff0c;大多数应用程序都需要模型-视图-控制器(MVC) 架构来满足各种需求&#xff0c;例如处理用户数据、提高应用程序效率、为应用程序提供动态特性。它主要用于构建桌面图形用户界面 (GUI)&#xff0c;但现在越来越流行用于构建基于 Web 的…...