爬虫---某翻译响应解密和sign逆向

news2024/11/25 0:39:26

目标网址接口:aHR0cHM6Ly9kaWN0LnlvdWRhby5jb20vd2VidHJhbnNsYXRl

  • 仅供学习交流使用,非商业用途,如有侵权,请联系删除!!!
  • 仅供学习交流使用,非商业用途,如有侵权,请联系删除!!!
  • 仅供学习交流使用,非商业用途,如有侵权,请联系删除!!!

调研接口

  • 查看每次请求的参数发现,每次请求sign参数和mysticTime参数都会变
    在这里插入图片描述

  • mysticTime参数不难看出是一个13位的时间戳

  • sign参数猜测是时间戳和一些其他参数组成的字符串进行hash之后的值

  • 查看返回的响应是一堆字母,需要解密

在这里插入图片描述

  • 为了测试自己还原的sign是不是可用,还是先解密响应数据

响应数据解密

  • 一般来说数据解密都会解密为json数据,直接去hook JSON.parse()方法
(function () {
    var my_parse = JSON.parse;
    JSON.parse = function (params) {
        console.log("HOOK parse", params);
        return my_parse(params);
    }
})();
  • 果然发现解析的数据
    在这里插入图片描述

  • 打断点定位到这个位置发现解密函数

在这里插入图片描述

  • 跟进参数发现是AES加密 128 cbc模式,现在只要知道key iv 就可以模拟了
    在这里插入图片描述

  • 经过跟进发现这里的key和iv是在原始的key上面又md5了之后获取了二进制数据转为了uint8数组来进行解密的

在这里插入图片描述

  • 继续跟进发现原始的数据解密为了一个大的uint8数组
    在这里插入图片描述

  • 尝试自己用python进行base64解码一下,发现数组不一样,说明他用了自己解码base64的方式

import base64

t1 = 'Z21kD9ZK1ke6ugku2ccWu-MeDWh3z252xRTQv-wZ6jddVo3tJLe7gIXz4PyxGl73nSfLAADyElSjjvrYdCvEP4pfohVVEX1DxoI0yhm36ysrEuPNKkODn7po6VcuUUdOhXRO9VoaHHPXgSaHRFizTx17FrMowUelZSlyO2Jp-9biXcOlcPxkntWQp1hPDqWu81kg8jzGxgjNOi75FsPNURfLQwSaoG83BqqTNs-LTrA1oUr9ozX7WYrui9n5voGo-P8tg3GMhKpjpC15FQRQZym6KbwDOTyTL8x87VIqwANWkuek5pPnzzlK6SxYY1I1le5EOpQnORyobm7rWr4gVp0cWI3W85cbXdMjaGSok8gQBF1rpqSF2c6CY-e5_Xihisj9hWT1VY472r7LxYbX8A2BkKHWr88pk_1Fwlk-wvn-Tx-heigVVSEFq1PRCzhB-JG4O6Zx_1YUZOSgrTHYAVrag2wsKExTRMZtxU4-7J3hXi8UYgNV-uLN0YvIRWZ0l6Vr-RAGBHu8UsmH2nHSCoanA6wHJbCv58RnYPws6OLsDAJWDnR0kp4Cr6Xm-P3zYVgXehfNyMBTewzDwbTXoSLK-HAIqZP-9T7MUxbN09aqa-CPS_eui99UqOhe780hIXNeSyHuTt5LY_PqhcLvPhkdmQch1RASrQBK4WYgEwiomPqHt_ap8DxDSOyhNsRFm8nFw1Ml1Tmr338WJPLYzUI51hqr85Tw0_9y_siScO098y26eSmBn58QZEjY5ip7IJiNIW93mLXx4Ftzg8LOgs4HRoBPuqu4PcAtXr652xE0Q30_roz2CnQ3Edp0HlDvo8KV7jbosXY_Sb4KWMwavSd-cebsVYKPq0ACaFj_iLXTV5zfQAIkjgJZzbY3N3pG_kfGGRw_0BTh7NeMeRmsuS0cMOgoE1GhQE2JaXH7q5X9oklIV1h60D8NaLUIHHZpjiWDML0cXYoNVQl8eQgxlO0PC129w3KSAGlZsaWbl-jEpap7rkNZsM9BhNcSKjOt8pBvQ3dQ2eDyMgJo28tNBA=='
a1 = base64.b64decode(t1)
print(list(a1))

