解密某游戏的数据加密

前言

在这里插入图片描述

最近有个兄弟通过我的视频号加我,咨询能否将这个dubo游戏游戏开始前就将数据拿到从而进行押注,于是通过抓包工具测试了下,发现数据有时候是明文,有时候确实密文,大致看了下有这几种加密:Md5aes、Md5,参数加密用md5,数据返回加密用Md5aes,本次记录一下分析过程。

登录

通过抓包分析数据,发现数据返回采用Md5aes
在这里插入图片描述
请求参数用了某种加密
在这里插入图片描述

分析

我们通过上面的抓包知道,密码肯定是用了一种加密方式,但具体是啥,还不清楚,我们通过打断点的形式顺藤摸瓜

通过观察启动资源,锁定一个index.js
在这里插入图片描述
点击进去,观察发现有表单提交的数据
在这里插入图片描述
继续往下搜索md5()方法

 t.prototype.get_md5 = function(t) {return this.md5(t)}

在这里插入图片描述
继续搜索md5()方法

在这里插入图片描述

cc._RF.push(e, “121674IswNGu77LvNvHfpBi”, “md5”)

cc._RF.push 和 cc._RF.pop 是 Cocos Creator 引擎用于跟踪脚本加载顺序和依赖关系的工具函数。这些函数在加载脚本时自动生成,用于维护加载堆栈。

我们通过对该方法进行数据修改,再次运行观察结果

修改

再md5方法下新增代码

t.prototype.md5 = function(t) {var e = this;alert('我被执行了');console.log(t);console.log(e);t = this.utf16_to_utf8(t);console.log('新的密码');console.log(t);for (var o = this.porcess_message(t), n = Uint32Array.from([this.A, this.B, this.C, this.D]), a = 0, i = this.split(Array.from(o), 16); a < i.length; a++) {for (var r = i[a], s = n[0], c = n[1], l = n[2], h = n[3], u = 0; u < 64; u++)n[(4 - u % 4) % 4] = this.fghi_wrapped(u)(n[(4 - u % 4) % 4], n[(4 - u % 4 + 1) % 4], n[(4 - u % 4 + 2) % 4], n[(4 - u % 4 + 3) % 4], r[this.x_index(u)], this.S[u], this.T(u));n[0] = s + n[0],n[1] = c + n[1],n[2] = l + n[2],n[3] = h + n[3]}return Array.from(n).map(function(t) {return e.little_endian(t)}).join("").toLowerCase()}

在这里插入图片描述

保存后刷新重新登陆

在这里插入图片描述
可以看到,密码的确是传递过来了
在这里插入图片描述

猜测

可能是md5加密

在这里插入图片描述
在这里插入图片描述
发现数据值一样,请求登录只需要将密码进行md5加密即可

import requests
import hashlib
headers = {'Accept': '*/*','Accept-Language': 'zh,zh-CN;q=0.9','Authorization': 'undefined','Cache-Control': 'no-cache','Connection': 'keep-alive','Pragma': 'no-cache','Referer': 'http://js88.mrlj.cn/js1/','User-Agent': 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Mobile Safari/537.36',
}text1='123456'
print(text1)
md=hashlib.md5(text1.encode()) # 创建md5对象
md5pwd=md.hexdigest() # md5加密
print(md5pwd)params = {'loginId': '241837','loginPwd': md5pwd,
}response = requests.get('http://js88.mrlj.cn/qw/user/weixin/loginByPwd', params=params, headers=headers, verify=False)
print(response.json())

响应

