js逆向——2024最新金山词霸(练习二)

news2024/9/21 22:41:46

首先还是看响应,返回了一串加密数据

继续放大招hook JSON,详细流程在上一篇文章

 

然后直接跟栈找到解密位置

 var t = 1 === (null === e || void 0 === e ? void 0 : e.status) ? A(A({}, e), {}, {
                        content: JSON.parse((0,
                        _.B6)(e.content))
                    }) : e;

t是解密之后的结果

然后就是解密函数:

经过测试是标准的AES-ECB解密模式

function f(e) {
            var t = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : "aahc3TfyfCEmER33"
              , r = n.enc.Utf8.parse(t)
              , o = n.AES.decrypt(e, r, {
                mode: n.mode.ECB,
                padding: n.pad.Pkcs7
            });
            return o.toString(n.enc.Utf8)
        }

然后我们只需正确请求接口就ok了

简单看一下加密参数,就sign是比较可疑的

 

对于XHR请求的包,直接跟栈就对了!

 

就是跟栈的时候注意看一下url对不对,别跟错接口了😂😂 

一直跟到找不到sign的踪迹为止

 

找到位置之后打断点,观察sign生成的全过程

经过分析sign的生成,是先经过md5然后AES加密生成

注:当看到加密函数传入字符串的时候,一定要先用123456测试一下,不要上来就扎入细节当中

整个加密参数的生成流程我们都清除了,下面就是扣代码环节了

 

经过调试已经可以生成正确的sign了 

 然后就是解密数据了,过程相对简单,就是应该普通的AES-ECB解密

 

 完整的vscode代码:

// 加密参数sign生成算法
var CryptoJS = require('crypto-js');

s = function(e) {
    e = decodeURIComponent(e);
    for (var t = String.fromCharCode(e.charCodeAt(0) - e.length), r = 1; r < e.length; r++)
        t += String.fromCharCode(e.charCodeAt(r) - t.charCodeAt(r - 1));
    return t
};

function aes_encode(e) {
    var t = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : "%5C%C2%80%C2%9A%C2%A8%C2%B6%C2%B8y%C2%9B%C2%B2%C2%8F%7C%7F%C2%97%C3%88%C2%A9d"
      , r = CryptoJS.enc.Utf8.parse(s(t))
      , o = CryptoJS.AES.encrypt(e, r, {
        mode: CryptoJS.mode.ECB,
        padding: CryptoJS.pad.Pkcs7
    });
    return o.toString()
}

function get_sign(query){
    var LI = '6dVjYLFyzfkFkk'
    var con_str = "6key_web_new_fanyi".concat(LI).concat(query.replace(/(^\s*)|(\s*$)/g, ""));
    var r = CryptoJS.MD5(con_str).toString().substring(0,16)
    console.log(r)
    return aes_encode(r)
}

/*var ret = get_sign('早上好')
console.log(ret)
console.log('over')*/

//解密响应数据算法

function aes_decode(e) {
    var t = "aahc3TfyfCEmER33"
      , r = CryptoJS.enc.Utf8.parse(t)
      , o = CryptoJS.AES.decrypt(e, r, {
        mode: CryptoJS.mode.ECB,
        padding: CryptoJS.pad.Pkcs7
    });
    return o.toString(CryptoJS.enc.Utf8)
}

/*var ret = aes_decode('nCRjxZwyh/7P3ee74BIU0r+VpYqC1/VewPqzx0un7jyNV2TcReI50gWyVhig1cg85spz3Z+vU9BuH+MZ9gpZDbFxsl6nE06WcFjQ1vllnHa/X9uvHGHQl4tTYa3B3DlS1qukVA9HNWk0rAyvPSnz68Wkf6p5bUFNBfLUvZKMQVy3FmCWe/NkT0FSRS3EL7WediKsKpF8Gq+m/NsT9zVE3sDqIe64/a4F9twH0KVZc+bCH+1eiXP29Po0pKMNkmuhWZN8biNTndn7IEkD1zJKhpTXSl0tJRb87q/u9/l51U5yjeiVxoTCwlOzoZygtiv55xamsuOEWt92DpT0dPSH1bl+XyrchrkYbYi+K6HJgVw=')
console.log(ret)
console.log('over')*/

最后就是python代码的编写了:

经过测试,也拿到正确的响应数据,并成功解密

解析具体的json串的时候报错:TypeError: string indices must be integers

解决: 将json字符串解析为字典即可》response_json = json.loads(decrypt_text)

完整的python代码:

import requests
import execjs
import json
headers = {
    "authority": "ifanyi.iciba.com",
    "pragma": "no-cache",
    "cache-control": "no-cache",
    "accept": "application/json, text/plain, */*",
    "content-type": "application/x-www-form-urlencoded",
    "sec-ch-ua-mobile": "?0",
    "user-agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.71 Safari/537.36 Core/1.94.253.400 QQBrowser/12.6.5678.400",
    "origin": "https://www.iciba.com",
    "sec-fetch-site": "same-site",
    "sec-fetch-mode": "cors",
    "sec-fetch-dest": "empty",
    "referer": "https://www.iciba.com/",
    "accept-language": "zh-CN,zh;q=0.9"
}
url = "https://ifanyi.iciba.com/index.php"
# query = input('请输入需要查询的单词:')
query = '早上好'
with open('金山词霸.js','r',encoding='utf-8') as f:
    ctx = execjs.compile(f.read())
sign = ctx.call('get_sign',query)
params = {
    "c": "trans",
    "m": "fy",
    "client": "6",
    "auth_user": "key_web_new_fanyi",
    "sign": sign
}
data = {
    "from": "zh",
    "to": "en",
    "q": query
}
response = requests.post(url, headers=headers, params=params, data=data)
encry_text = response.json()['content']
print(encry_text)
decrypt_text = ctx.call('aes_decode',encry_text)
print(decrypt_text)
print(type(decrypt_text))
# 将 JSON 字符串解析为字典
response_json = json.loads(decrypt_text)
print(response_json['out'])

ok,今天的你就到此为止吧,明天还要接着狼🐺啊! 

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

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

相关文章

护眼大路灯哪个牌子好?公认五款最好护眼大路灯分享

护眼大路灯哪个牌子好&#xff1f;很多家长都是为了孩子的视力健康而置换的护眼大路灯&#xff0c;但是有一部分孩子用了之后反而会和家长说出现眼睛不太舒服&#xff0c;甚至近视加深的情况。而引发这种情况的大多数为产品不达标或非专业台灯&#xff0c;因为专业护眼大路灯是…

白屏检测系统的设计与实现

目录 一、 什么是白屏问题&#xff1f;二、 问题分析与拆解2.1 人工判定一个白屏问题的逻辑2.2 自动化判定一个白屏问题的算法思想 三、 白屏检测算法3.1 图像灰度化3.2 图像二值化3.3 计算&#xff08;判定为白屏&#xff09;置信度 四、 白屏检测系统的设计与实现4.1 UI自动化…

某通用系统0day审计过程

前言 代码审计篇章都是自己跟几个师傅们一起审计的1day或者0day(当然都是小公司较为简单)&#xff0c;禁止未经允许进行转载&#xff0c;发布到博客的用意主要是想跟师傅们能够交流下审计的思路&#xff0c;毕竟审计的思路也是有说法的&#xff0c;或者是相互源码共享也OK&…

51单片机之动态数码管显示

一、硬件介绍 LED数码管是一种由多个发光二极管&#xff08;LED&#xff09;封装在一起&#xff0c;形成“8”字型的显示器件。它广泛用于仪表、时钟、车站、家电等场合&#xff0c;用于显示数字、字母或符号。 通过控制点亮a b c d e f g dp来显示数字&#xff0c;本实验开发板…

最长的一帧学习(待补)

文章目录 一、osgViewer:: ViewerBase:: frame()1.osgViewer:: View:: init()2.osgViewer::Viewer::realize()&#xff0c;窗口和场景的“设置”工作part1 GraphicsContextpart1.1 通过阅读osgViewer::View::setUpViewInWindow()了解osg最基础的操作 part2 DisplaySettingspart…

《机器学习by周志华》学习笔记-决策树-03

1、连续值处理 到目前为止,我们在决策树01、02中仅讨论了基于离散属性来生成决策树,而现实任务中常会遇到连续属性,所以在本章的学习中,我们将会讨论如何在决策树学习中使用连续属性。 1.1、概念 取值范围是连续的实数值或者整数值的属性就是「连续属性」,与离散属性相对…

Java全栈开发知识图谱(概要)

Java全栈开发知识图谱 基础知识 Java基础 语法面向对象编程&#xff08;OOP&#xff09;异常处理集合框架并发编程JVM原理 下列的只是图谱来源与网路 &#xff0c;仅作为学习笔记使用&#xff0c;侵删。 数据结构和算法 常用数据结构&#xff08;数组、链表、栈、队列、树等…

通过提示词越狱解锁学习提示词的新姿势

一、什么是提示词越狱 提示词越狱是一种针对语言模型的攻击方法&#xff0c;攻击者通过设计特定的提示词或查询&#xff0c;诱导模型生成不当或有害的内容。这类攻击通常利用模型的脆弱性&#xff0c;绕过其内置的安全机制。通过巧妙的措辞或特殊的结构&#xff0c;攻击者能够…