在这里插入图片描述

  • 发现是经过,r.toByteArray方法转为了uint8数组

在这里插入图片描述

  • 那么只需要用python还原这个函数就可以了
    在这里插入图片描述

  • h函数检测字符串长度之类 i数组是一个固定生成的值

在这里插入图片描述

  • python还原base64转为数组代码

    因为i数组有很多空值,所以需要在python中以None替代,发现i数组为123个元素
    在这里插入图片描述

        def get_i():
            i = [None] * 123
            s = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
            for index, a in enumerate(s):
                i[ord(a)] = index
            i[ord("-")] = 62
            i[ord("_")] = 63
            return i
    
        def h(t):
            e = len(t)
            if e % 4 > 0:
                raise "Invalid string. Length must be a multiple of 4"
            try:
                n = t.index("=")
            except ValueError:
                n = -1
    
            if n == -1:
                n = e
    
            r = 0 if n == e else 4 - n % 4
            return [n, r]
            
        def c(e, n):
            return int(3 * (e + n) / 4 - n)
            
        def base_64_2_bytes_array(t):
            # h函数
            r = h(t)
            s = r[0]
            a = r[1]
            # 用numpy创建一个全是0的uint8数组
            u = np.zeros(c(s, a), dtype='uint8')
            f = 0
            l = s - 4 if a > 0 else s
            n = 0
            # 获取i数组
            i = get_i()
            while n < l:
                e = i[ord(t[n])] << 18 | i[ord(t[n + 1])] << 12 | i[ord(t[n + 2])] << 6 | i[ord(t[n + 3])]
                u[f] = e >> 16 & 255
                f += 1
                u[f] = e >> 8 & 255
                f += 1
                u[f] = 255 & e
                f += 1
                n += 4
    
            if a == 2:
                e = i[ord(t[n])] << 2 | i[ord(t[n + 1])] >> 4
                u[f] = 255 & e
                f += 1
            elif a == 1:
                e = i[ord(t[n])] << 10 | i[ord(t[n + 1])] << 4 | i[ord(t[n + 2])] >> 2
                u[f] = e >> 8 & 255
                f += 1
                u[f] = 255 & e
                f += 1
            return u
    
    
  • 处理key和iv

    def get_md5(sb1: str):
        return hashlib.md5(sb1.encode()).digest()
    key = get_md5('ydsecret://query/key/B*RGygVywfNBwpmBaZg*WT7SIOUP2T0C9WHMZN39j^DAdaZhAnxvGcCY6VYFwnHl')
    iv = get_md5('ydsecret://query/iv/C@lZe2YzHtZ2CYgaXKSVfsb7Y4QWHjITPPZ0nQp87fBeJ!Iv6v^6fvi2WN@bYpJ4')
    
  • 解密代码

    aes_obj = AES.new(key=key, iv=iv, mode=AES.MODE_CBC)
    a1 = aes_obj.decrypt(base_64_2_bytes_array(sb1).tobytes()).decode()
    print(a1)
    

    在这里插入图片描述
    解密完之后发现还有padding,还不能进行json转换,加个unpad

    aes_obj =AES.new(key=key, iv=iv, mode=AES.MODE_CBC)
    decrypt_str = aes_obj.decrypt(base_64_2_bytes_array(sb1).tobytes())
    json_str = unpad(decrypt_str, AES.block_size, style='pkcs7').decode()
    json_data = json.loads(json_str)
    print(json_data)
    

    在这里插入图片描述


