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

【爬虫逆向案例】某道翻译js逆向—— sign解密

声明:本文只作学习研究,禁止用于非法用途,否则后果自负,如有侵权,请告知删除,谢谢!

【爬虫逆向案例】某道翻译js逆向—— sign解密

  • 1、前言
  • 2、步骤
  • 3、源码
  • 4、号外

1、前言

相信各位小伙伴在写爬虫的时候经常会遇到这样的情况,一些需要携带的参数一直在变化,今天逆向的这个网站某道翻译也如此:

在这里插入图片描述
在这里插入图片描述
可以发现变的就两个参数,一个 sign,一个是 mysticTime,mysticTime 一看就是时间戳,所以只要逆向 sign 参数就行了。

2、步骤

可以直接全局搜索 sign:,加一个冒号可能好搜一点。搜索返回的结果比较少,多的话就每个sign都打上断点,点击翻译看看停在哪里。如果实在是太多了,就采用跟栈的方法,准确无误,慢慢的,我们找到了 sign 的位置:

在这里插入图片描述

t 是个时间戳,方法就是 (new Date).getTime()。e 是个固定值 "fsdsogkndfokasodnaso",h 函数传入了 t 和 e 后就生成了 sign,进入 h 函数,发现就在上面。而 d 和 u 这两个参数也是固定的。并且 h 函数里面有调用了一个 v 函数,进入 v 函数,原来 v 函数也在上面。这 v 函数太熟悉了啊,标准的 MD5 加密。

整理一下完整的 js 代码就如下图所示:

在这里插入图片描述

测试完没问题后,就可以封装为 Python 进行请求了,如下图:

在这里插入图片描述

现在可以开始编写爬虫程序,写完运行一下,发现返回的不是翻译后的内容,而是一串字符,那就需要我们来解密一下了:

在这里插入图片描述
我们用跟栈的方法看密文在哪里出现的和在哪里发生了变化,一步一步往下跟,最先调用的函数放在最下面,我们只需要跟到明文出现的那一刻就行了。

我们先复制请求的 URL:

在这里插入图片描述

切换到源代码,在XHR/提取断点把刚才复制的网址加上去,重新点一下翻译

在这里插入图片描述
可以看到这个 send 就是发请求,现在主要要找返回的数据,我们一步步进入下一个函数调用看看

在这里插入图片描述
不过一会咱们可以看见,咱们刚才爬虫请求返回的字符出现了,接下来咱们要注意看了,因为要开始处理这个返回的字符串

在这里插入图片描述
跟到这边的话,可以发现在这字符串成功翻译出来了,如图所示:

在这里插入图片描述

可以看到起作用的是这个 decodeData ,我们进入那个 js 文件

在这里插入图片描述
把其他断点取消,这边打上断点,重新翻译一下,一步一步往下跟,我们只需要跟到明文出现的那一刻就行了。
在这里插入图片描述
到 t 的时候还是一串字符串,继续往下走
在这里插入图片描述
可以看到到 s 的时候已经翻译出来了

在这里插入图片描述
我们把代码扣下来放到 js 文件中去执行应该就差不多了
在这里插入图片描述
看到了 r.a.createDecipheriv,就可以用 node 中内置的加密库 crypto 库去执行,当然也可以硬扣,就是有点费时间,而且还可能出现各种报错。

运行报错缺 g ,去代码再抠出来,记得 r.a.createHash("md5").update(e).digest() 改为 node 中内置的加密库 crypto 库:
在这里插入图片描述
在这里插入图片描述

运行报错缺了 o ,直接把 o 复制进来,
在这里插入图片描述
在这里插入图片描述

再次运行报错没有 e.alloc 函数 ,这就需要补充一点 node.js 的相关知识了:

逆向改写知识补充之 Node.js
Buffer.alloc() 方法:用于创建指定大小的新缓冲区对象。
此方法比 Buffer.alloconsafe() 方法慢,但它确保新创建的 Buffer 实例永远不会包含可能敏感的旧信息或数据。
语法:Buffer.alloc(size, fill, encoding)
参数三个参数:

  • 大小:指定缓冲区的大小。
  • 填充:为可选参数,指定填充缓冲区的值。其默认值为 0。
  • 编码:如果缓冲区值是字符串,它是指定值的可选参数。其默认值为‘utf8’。