123456
e10adc3949ba59abbe56e057f20f883e
{‘code’: 200, ‘msg’: ‘正常’, ‘data’: ‘md5AES:w3cqakJcff674yZSTLRgOck0lJ4SiaKjhO9Greq3hOdp+irWmG9nB/tPuvl1BYA2f6tHCIlxVRhippuJn/FVcVOrGk88zoscA9tbnx+mPIC2ynMt8KnPWKGQYKIJekukfktcGOg0JR29GkR6NktoboqIDaVIHMpCcain3bd9Ly/enE03bI5BuM9a+Kn86DXbbdSmUyNCWC0WNNi3Onn/KtJ3W6Tb8r/ujfragdTPPbpuvItSCXIB9kpQDlkSNSINsqTF8VaM8VBOQ2YKnv43ORmypGwPjeZrm+j4BmIhSM2xr+hlf0sJp1k1xtu4XUz4AGypWdESGOHbCGfgSFxpGs34UUxkAN2Dg+U/Y3Nv8hjQnt0UceSb2rfsHhWG3uCPqTnFFI0mV64QSQeyOsPEca80zjUEREXpcnPfR7lSQGdn5yoemu7rXWdsDszdHalIi774B38hY/1Cc+9uHjxvvaRP0+G9OUHgOPV2pwgS7nvlDekFH0E+PFHTZSg5UEm09tluDZeowxShc/MYcoGljdLrfT24Vr755gGHs2PgE8UXRglOQJqAsWazyQZJqz6/hULG40kAT3/PkLzREVMIt3yyGERj2RDzcPk+bJK5d12cWjUf6/c1tFfhJeBx+nKzyP+rFIi6JsaNUKObMwgNC1LiwEY0W3+suXQLcR5FbMa6CURmVzPwIxB4LslDD0OEPqnHHowvVE9ZyhE6ts5Am1KTcvKY7rY8MrAcXO30nHbfupwH5rjrrrf2MdpKcA2PUPnITj7V6TVCmqX24wdTB5pcrZVshvv1cV8zOll54S2tOJrC2GjRKRl1clXvVhokU2Ys22NKMDB5OxUP2ajJea6d98owyPlnpH4MVzxeVnewcK8/ed35YrT8f4nn2TFqe0zsQqqsiC9noScvr/uZV/vxBHYi45LRIjaAzTUhBc8l9IlfknJQnUvnmE2kzNBW’, ‘ok’: True}

在这里插入图片描述

解密

  function() {console.log('iv-=======');function t() {this.aes_key = "2c4add8f849a7bea",this.aes_iv = "dc4b73b33e69eaff"}return t.prototype.encrypt = function(t) {console.log('iv2-=======');var e = CryptoJS.enc.Utf8.parse(this.aes_key), o = CryptoJS.enc.Utf8.parse(this.aes_iv), n = CryptoJS.AES.encrypt(t, e, {iv: o,mode: CryptoJS.mode.CBC,padding: CryptoJS.pad.Pkcs7});return CryptoJS.format.OpenSSL.stringify(n)},t.prototype.decrypt = function(t) {var e = (t = CryptoJS.format.OpenSSL.parse(t)).ciphertext.toString(), o = CryptoJS.enc.Hex.parse(e), n = CryptoJS.enc.Base64.stringify(o), a = CryptoJS.enc.Utf8.parse(this.aes_key), i = CryptoJS.enc.Utf8.parse(this.aes_iv);return CryptoJS.AES.decrypt(n, a, {iv: i,mode: CryptoJS.mode.CBC,padding: CryptoJS.pad.Pkcs7}).toString(CryptoJS.enc.Utf8)},n([i], t)}());

这段代码是一个 JavaScript 函数,它定义了一个名为 t 的构造函数,并将其实例化后作为匿名函数的返回值。在构造函数 t 中,有两个属性 aes_key 和 aes_iv,它们存储了AES加密算法所需的密钥和初始化向量。

函数中定义了两个方法 encrypt 和 decrypt,用于加密和解密操作。

在 encrypt 方法中,首先将密钥和初始化向量转换为 UTF-8 格式,然后使用 CryptoJS 库中的 AES 加密函数对传入的参数
t 进行加密。加密过程中指定了加密模式为 CBC(Cipher Block Chaining),并使用 PKCS7 填充方式。最后,使用
OpenSSL 格式将加密结果转换为字符串并返回。

在 decrypt 方法中,首先将传入的密文解析为 OpenSSL 格式,然后将其转换为十六进制格式,并再次转换为 Base64
字符串。接着,将密钥和初始化向量转换为 UTF-8 格式,使用 CryptoJS 库中的 AES
解密函数对密文进行解密,解密模式和填充方式与加密时相同。最终将解密结果转换为 UTF-8 格式的字符串并返回。