sign参数逆向

  • 直接从调用堆栈中第一行打断点
    在这里插入图片描述
  • 查看调用堆栈看sign参数在哪生成的

在这里插入图片描述

  • 堆栈跟到这发现O函数生成的sign,继续跟值

t是个时间戳,sign为h函数生成

在这里插入图片描述

继续跟值就发现sign为字符串md5之后的十六进制字符串,多试几次之后发现只有时间戳的变化

在这里插入图片描述

Last

在这里插入图片描述

果然尝试请求之后大功告成 🐔🐔🐔🐔限单杀

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

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

相关文章

软件测试技能,JMeter压力测试教程,设置集合点(十七)

一、前言 LoadRunner 中可以设置一个集合点&#xff0c;设置多个虚拟用户等待到一个时间点&#xff0c;到齐后一起发请求达到并发的目的 jmeter 中使用 同步定时器 Synchronizing Timer实现 LoadRunner 中集合点的功能&#xff0c;模拟多用户并发测试&#xff0c;即多个线程在…

K折交叉验证

目的 模型在一套训练集和数据集上表现优秀&#xff0c;不能说明问题&#xff0c;只有在众多不同的训练集和测试集上表现都优秀&#xff0c;模型才具有真正的泛化能力。 通过交叉验证&#xff0c;验证模型的泛化能力&#xff0c;帮助我们认识模型。 常用方法之K折交叉验证 分…

一步一步学OAK之六:通过OAK相机实现特征检测

目录 特征检测Setup 1: 创建文件Setup 2: 安装依赖Setup 3: 导入需要的包Setup 4: 创建pipelineSetup 5: 创建节点创建相机节点创建特征检测节点创建数据交互的节点 Setup 6:设置相关属性设置相机的相关属性设置特征检测器的初始配置 Setup 7: 建立链接关系建立相机和特征跟踪器…

iOS 16 版本适配

1、iOS 16 真机调试时需要在设备的设置 —> 隐私与安全 —> 开发者模式 中打开开发者模式。 2、隐私权限增强&#xff0c;如通过 UIDevice 获取设备名称时&#xff0c;无法获取用户的信息&#xff0c;只能获取设备对应的名称&#xff08;[UIDevice currentDevice].name返…

基于Python所写的影视作品分析设计

点击以下链接获取源码资源&#xff1a; https://download.csdn.net/download/qq_64505944/87964875 《开心麻花影视作品分析》程序使用说明 在PyCharm中运行《开心麻花影视作品分析》即可进入如图1所示的系统主界面。在该界面中&#xff0c;选择要分析的电影名称&#xff0c;然…

android:RadioGroup的使用

一、前言&#xff1a;工作中会遇到勾选不同的类型&#xff0c;获得不同的数据。仅以此笔记记录。 二、上代码&#xff1a; 新建一个Activity public class RadioHorizontalActivity extends AppCompatActivity implements RadioGroup.OnCheckedChangeListener {private Text…

线程并发同步--条件变量--conditional_variable

同步&#xff1a;我的线程完成之后&#xff0c;你在进行下一个线程。可以理解为进货和卖货&#xff0c;即只有进或的线程结束后才可以执行卖货的这个线程。 c中提供了一个工具&#xff1a;conditional_variable。实现有两种方式&#xff0c;一种是condition_variable和conditon…

[java]Redis

关于Redis Redis是一款基于内存的&#xff0c;使用K-V结构存储数据的NoSQL非关系型数据库。 基于内存的&#xff1a;Redis读写数据时&#xff0c;都是在内存中进行读写的&#xff0c;所以&#xff0c;读写效率非常高&#xff01;另外&#xff0c;Redis会自动的将所管理的数据同…

mmdetection自定义数据集训练

目录 1. 源码下载&#xff0c;本文基于v3.0版本 2.选模型训练 2.1 先生成后面用于编译的配置文件 2.2.1 修改coco.py 2.2.2 修改class_names.py 3. 训练配置 4. 训练过程展示 1. 源码下载&#xff0c;本文基于v3.0版本 GitHub - open-mmlab/mmdetection: OpenMMLab Detec…

