【JS逆向学习】有道翻译接口参数逆向

逆向目标
  • 目标:有道翻译接口加密参数
  • 接口:https://dict.youdao.com/webtranslate
  • 加密参数:
    • sign: e3d8fa747713d6957db7cd2eedaa0d95
    • Cookie: OUTFOX_SEARCH_USER_ID=696102715@114.222.69.137; OUTFOX_SEARCH_USER_ID_NCOO=304412380.2597743
逆向过程
网络接口分析

在翻译页面输入文本,不用刷新就会翻译,因此推断是AJAX请求,F12打开开发者工具,选择XHR过滤AJAX请求,可以看到如下的POST请求:
在这里插入图片描述
加密参数如下:
在这里插入图片描述
当我们输入China后返回的翻译结果如下,数据是加密的:

Z21kD9ZK1ke6ugku2ccWu-MeDWh3z252xRTQv-wZ6jddVo3tJLe7gIXz4PyxGl73nSfLAADyElSjjvrYdCvEP4pfohVVEX1DxoI0yhm36ytQNvu-WLU94qULZQ72aml6kZ73SLZAuFYSDoo5DxD1CAD_gJoN2WmgoLKCbLnIEYzGOAyer1Jab7-s3V894sJs5T0PMYtKsruRiynDqxTpq17L4Jc3v4FYfzJpjS6tSLw343AhMilrI6zbTJTJ_L7429bntYH77EIX7ynVH3VeLEkEa_FpwAndfjS_1uXbq9vqWsfr0LlOxGegdmMZnPYhblwGSZxYvl9Od6f8bGucSAUDYVPoE3Iuj5zpiCSLmUlyxS3_WgM1MFvNV2D7oo5CZULO1inANGHfiYi61qHB5MI4BomG7ucNucRE277kAozj3I1nHTFtj9yrJvQ0PE07c9BeVncFwv2GfVZ-aKiccjPhtdWvaJmrhU1qLBpEDY28FSf52Hqcw5ThzcTmc1284dmZ8uaGCdWmjJcaHw4dZdce9mKQLMRPHanu_ro72WR3AMy3NKL4EVJmACWLsRmp2WOLAF8Zf5tY4x897gmMztmEJlaSI6cOFIverbBEbzK0H1Jq0AS5U4Zk_IF32aWrseq_uFMA5c2lJg3LD0bQoA==
加密参数分析

分析接口的启动器,可以看到一个xhr请求,我们直接点进去打上断点
在这里插入图片描述进去之后跟栈分析,就可以看到关键的加密代码:
在这里插入图片描述

function y(e) {return c.a.createHash("md5").update(e).digest()
}
function j(e) {return c.a.createHash("md5").update(e.toString()).digest("hex")
}
function k(e, t) {return j(`client=${u}&mysticTime=${e}&product=${d}&key=${t}`)
}
function E(e, t) {const o = (new Date).getTime();return {sign: k(o, e),client: u,product: d,appVersion: p,vendor: g,pointParam: m,mysticTime: o,keyfrom: b,mid: A,screen: h,model: f,network: v,abtest: O,yduuid: t || "abcdefg"}
}

分析这段加密代码:

  • d:固定字符串【fanyideskweb】
  • u:固定字符串【webfanyi】
  • e:固定字符串【fsdsogkndfokasodnaso】
  • t:13位时间戳【(new Date).getTime()】

直接使用 nodejs 里面的加密模块 CryptoJS 来进行 MD5 加密,改写 JS 如下:

const CryptoJS = require('crypto-js');function sign(t) {let d = 'fanyideskweb', u = 'webfanyi', e = 'fsdsogkndfokasodnaso',signStr = `client=${d}&mysticTime=${t}&product=${u}&key=${e}`,sig = CryptoJS.MD5(signStr).toString();return sig;
}

返回的参数看起来像是一个base64的加密数据,推断他的解密逻辑应该先解密,然后使用JSON.parse进行格式化,可以直接控制台hook这个方法:

(function(){var parse_ = JSON.parse;JSON.parse = function(param){debugger;return parse_(param);}
})();

在这里插入图片描述
可以看到已经hook到了解密之后的结果,然后跟栈分析,发现解密方法

const a = Po["a"].decodeData(o, Wo["a"].state.text.decodeKey, Wo["a"].state.text.decodeIv), n = a ? JSON.parse(a) : {};0 === n.code ? e.success && t(e.success)(n) : e.fail && t(e.fail)(n)

在这里插入图片描述
继续跟栈进去decodeData,可以看到加密逻辑已经很清晰了,基本可以确定是AES加密了

(t,o,n)=>{if (!t)return null;const a = e.alloc(16, y(o)), i = e.alloc(16, y(n)), r = c.a.createDecipheriv("aes-128-cbc", a, i);let s = r.update(t, "base64", "utf-8");return s += r.final("utf-8"),s
}

在这里插入图片描述
直接使用 nodejs 里面的加密模块 crypto 来进行 AES 解密,改写 JS 如下:

const crypto = require('crypto');
function decrypt(decrypt_str) {const key = "ydsecret://query/key/B*RGygVywfNBwpmBaZg*WT7SIOUP2T0C9WHMZN39j^DAdaZhAnxvGcCY6VYFwnHl";const iv = "ydsecret://query/iv/C@lZe2YzHtZ2CYgaXKSVfsb7Y4QWHjITPPZ0nQp87fBeJ!Iv6v^6fvi2WN@bYpJ4";const key_md5 = crypto.createHash('md5').update(key, 'utf-8').digest();const iv_md5 = crypto.createHash('md5').update(iv, 'utf-8').digest();console.log('key_md5 = ', key_md5)console.log('iv_md5 = ', iv_md5)const decipher = crypto.createDecipheriv('aes-128-cbc', key_md5, iv_md5);let decrypted = decipher.update(decrypt_str, 'base64', 'utf8');decrypted += decipher.final('utf8');return JSON.parse(decrypted);
}

需要源码的同学们关注后私信我

原创声明:未经许可,不得转载。
如有侵权,请联系作者删除删除。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

出现频率高达70%软件测试面试题及答案!——看完面试官:是你面试我还是我面试你啊!

【纯干货!!!】花费了整整3天,整理出来的全网最实用软件测试面试大全,一共30道题目答案的纯干货,希望大家多多支持,建议 点赞!!收藏!!长文警告&…

千巡翼X4轻型无人机 赋能智慧矿山

千巡翼X4轻型无人机 赋能智慧矿山 传统的矿山测绘需要大量测绘员通过采用手持RTK、全站仪对被测区域进行外业工作,再通过方格网法、三角网法、断面法等进行计算,需要耗费大量人力和时间。随着无人机航测技术的不断发展,利用无人机作业可以大…

分享:新手程序员接单一个月,收入3375元

今年刚开始接触外包接单,从注册到现在接到了一个单子,赚了3000多块钱。 赚的钱不多,期间踩的坑倒是不少,给大家挨个唠唠…… 1 一定要完善好自己的简历项目 在外包平台上接单,简历上的项目是重中之重。跟传统的招聘不…

算法基础day2

前缀和 #include <iostream> using namespace std; const int N100010; int n,m; int a[N],s[N]; int main() {scanf("%d%d",&n,&m);for(int i1;i<n;i) scanf("%d",&a[i]);for(int i1;i<n;i) s[i]s[i-1]a[i];while(m--){int l,r;s…

软件测试/测试开发丨学习笔记之Docker常用命令

Docker常用的容器管理命令 docker run –name{your_name} –d {image_name} (运行容器) -d 后台运行docker ps -s -a {查看当前所有容器}docker stop {container_name} (停止容器)docker kill (container_name) {杀死容器}docker rm -f {container_name} (删除容器)docker log…

帆软BI和奥威BI分别适用于哪些行业?

听说不同品牌的BI软件都有各自擅长的行业数据分析&#xff0c;那么帆软BI和奥威BI分别适用于哪些行业&#xff1f;接下来就一起来看看吧&#xff01; 帆软BI 帆软BI是一款业界知名的商业智能(BI)工具&#xff0c;能帮助企业对数据进行分析和决策。帆软BI可以应用于多个行业&a…

uniapp开发移动端遇到的问题记录

1. 键盘弹起时页面整体上移问题 很常见但我解决过程中遇到了很多问题 我的键盘没有遮盖到输入框&#xff0c;但手机键盘弹起后&#xff0c;form部分会整体上移一点&#xff0c;并且底部的操作也会弹到键盘上方 网上写得很复杂&#xff0c;什么动态赋值高度balabala。看到有一…

【阅读笔记】Semi-supervised Domain Adaptation in Graph Transfer Learning

Background 真实世界的图上节点的标签数据是很难拿到的。 因此图转移学习被提出将知识从标记的源图转移出来&#xff0c;以帮助预测域变化的目标图中节点的标签。 尽管图迁移学习算法取得了重大进展&#xff0c;但它们通常假定源图中的所有节点都被标记出来了。 因此文章定义…

【JavaEE】多线程(6) -- 定时器的使用及实现

目录 定时器是什么 标准库中的定时器的使用 实现定时器 定时器是什么 Java中的定时器是一种机制&#xff0c;用于在预定时间执行某个任务。它允许开发人员在指定的时间间隔内重复执行任务&#xff0c;或在指定的延迟之后执行任务。定时器是Java提供的一种方便的工具&#xf…

接口自动化测试问题汇总

本篇文章分享几个接口自动化用例编写过程遇到的问题总结&#xff0c;希望能对初次探索接口自动化测试的小伙伴们解决问题上提供一小部分思路。 sql语句内容出现错误 空格&#xff1a;由于有些字段判断是变量&#xff0c;需要将sql拼接起来&#xff0c;但是在拼接字符串时没有…

低信噪比环境下的语音端点检测

端点检测技术 是 语音信号处理 的关键技术之一为提高低信噪比环境下端点检测的准确率和稳健性&#xff0c;提出了一种非平稳噪声抑制和调制域谱减结合功率 归一化 倒谱距离的端点检测算法 1 端点检测 1-1 定义 定义&#xff1a;在 存在背景噪声 的情况下检测出 语音的起始点和…

一篇文章带你轻松入门Python

Python基础 1. Hello World! Python命令行 假设你已经安装好了Python, 那么在命令提示符输入: python 将直接进入python。然后在命令行提示符>>>后面输入: >>>print(Hello World!) 可以看到&#xff0c;随后在屏幕上输出: print是一个常用函数&#xf…