返回值:

  • 这个方法返回一个新的指定大小的初始化缓冲区。
  • 如果给定的大小不是数字,将引发类型错误。

故我们只需要修改 js 代码为如下:

function data(t) {// const a = e.alloc(16, g(o))//     , c = e.alloc(16, g(n))const a = Buffer.alloc(16, g(o)), c = Buffer.alloc(16, g(n)), i = crypto.createDecipheriv("aes-128-cbc", a, c);//, i = r.a.createDecipheriv("aes-128-cbc", a, c);let s = i.update(t, "base64", "utf-8");return s += i.final("utf-8"),s
}

再次运行,缺少 n ,返回复制补到 js 代码中:
在这里插入图片描述
最后咱们的 js 代码如下,测试之后,确实没有问题,直接用 Python 封装起来:

const crypto = require('crypto')
const o = 'ydsecret://query/key/B*RGygVywfNBwpmBaZg*WT7SIOUP2T0C9WHMZN39j^DAdaZhAnxvGcCY6VYFwnHl';
const n = 'ydsecret://query/iv/C@lZe2YzHtZ2CYgaXKSVfsb7Y4QWHjITPPZ0nQp87fBeJ!Iv6v^6fvi2WN@bYpJ4';function data(t) {const a = Buffer.alloc(16, g(o)), c = Buffer.alloc(16, g(n)), i = crypto.createDecipheriv("aes-128-cbc", a, c);//, i = r.a.createDecipheriv("aes-128-cbc", a, c);let s = i.update(t, "base64", "utf-8");return s += i.final("utf-8"),s
}function g(e) {return crypto.createHash("md5").update(e).digest()// r.a.createHash("md5").update(e).digest()
}text = 'Z21kD9ZK1ke6ugku2ccWu4n6eLnvoDT0YgGi0y3g-v0B9sYqg8L9D6UERNozYOHqnYdl2efZNyM6Trc_xS-zKtfTK4hb6JP8XwCzNh0avc8qItQUiIU_4wKKXJlIpvMvfKvJaaZzaX6VEtpkr2FdkfoT_Jgbm2GRSVj3r40autIdlImENG8hC0ZH4ww7utwuTt3Oo_ZpXg0BSq9wePSAB75-ChkiGKF9HTIPeCl2bl84SBD1XDfFCZpkKQhecYSs0JLoXOqP2ltavxRrg58Hp1q5uIgZZ_Oo2-Jmd-t1r4es40drcAq5bjmS62M2VJF8D6ojtOh9JTfNwgzD3CxYn-Pd7-TgHMyNEJEkFXTAyxzpjlFqtrCYDE3SZUYlENkqsL8Wrra1hM-1nTfiB-BLcWAdRBynNpP5_54aq_-GBsq8bB_9yEX5ovzDB4_Ry_spVVuUnb39iplMHCdCnjOD3ngiIDbl9SUz-9npjBX05ZYRdPmFPAl424qdoaxeVqnVoH8jQFPZVqaHMzu4mJg0SICDWFH7GP1zqGRbXd3ESjT_iBInl3gICt2XVuhh_nubcELkTEC6xbqEDRQkPUNMpzXJHjcvsLHtcmSW0S9F0445ho9kT2qZYdMBC3Fs0OaHpUtFu77gZpQn7sGiqh8VliXIcUtfvvop-1c-Vu5QjfUbLn2-s5POR9fGYG6rt6ioe_PGmwWj-Cc00zUM7FybfarKTr4D3Rk57R72qpXN4Ja86ZsCAMmDG-m5z31RQh_V7echJ8Kna3Go3yWKCK4vtSwOWrFhiS5RTz6EkrGc3SkFKbb5vp8Wop_84myBtgnBmj4CczhTq2HcOxrJf4def6yDt2uBxyv4bTVGx9Yx3uB4Gx0iK5kYvfma6B_LnkRWk331wjuXKQtBGYIuWkR8J5QtvBmIRVaa7AA19Z4xMIEAqbcuQ5p4I9FCElthBrJd9YOcouHK4U27xxYWJJXcJoTvzG7zWtiV76fHDeQLgAWvJJ7ww4NFgjhqc6AKA_2afxa4c_lAvVZgFuKL3XSCL7PfKxp6GhjcGKeSRr80PT1gfFw2xi8X4ejjNm_prsUZ\n'
console.log(data(text))