UART-GD32

UART-GD32 通信的概念 同步通信和异步通信 数据帧格式 波特率 使用步骤 引脚分布

图-深度优先搜索与广度优先搜索

图 在现实生活中&#xff0c;有许多应用场景会包含很多点以及点点之间的连接&#xff0c;而这些应用场景我们都可以用即将要学习的图 这种数据结构去解决 地图 我们生活中经常使用的地图&#xff0c;基本上是由城市以及连接城市的道路组成&#xff0c;如果我们把城市看做是一…

西安石油大学 C++期末考试 重点知识点+题目复习(上)

第一章 “const”关键字的用法 当使用 const 修饰变量、函数参数、成员函数以及指针时&#xff0c;以下是一些代码示例&#xff1a; 声明只读变量&#xff1a; const int MAX_VALUE 100; const float PI 3.14;保护函数参数&#xff1a; void printArray(const int arr[]…

解决vmware虚拟机,克隆修改ip后,xshell连接不上问题

1、查看网卡 ifconfig2、修改网卡配置 vim /etc/sysconfig/network-scripts/ifcfg-ens32 改成与上图一样 修改后 3、重启reboot则解决

STM32F407 串口配置步骤

介绍STM32F407串口配置步骤&#xff0c;完成串口的数据发送与接收、实现中断接收&#xff0c;支持printf重定向。 STM32F407 串口配置说明 STM32F4 的串口资源相当丰富的&#xff0c;功能也相当强劲&#xff0c;STM32F407ZGT6 最多可提供 6 路串口&#xff0c;有分数波特率发…

【Junit 单元测试】

Junit 单元测试 笔记记录 1. Junit介绍2. 使用Junit3. 常用注解4. 断言使用 1. Junit介绍 2. 使用Junit 1.导入依赖 <dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>tes…

C语言-基础语法学习-4 字符串

目录 字符串C语言字符串及相关函数定义字符数组和字符串的区别sizeof()和strlen()的区别动态开辟字符串野指针常用字符串函数 字符串 C语言字符串及相关函数 在C语言中&#xff0c;字符串是由字符数组表示的一系列字符序列。C语言提供了一些函数来处理字符串&#xff0c;使我…

centos磁盘扩容

解释 PE - 物理块&#xff08;Physical Extent&#xff09; 硬盘上有很多实际物理存在的存储块PV - 物理卷 &#xff08;Physical Volume&#xff09; 物理卷处于最底层&#xff0c;它可以是实际物理硬盘上的分区&#xff0c;也可以是整个物理硬盘(相当于单独做一个分区)&…

CommonJS 和 ES6 module

本文主要自己觉得要记录的点记录下来,不耽误大家时间&#xff0c;会持续更新。 Module对象 Module {id: xxx/demo/1.js, //加载文件的绝对路径path: xxx/demo,// 加载文件所在目录的绝对路径exports: [Function (anonymous)],filename: xxx/demo/1.js,加载文件的绝对路径load…

B/S和C/S详解(嵌入式学习)

B/S和C/S详解 1. C/S1.1 概念1.2 C/S架构的特点 2. B/S2.1 概念2.2 B/S架构的特点2.3 相对于传统的C/S架构的优势 3. B/S架构详解4. B/S架构怎么用&#xff08;CGI、Lighttpd&#xff09; 1. C/S 1.1 概念 C/S&#xff08;Client/Server&#xff09;是一种计算机网络架构模式…

【C++】 Qt-页面布局

文章目录 布局组件和布局按钮练习-用户信息页面布局准备工作设置性别设置年龄设置生日设置邮箱后缀 设置头像创建文件写入文件清空表单信息Buddy&#xff08;伙伴&#xff09;关系Tab顺序 布局组件和布局按钮 Qt的UI设计器中提供了丰富的布局管理功能&#xff0c;组件面板里有…