【ML】为什么multi-lingual bert 有跨语言的能力?M-BERT有什么特点

【ML】为什么multi-lingual bert 有跨语言的能力&#xff1f; 1. Multi-lingual BERT的跨语言能力解析1.1 什么是Multi-lingual BERT&#xff1f;1.2 为什么Multi-lingual BERT有跨语言的能力&#xff1f;1.3 结论 2. 数据量减少对BERT识别能力的影响及Multi-lingual BERT的跨…

删除git中的.idea

删除git中的.idea 1. 修改 .gitignore 文件内容&#xff0c;添加 .idea echo .idea >> ./gitignore2. 删除本地暂存区的 .idea [git rm命令用于从Git仓库中删除文件或目录&#xff0c; 而--cached选项告诉Git仅删除Git索引中的.idea目录&#xff0c;并不会删除本地文件系…

【大数据】重塑时代的核心技术及其发展历程

&#x1f407;明明跟你说过&#xff1a;个人主页 &#x1f3c5;个人专栏&#xff1a;《大数据前沿&#xff1a;技术与应用并进》&#x1f3c5; &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 目录 一、引言 1、什么是大数据 2、大数据技术诞生的背景 二、大…

Java并发编程(七)—ThreadLocal的原理及应用详解

目录 一、ThreadLocal的原理 1、ThreadLocal对象 2、ThreadLocalMap 3、Thread 对象 4、get() 和 set() 方法 5、内存管理 二、ThreadLcoal的应用 三、ThreadLocal扩展问题 四、总结 ThreadLocal 类在 Java 中提供了一种机制&#xff0c;可以在每个线程中存储独立的变…

【Python】基础语法介绍

目录 一、标识符和关键字 二、注释 三、缩进 四、输入和输出 五、字符串操作 六、基本数据类型 七、复合数据类型 7.1 列表 7.2 元组 7.3 字典 7.4 集合 八、数据类型转换 九、运算符 8.1 算术运算符 8.2 比较运算符 8.3 赋值运算符 8.4 位运算符 8.5 逻辑运…

网络编程day1

一、思维导图 网络基础

wordpress全局自适应网址导航整站打包源码,含主题和数据库

wordpress全局自适应网址导航整站打包源码&#xff0c;含主题和数据库。直接恢复就可以使用了。 这个是自适应的布局设计&#xff0c;体验还不错。用网址导航是可以的。 代码免费下载&#xff1a;百度网盘

golang for range time.Ticker 和 time.Timer时间通道使用示例 - 每隔指定时间执行一次,执行指定时长后退出执行

golang中的 ticker和timer时间通道除了可以使用for select case语句来执行外&#xff0c; 还可以使用 for range语句来执行ticker或者timer时间通道。 for range time.Ticker 和 time.Timer时间通道使用示例 下面的示例演示了time.Ticker 和 time.Timer的区别和使用演示。 Ti…

《向量数据库指南》——向量数据库技术积累与商业机会

一豪:Charles提到了一个关键点,就是RAG技术结合模型对非结构化数据的理解和搜索能力,甚至可以很好地架接在传统结构化数据的解决方案中。作为向量数据库的核心技术点,对数据本身特别是非结构化数据的向量化、精炼和压缩,我相信Zilliz等公司有很多独门技巧和技术积累。随着…

UE基础 —— 编辑器界面

菜单栏 UE中每个编辑器都有一个菜单栏&#xff0c;部分菜单会出现在所有编辑器窗口中&#xff0c;如File、Window、Help&#xff0c;其他则是其编辑器特有的&#xff1b; 主工具栏 UE中部分最常用的工具和命令的快捷方式&#xff1b; 1&#xff0c;保存按钮&#xff08;ctrls&a…

NIO线程模型

NIO线程模型主要涉及以下几个方面&#xff1a; 一、基本概念 NIO&#xff08;New Input/Output&#xff09;是Java的一种新的输入输出模型&#xff0c;也被称为非阻塞IO。其核心特点是数据读写操作均是非阻塞的&#xff0c;即在进行读写操作时&#xff0c;若数据未准备好&…

Python第三方库——mrjob的介绍

一、简介 mrjob 是一个强大的 Python 库&#xff0c;它允许开发者以 Pythonic 的方式编写 MapReduce 作业&#xff0c;并在多种环境下运行这些作业&#xff0c;包括本地机器、Hadoop 集群、Amazon Elastic MapReduce (EMR) 和 Google Cloud Dataproc。通过使用 mrjob&#xff…