用 json.loads 解析一下解密后的数据,即可获取翻译的正文,

def get_explain_data(data):with open('./youdao.js', 'r', encoding='utf-8') as file:result = file.read()context1 = execjs.compile(result)explain_data = context1.call('data', data)explain_data = json.loads(explain_data)eng = explain_data['translateResult'][0][0]['tgt']return eng

最终效果如下:

在这里插入图片描述

3、源码

Github:网易有道翻译逆向
CSDN:有道翻译sign解密,js逆向资源

4、号外

如果我的博客对你有帮助、如果你喜欢我的博客内容,请 “👍点赞” “✍️评论” “💙收藏” 一键三连哦!
【👇🏻👇🏻👇🏻关注我| 获取更多源码 | 定制源码】大学生毕设模板、期末大作业模板 、Echarts大数据可视化、爬虫逆向等! 「一起探讨 ,互相学习」!(vx:python812146)
以上内容技术相关问题😈欢迎一起交流学习👇🏻👇🏻👇🏻🔥

相关文章:

【爬虫逆向案例】某道翻译js逆向—— sign解密

声明:本文只作学习研究,禁止用于非法用途,否则后果自负,如有侵权,请告知删除,谢谢! 【爬虫逆向案例】某道翻译js逆向—— sign解密 1、前言2、步骤3、源码4、号外 1、前言 相信各位小伙伴在写…...

Verilog语法学习——LV9_使用子模块实现三输入数的大小比较