将js代码复制下来

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Encryption/Decryption Example</title><script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.1.1/crypto-js.min.js"></script>
</head>
<body><script>(function() {function t() {this.aes_key = "2c4add8f849a7bea";this.aes_iv = "dc4b73b33e69eaff";}t.prototype.encrypt = function(t) {var e = CryptoJS.enc.Utf8.parse(this.aes_key),o = CryptoJS.enc.Utf8.parse(this.aes_iv),n = CryptoJS.AES.encrypt(t, e, {iv: o,mode: CryptoJS.mode.CBC,padding: CryptoJS.pad.Pkcs7});return CryptoJS.format.OpenSSL.stringify(n);};t.prototype.decrypt = function(t) {var e = (t = CryptoJS.format.OpenSSL.parse(t)).ciphertext.toString(),o = CryptoJS.enc.Hex.parse(e),n = CryptoJS.enc.Base64.stringify(o),a = CryptoJS.enc.Utf8.parse(this.aes_key),i = CryptoJS.enc.Utf8.parse(this.aes_iv);return CryptoJS.AES.decrypt(n, a, {iv: i,mode: CryptoJS.mode.CBC,padding: CryptoJS.pad.Pkcs7}).toString(CryptoJS.enc.Utf8);};// 示例使用var cipher = new t();var plaintext = "{code:200,data}";var encrypted_text = cipher.encrypt(plaintext);console.log("Encrypted:", encrypted_text);var decrypted_text = cipher.decrypt(encrypted_text);console.log("Decrypted:", decrypted_text);})();</script>
</body>
</html>

在这里插入图片描述

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

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

相关文章

网络层协议之 IP 协议

IP 协议格式 4 位版本&#xff1a;此处的取值只有两个&#xff0c;4&#xff08;IPv4&#xff09;和 6&#xff08;IPv6&#xff09;&#xff0c;即指定 IP 协议的版本。 4 位首部长度&#xff1a;描述了 IP 报头多长&#xff0c;IP 报头是变长的&#xff0c;因为报头中的选项部…

点餐小程序 点餐系统 微信点餐系统 支持微信小程序 支付公众号 可接入第三方配送 全开源uniapp

餐饮连锁v2版-体验后台&#xff08;复制粘贴以下地址到浏览器&#xff0c;打开网址即可登录&#xff0c;) 本文来自&#xff1a;点餐小程序 点餐系统 微信点餐系统 支持微信小程序 支付公众号 可接入第三方配送 全开源uniapp - 源码1688 演示后台&#xff1a;https://diancan.…

异构图神经网络——Heterogeneous Graph Neural Networks

相关代码见文末 1.回顾同构图 1.1 GNN GNN基本计算方法——邻接矩阵乘以节点,聚合相邻节点的特征,得到本节点的特征表达 1.2 Graph Attention Network 引入图注意力,实现边的权重可学习,最简单的方法是,将两个节点的特征进行拼接,使用一组可学习的权重参数映射为边的权…

华为数据之道第一部分导读

目录 导读 第一部分 序 第1章 数据驱动的企业数字化转型 非数字原生企业的数字化转型挑战 业态特征&#xff1a;产业链条长、多业态并存 运营环境&#xff1a;数据交互和共享风险高 IT建设过程&#xff1a;数据复杂、历史包袱重 数据质量&#xff1a;数据可信和一致化…

学习大数据,所需更要的shell基础(2)

文章目录 read读取控制台输入函数系统函数bashnamedirname 自定义函数Shell工具&#xff08;重点&#xff09;cutawk 正则表达式入门常规匹配常用特殊字符 read读取控制台输入 1&#xff09;基本语法 read (选项) (参数) ①选项&#xff1a; -p&#xff1a;指定读取值时的提示…

C++初识多态(1)

1.多态要解决的问题&#xff08;引入&#xff09; 任何一种机制的存在&#xff0c;必然是有其存在的意义的&#xff0c;例如我们前面学过的函数重载&#xff0c;运算符重载&#xff0c;以及引用等等&#xff0c;都是解决一些特殊问题的&#xff1b; 下面通过一些具体的例子&a…

组合模式(Composite)——结构型模式

组合模式(Composite)——结构型模式 组合模式是一种结构型设计模式&#xff0c; 你可以使用它将对象组合成树状结构&#xff0c; 并且能通过通用接口像独立整体对象一样使用它们。如果应用的核心模型能用树状结构表示&#xff0c; 在应用中使用组合模式才有价值。 例如一个场景…

剁手党必看——转转红包使用规则与最优组合计算全解析

​ 1、省钱攻略基础之“了解平台红包使用规则” 2、举个栗子 3、最优红包组合计算方法进化过程 3.1、初代“笛卡尔乘积”版 3.2、二代“边算边比较Map聚合”版 3.3、三代“边算边比较数组索引定位”版 4、总结 1、省钱攻略基础之“了解平台红包使用规则” 规则一&#x…

介绍 ffmpeg.dll 文件以及ffmpeg.dll丢失怎么办的五种修复方法

ffmpeg.dll 是一个动态链接库文件&#xff0c;属于 FFmpeg运行库。它在计算机上扮演着非常重要的角色&#xff0c;因为它提供了许多应用程序和操作系统所需的功能和组件。当 ffmpeg.dll 文件丢失或损坏时&#xff0c;可能会导致程序无法正常运行&#xff0c;甚至系统崩溃。下面…

数据结构-线性表-链表-2.3-4

试编写在带头结点的单链表L中删除一个最小值结点的高效算法&#xff08;假设最小值结点是唯一的&#xff09;。 使用四个指针&#xff0c;p,pre,minp,minpre 用p从头至尾扫描单链表&#xff0c;pre指向*p结点的前驱&#xff0c;用minp保存最小结点的指针&#xff08;初始认为…

C#读sqlite数据库

using System.Data.SQLite;//若没有库需要在Nugut下载 private void ReadDatabase() { //判断有无数据库 if (!File.Exists(dbPath)) { SQLiteConnection.CreateFile(dbPath); MessageBox.Show(…

紫外激光打标机适合在哪些材料表面进行标记

紫外激光打标机适合在多种材料表面进行标记&#xff0c;特别是那些对热敏感或者需要高精度、高清晰度标记的材料。以下是一些常见的适用材料&#xff1a; 1. 塑料&#xff1a;紫外激光打标机在塑料材料上表现尤为出色&#xff0c;因为紫外激光的短波长和高能量密度使得它能够在…

Python | Leetcode Python题解之第70题爬楼梯

题目&#xff1a; 题解&#xff1a; class Solution:def climbStairs(self, n: int) -> int:a, b 1, 1for _ in range(n - 1):a, b b, a breturn b

TCP长连接短链接

1、短连接 短连接是指通讯双方有数据交互时&#xff0c;就建立一个连接&#xff0c;数据发送完成后&#xff0c;则断开此连接&#xff0c;即每次连接只完成一项业务的发送。 2、长连接 长连接是指在一个连接上可以连续发送多个数据包&#xff0c;在连接保持期间&#xff0c;…

Nginx启动后IP加端口不能正常访问

背景介绍 新增NGINX配置文件后&#xff0c;重启nginx无法使用IP端口访问服务&#xff0c;域名可以访问服务。NGINX启动不报错&#xff0c;测试nginx配置文件nginx -t也没问题。 定位问题思路与步骤 查看NGINX配置文件 发现NGINX配置文件中的user是www user www www;查看N…

Linux中通过命令执行Shell脚本不生效问题

Linux中通过命令执行Shell脚本不生效问题 文章目录 Linux中通过命令执行Shell脚本不生效问题1. 执行.sh设置export不生效问题2. 可能导致的原因3. 解决方法1. 通过点(.)来执行shell脚本2. 通过source来执行shell脚本 1. 执行.sh设置export不生效问题 执行命令./script.sh后发现…

深度学习实战77-基于CNN+BiLSTM的异常用电行为的识别算法研究与实战

大家好,我是微学AI,今天给大家介绍一下深度学习实战77-基于CNN+BiLSTM的异常用电行为的识别算法研究与实战。 在智能电网的快速发展背景下,电力系统的安全稳定运行显得尤为重要。异常用电行为,如非法窃电、设备故障导致的非正常耗电等,不仅影响电网的经济效益,还可能威胁…

ORA-51803: Vector dimension count must match the dimension count 错误解决

ORA-51803: Vector dimension count must match the dimension count 错误解决 0. 错误信息1. 解决方法 0. 错误信息 错误信息如下&#xff0c; oracledb.exceptions.DatabaseError: ORA-51803: Vector dimension count must match the dimension count specified in the col…

C语言(操作符)2

Hi~&#xff01;这里是奋斗的小羊&#xff0c;很荣幸各位能阅读我的文章&#xff0c;诚请评论指点&#xff0c;关注收藏&#xff0c;欢迎欢迎~~ &#x1f4a5;个人主页&#xff1a;小羊在奋斗 &#x1f4a5;所属专栏&#xff1a;C语言 本系列文章为个人学习笔记&#x…

[C++]智能指针的实现:auto_ptr, shared_ptr, weak_ptr

auto_ptr 简介 交换资源的管理权&#xff0c;将被拷贝资源置空&#xff0c;很危险&#xff0c;一般被禁用 代码实现 namespace memory {template<typename T>class auto_ptr{public:auto_ptr(T* ptr):_ptr(ptr){}auto_ptr(auto_ptr<T>& ap){_ptr ap._ptr;…