LV9_使用子模块实现三输入数的大小比较 题目来源于牛客网 [牛客网在线编程_Verilog篇_Verilog快速入门 (nowcoder.com)](https://www.nowcoder.com/exam/oj?page1&tabVerilog篇&topicId301) 题目 描述 在数字芯片设计中,通常把完成特定功能且相对独立的…...

YAML+PyYAML笔记 7 | PyYAML源码之yaml.compose_all(),yaml.load(),yaml.load_all()

7 | PyYAML源码之yaml.compose_all,yaml.load,yaml.load_all 1 yaml.compose_all()2 yaml.load()3 yaml.load_all() 1 yaml.compose_all() 源码: 作用:分析流中的所有YAML文档,并产生相应的表示树。解析: # -*- codi…...

(css)列表点击前后样式

(css)列表点击前后样式 效果&#xff1a; html <ul v-show"rightOne" class"one-content"><liv-for"(item,index) in exampleList":key"index"click"searchHandle(item,index)"class"liClass":class&qu…...

Redis服务优化

目录 一.Rde高可用 二.Rdies持久化 2.1持久化的功能 2.2Redis 提供两种方式进行持久化 三.RDB持久化 3.1触发条件 3.1.1手动触发 3.1.2自动触发 3.1.3其他自动触发机制 3.1.4执行流程 3.1.5启动时加载 四.AOF持久化 4.1开启AOF 4.2执行流程 4.2.1命令追加(append) 4.2.2文件写…...

uniAPP 浙政钉 入门手册

uniAPP 如何运行钉钉小程序&#xff1a; 运行钉钉小程序 调试工具导入项目 及 相关平台使用&#xff1a; 专有钉钉 浙政钉 前端 对接流程 常见调试工具&#xff0c;遇到的问题&#xff1a; 采坑记录 下载小程序 IDE 环境配置文件 专有钉钉–环境配置文件...

flask处理文件上传

flask处理文件上传 在Flask框架中&#xff0c;你可以使用request.files对象来处理文件上传。以下是一个简单的文件上传的示例&#xff1a; from flask import Flask, request from werkzeug.utils import secure_filename import osapp Flask(__name__)# 定义文件上传的路径…...

教雅川学缠论04-笔

笔由3部分组成&#xff1a; 顶分型K线底分型&#xff0c;或者 底分型K线顶分型 注意&#xff1a;笔加一起至少7根K线&#xff0c;因为一个底分型至少3根&#xff0c;K先至少1个&#xff0c;顶分型至少3根 下图中红色线段就是一个标准的笔&#xff0c;它始于一个底分型&#xff…...

Unity3d_post process layer 抗锯齿设置

1、 2、 3、 4、 5、...

基于FPGA实现OSD功能

简介 基于FPGA平台实现简单的OSD的功能,对于FPGA实现OSD只能实行简单的画框和文字叠加,如果实现复杂的车道线画框,则没法实现(起码我个人感觉,这个功能没有思路执行)。 FPGA实现OSD功能需要7系列平台,以及VDMA、OSD等Xilinx公司的IP使用(本功能工程采用Vivado2017.4平台…...

Java019-1——面向对象的三大特性

一、封装性 将类的某些信息隐藏在类内部&#xff0c;不允许外部程序直接访问&#xff0c;而是通过该类提供的方法来实现对隐藏信息的操作和访问。&#xff08;这里说的信息就是类中的属性和方法&#xff09; 1.1、封装性的体现 想要通过代码体现封装性之前&#xff0c;需要先…...

2023年的深度学习入门指南(22) - 百川大模型13B的运行及量化

2023年的深度学习入门指南(22) - 百川大模型13B的运行及量化 不知道上一讲的大段代码大家看晕了没有。但是如果你仔细看了会发现&#xff0c;其实代码还是不全的。比如分词器我们就没讲。 另外&#xff0c;13B比7B的改进点也没有讲。 再有&#xff0c;对于13B需要多少显存我们…...

无涯教程-jQuery - empty( )方法函数

empty()方法删除所有匹配的子节点。 empty( ) - 语法 selector.empty( ) empty( ) - 示例 以下是一个简单的示例&#xff0c;简单说明了此方法的用法- <html><head><title>The jQuery Example</title><script type"text/javascript"…...

微信小程序实现蓝牙开锁、开门、开关、指令发送成功,但蓝牙设备毫无反应、坑

文章目录 开源htmlJavaScript 开源 wx联系本人获取源码(开源): MJ682517 html <view><view class"p_l_36 p_r_36"><input class"w_100_ h_80 lh_80 ta_c b_2s_eee radius_20" value"{{instructVal}}" type"text" plac…...

微信小程序中使用echarts方法

小程序中使用echarts echarts是一个基于JS的数据可视化图标库&#xff0c;它提供了直观&#xff0c;生动&#xff0c;可交互&#xff0c;可个性定制的数据可视化图表。一般在vue中会使用到&#xff0c;并且官网也详细的说明了如何在vue中使用&#xff0c;但是今天我想来探讨的…...

【面试题】前端中 JS 发起的请求可以暂停吗?

这个问题非常有意思&#xff0c;我一看到就想了很多可以回复的答案&#xff0c;但是评论区太窄&#xff0c;就直接开一篇文章来写了。 审题 JS 发起的请求可以暂停吗&#xff1f;这一句话当中有两个概念需要明确&#xff0c;一是什么样的状态才能称之为 暂停&#xff1f;二是…...

通过社区参与解锁早期增长:Maven 远程医疗平台概览

Maven通过用户导向的渐进式验证&#xff0c;找到了一个被忽视的巨大女性医疗服务市场&#xff0c;作为女性医疗保健的先行者&#xff0c;已服务超过1500万用户&#xff0c;目前估值已达$14亿。本文将深入探索Maven实现产品市场匹配的三个阶段&#xff0c;从如何验证初始的市场机…...

Vue中使用echarts

1 安装 npm install -g cnpm --registryhttps://registry.npm.taobao.org cnpm install echarts -S 2 main.js引入 3 引入成功...

边缘计算对现代交通的重要作用

边缘计算之所以重要&#xff0c;是在于即使在5G真正商用之时&#xff0c;可以实现超大带宽&#xff08;eMBB&#xff09;的应用场景&#xff0c;但庞大数据量的涌现也就意味着需要在云和端传输过程中找到一个承接点&#xff0c;对数据进行预处理再选择是否上云。 边缘计算应用演…...

Python桥接模式介绍、使用

一、Python桥接模式介绍 概念&#xff1a; Python桥接模式&#xff08;Bridge Pattern&#xff09;是一种软件设计模式&#xff0c;用于将抽象部分与其实现部分分离&#xff0c;使它们可以独立地变化。 它可以通过使用桥接接口来创建一个桥接对象来连接抽象和实现部分。 功能…...

R Markdown网站生成器使用教程:如何快速搭建技术文档网站 [特殊字符]

R Markdown网站生成器使用教程&#xff1a;如何快速搭建技术文档网站 &#x1f4ca; 【免费下载链接】rmarkdown Dynamic Documents for R 项目地址: https://gitcode.com/gh_mirrors/rm/rmarkdown R Markdown是一个强大的动态文档生成工具&#xff0c;能够将代码、输出…...

深入解析Python中ort.InferenceSession的底层实现与性能优化

1. 揭开ort.InferenceSession的神秘面纱 第一次接触ort.InferenceSession时&#xff0c;我完全被它的性能震惊了。作为一个用Python加载ONNX模型的标准入口&#xff0c;它看起来就是个普通的类实例化操作&#xff0c;但背后却隐藏着C和Python的完美协作。这种设计让开发者既能享…...

本日我的《宅男神探》为当当电子书【玄幻/惊悚】榜第六名

本日我的《宅男神探》为当当电子书【玄幻/惊悚】榜第六名&#xff01; 地址http://e.dangdang.com/products/1901322470.html 杨赞是一名热爱推理的年轻人&#xff0c;平时喜欢用逻辑思维分析生活中的各类 问题。大学毕业后&#xff0c;他在母校附近开了一家小书店&#xff0…...

AI五金冲压报价——让精准报价,快人一步。

传统报价熬3天&#xff1f;AI 8分钟给你一份带Excel明细正规PDF的报价单&#xff01;还在用Excel手动算冲压报价&#xff1f;客户催得急&#xff0c;成本核不准&#xff0c;格式不专业丢订单&#xff1f;五金厂的报价痛点&#xff0c;我们懂&#xff01;✅ 工艺PDF/3D图扔进去&…...

Mermaid Live Editor:用代码绘制专业图表的终极免费工具

Mermaid Live Editor&#xff1a;用代码绘制专业图表的终极免费工具 【免费下载链接】mermaid-live-editor Edit, preview and share mermaid charts/diagrams. New implementation of the live editor. 项目地址: https://gitcode.com/GitHub_Trending/me/mermaid-live-edit…...

mxbai-embed-large-v1效果展示:超越OpenAI的文本嵌入模型实测

mxbai-embed-large-v1效果展示&#xff1a;超越OpenAI的文本嵌入模型实测 1. 引言&#xff1a;文本嵌入技术的新标杆 在自然语言处理领域&#xff0c;文本嵌入模型正成为各类智能应用的基础设施。mxbai-embed-large-v1作为最新开源的文本嵌入模型&#xff0c;在MTEB基准测试中…...

脑机接口工具箱实战(一):基于BCILAB的P300信号处理与分类全流程解析

1. 认识P300与BCILAB工具箱 P300是脑电信号中一种特殊的诱发电位&#xff0c;通常在受试者识别到罕见或重要刺激后约300毫秒出现。这种信号在脑机接口研究中具有重要价值&#xff0c;比如拼写系统、注意力监测等应用场景。对于刚接触脑机接口的研究者来说&#xff0c;最大的挑…...

C语言开发者视角:Kandinsky-5.0-I2V-Lite-5s高性能推理引擎调用

C语言开发者视角&#xff1a;Kandinsky-5.0-I2V-Lite-5s高性能推理引擎调用 1. 引言&#xff1a;当静态告警遇上动态生成 想象一下这样的场景&#xff1a;工业监控系统捕捉到设备异常&#xff0c;触发静态告警图片。传统方案中&#xff0c;这张图片需要人工介入分析&#xff…...

深度解析Node.js iCalendar生成器:企业级日历事件架构设计

深度解析Node.js iCalendar生成器&#xff1a;企业级日历事件架构设计 【免费下载链接】ics iCalendar (ics) file generator for node.js 项目地址: https://gitcode.com/gh_mirrors/ic/ics 在现代化的企业应用和分布式系统中&#xff0c;日历事件的标准化生成与管理已…...

Local SDXL-Turbo保姆级教程:导出为ONNX格式进一步优化推理速度

Local SDXL-Turbo保姆级教程&#xff1a;导出为ONNX格式进一步优化推理速度 1. 引言&#xff1a;为什么需要导出ONNX&#xff1f; 如果你已经体验过Local SDXL-Turbo那“打字即出图”的畅快感&#xff0c;可能会想&#xff1a;这速度已经很快了&#xff0c;还能不能再快一点&…...