最新巨量X-Bogus、_signature参数逆向分析与算法还原

文章目录

  • 1. 写在前面
  • 2. 接口分析
  • 3. 断点分析
  • 4. 扣代码补环境
  • 5. 数据解密

【🏠作者主页】:吴秋霖
【💼作者介绍】:擅长爬虫与JS加密逆向分析!Python领域优质创作者、CSDN博客专家、阿里云博客专家、华为云享专家。一路走来长期坚守并致力于Python与爬虫领域研究与开发工作!
【🌟作者推荐】:对爬虫领域以及JS逆向分析感兴趣的朋友可以关注《爬虫JS逆向实战》《深耕爬虫领域》
未来作者会持续更新所用到、学到、看到的技术知识!包括但不限于:各类验证码突防、爬虫APP与JS逆向分析、RPA自动化、分布式爬虫、Python领域等相关文章

作者声明:文章仅供学习交流与参考!严禁用于任何商业与非法用途!否则由此产生的一切后果均与作者无关!如有侵权,请联系作者本人进行删除!

1. 写在前面

  在去年的时候,作者有分析过关于巨量的msToken、X-Bogus、_signature三个参数的加密,本次有读者找到作者寻求解决最新的加密算法,算法相比于之前有细微的变化,参数加密的话重新分析扣JS出来补个环境能搞定,数据解密需要分析讲解一下!

在这里插入图片描述

2. 接口分析

打开网站,我这里的话也是按照上面读者的阐述,主要去分析了两个接口,这里我们直接看get_multi_keyword_hot_trend就行,如下所示:

在这里插入图片描述

可以看到有三个参数,我们需要重点关注分析的是X-Bogus、_signaturemsToken参数的话也许是它会是一个埋点校验的参数,可能会在大量的请求中被检测,这里的话我们直接先固值就好或者用Cookie内的测试均可!当然动态的也可以自己使用算法去生成

msToken参数的话在签名加密的时候需要参与加密,所以暂时是不能不要的!另外我们可以看到巨量目前的话,接口响应数据以密文的方式返回,如下所示:

在这里插入图片描述

所以我们需要正常的抓取数据,不仅需要解决加密参数的问题!同样需要解密接口密文数据

3. 断点分析

根据之前的分析,以及对某系X-bogus的早期版本分析,直接看调用栈不难看出,基本上参数的核心加密逻辑就在这个JS内,采用补环境的话就比较简单了!如下所示:

在这里插入图片描述

我们先来分析X-Bogus参数,进去开始断点跟栈分析,可以看到_0x4d83e6就是生成这个参数的方法,它接受两个参数,_0x2a5467是msToken,_0xbe4f85则是请求参数,直接在控制台查看一下,如下所示:

在这里插入图片描述
在这里插入图片描述

找到了X-Bogus参数生成的方法,现在我们继续找_signature是如何生成的,跟栈来到_0x2657c0,接受三个参数!如下所示:

在这里插入图片描述

可以在控制打印一下参数,如下所示:

在这里插入图片描述在这里插入图片描述

4. 扣代码补环境

直接把webmssdk.js文件全部扣出来,拿到本地开始进行调试,如下所示:

在这里插入图片描述

缺什么补什么,完整的环境头如下所示,href地址自己把接口的地址放上即可,如下所示:

window = global;
document = {}
addEventListener = function (){}
document.addEventListener = addEventListener
canvas = {}
createElement = function (){return canvas
}
document.createElement = createElement
location = {}
location.href = '' # 自行获取
location.protocol = 'https:'
navigator = {}
navigator.userAgent = '' # 自行获取
document.referrer = ""
setInterval = function (){}
setTimeout = function (){}

现在我们接下来需要做的就是,封装加密方法,以便调用!将生成X-Bogus参数的_0x4d83e6方法跟生成_signature的加密方法_0x2657c0全部导出,实现如下:

// 确保get_xbogus跟get_sign以经导出加密方法!!!
function get_sign_params(msToken, api, params) {const _params = JSON.stringify(params);const xbogus = get_xbogus(`msToken=${msToken}`, _params);const url = `${api}msToken=${msToken}&X-Bogus=${xbogus}`;const _signature = get_sign({ body: params, url }, undefined, 'forreal');return {msToken,'X-Bogus': xbogus,_signature};
}

上面注释请注意,加密函数已经导出使用!我们测试一下加密算法效果,如下所示:

在这里插入图片描述

我们这里直接先写一个Demo,测试一下算法生成的参数是否可以正常拿到数据,如下所示:

在这里插入图片描述

很好,证明算法是没有问题的。正常拿到了接口的密文数据,接下来我们就需要对接口返回的加密数据进行解密!

5. 数据解密

关于接口响应数据加密,作者的文章有过很多案例了!如果去分析定位!这里就不再重复的去西说,直接先Hook一下,Hook到之后可以再看跟栈去调试分析,如下所示:

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

Hook到解密位置,直接跟栈,断点分析+插桩+追日志…各种分析手法结合使用,直接把气势先拉满再说!找到解密方式如下所示:

在这里插入图片描述

如上!既然现在知道了是AES加密,那么就需要获取到密钥跟初始向量!密钥如下所示:

在这里插入图片描述

初始向量iv,如下所示:

在这里插入图片描述

最后根据插桩日志跟断点分析,来梳理一下明文数据的整个加密流程,如下所示:

1、UTF-8编码
2、AES加密
3、Base64编码

从而根据上面的加密流程反推解密算法,编写解密函数!算法实现如下所示:

import base64
from Crypto.Cipher import AES
# 数据解密算法
def decrypt(ciphertext):key = "SjXbYTJb7zXoUToSicUL3A=="iv = "OekMLjghRg8vlX/PemLc+Q=="decoded_key = base64.b64decode(key)decoded_iv = base64.b64decode(iv)cipher = AES.new(decoded_key, AES.MODE_CBC, decoded_iv)decoded_ciphertext = base64.b64decode(ciphertext)plaintext = cipher.decrypt(decoded_ciphertext)padding_length = plaintext[-1]plaintext = plaintext[:-padding_length]plaintext = plaintext.decode('utf-8')return plaintext

编写程序来调用解密算法测试一下密文数据解密后的效果,如下所示:

在这里插入图片描述

非常好!最终我们编写一个完整的抓取Demo,来看看抓取效果,如下所示:

import re
import json
import execjs
import requests
from loguru import loggerheaders = {} # 自行获取cookies = {} # 自行获取url = "https://trendinsight.oceanengine.com/api/v2/index/get_multi_keyword_hot_trend"data = {"keyword_list": ["小米su7"],"start_date": "20240501","end_date": "20240510","app_name": "toutiao","region": []
}with open('./juliang.js', 'r') as f:js_code = f.read()ctx = execjs.compile(js_code)params_dict = ctx.call('get_param', '', url, data)
x_bogus = params_dict['X-Bogus']
_signature = params_dict['_signature']params = {"msToken": cookies['msToken'],"X-Bogus": x_bogus,"_signature":_signature
}data = json.dumps(data, separators=(',', ':'))
response = requests.post(url, headers=headers, cookies=cookies, params=params, data=data).json()result = decrypt(response['data'])logger.info(f'解密数据: {result}')

在这里插入图片描述

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

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

相关文章

# 从浅入深 学习 SpringCloud 微服务架构(十六)

从浅入深 学习 SpringCloud 微服务架构(十六) 一、SpringCloudStream:自定义消息通道 1、在子工程 stream_product (子模块)中,创建 自定义的消息通道类 MyProcessor.java /*** spring_cloud_demo\stream_product…

JavaEE概述 + Maven

文章目录 一、JavaEE 概述二、工具 --- Maven2.1 Maven功能 仓库 坐标2.2 Maven之项目构建2.3 Maven之依赖管理 三、插件 --- Maven Helper 一、JavaEE 概述 Java SE、JavaEE: Java SE:指Java标准版,适用于各行各业,主要是Java…

【负载均衡式在线OJ项目day5】OJ服务模块概要

前言 经过四天的努力已经完成了编译运行这个大模块,今天将要进入OJ服务模块设计,该模块的本质就是建立一个小型网站 一.功能 为用户提供题目列表页面为用户提供网站首页(用题目列表充当首页)为用户提供指定题目的编辑页面为用户提供提交代码判题功能&a…

FFmpeg常用API与示例(二)—— 解封装与转封装

封装层 封装格式(container format)可以看作是编码流(音频流、视频流等)数据的一层外壳,将编码后的数据存储于此封装格式的文件之内。 封装又称容器,容器的称法更为形象,所谓容器,就是存放内容的器具,饮料是内容&…

【QT学习】补充:qt使用已经存在的类

1.右键项目--》添加现有文件 注意:不是添加新文件!!! 2.添加配置

掌握Android Fragment开发之魂:Fragment的深度解析(上)

Fragment是Android开发中用于构建动态和灵活界面的基石。它不仅提升了应用的模块化程度,还增强了用户界面的动态性和交互性,允许开发者将应用界面划分为多个独立、可重用的部分,每个部分都可以独立于其他部分进行操作。本文将从以下几个方面深…

信息系统项目管理师0102:可行性研究的内容(7项目立项管理—7.2项目可行性研究—7.2.1可行性研究的内容)

点击查看专栏目录 文章目录 7.2项目可行性研究7.2.1可行性研究的内容1.技术可行性分析2.经济可行性分析3.社会效益可行性分析4.运行环境可行性分析5.其他方面的可行性分析记忆要点总结7.2项目可行性研究 可行性研究是在项目建议书被批准后,从技术、经济、社会和人员等方面的条…

OpenWrt项目UCI配置介绍

UCI(Unified Configuration Interface)是 OpenWrt 项目中使用的一种配置管理系统。它旨在为嵌入式设备提供一个统一且易于理解的配置接口。UCI 主要用于简化 OpenWrt 系统的各种配置过程,使得管理网络、服务和其他系统参数变得更加方便。 1 …

String的substring()方法导致的内存泄露问题

JDK 6的实现 String(int offset, int count, char value[]) {this.value value;this.offset offset;this.count count; }public String substring(int beginIndex, int endIndex) {//check boundaryreturn new String(offset beginIndex, endIndex - beginIndex, value);…

r语言数据分析案例-北京市气温预测分析与研究

一、选题背景 近年来,人类大量燃烧煤炭、天然气等含碳燃料导致温室气 体过度排放,大量温室气体强烈吸收地面辐射中的红外线,造 成温室效应不断累积,使得地球温度上升,造成全球气候变暖。 气象温度的预测一直以来都是…

[算法][差分][延迟相差][leetcode]2960. 统计已测试设备

题目地址: https://leetcode.cn/problems/count-tested-devices-after-test-operations/description/ 解法一:暴力解法 class Solution {public int countTestedDevices(int[] batteryPercentages) {//特殊条件判断if(null batteryPercentages || ba…

JavaScript DOM 对元素进行的操作

DOM(Document Object Model)是一种用于访问和操作HTML和XML文档的编程接口。JavaScript通过DOM提供的方法和属性可以对网页的元素进行各种操作,比如修改元素的内容、样式、属性等。 下面是一些常见的对DOM元素的操作以及相应的代码示例&…

@RequestMapping path正则规范

RequestMapping 注解是 Spring MVC 中用于映射 HTTP 请求的注解之一。它可以用于处理各种 HTTP 请求,包括 GET、POST、PUT、DELETE 等,并且可以指定请求的路径、请求方法、请求参数等信息。 在使用 RequestMapping 注解时,可以使用正则表达式…

51单片机入门:串口通信

串行通信的初步认识 通信方式分类 1、按照数据传送方式: 并行通信:通信时数据的各个位同时传送,可以实现字节为单位的通信。 但是通信线多,占用资源多,成本高。 串行通信:一次只能发送一位&#xff0c…

python把png转成jpg

在Python中,你可以使用PIL(Python Imaging Library,也称为Pillow)库来读取PNG图片并将其转换为JPG格式。下面是一个简单的示例代码: from PIL import Image# 打开PNG图片 png_image Image.open(input.png)# 保存为JP…

微软exchange邮箱发送

使用java发送exchange类型的邮件&#xff0c;foxmail中配置如下图&#xff1a; 需要的maven依赖如下&#xff1a; <dependency><groupId>com.microsoft.ews-java-api</groupId><artifactId>ews-java-api</artifactId><version>2.0</ve…

PCIE协议-2-事务层规范-Message Request Rules

2.2.8 消息请求规则 本文档定义了以下几组消息&#xff1a; INTx 中断信号电源管理错误信号锁定事务支持插槽电源限制支持厂商定义消息延迟容忍度报告&#xff08;LTR&#xff09;消息优化缓冲区冲洗/填充&#xff08;OBFF&#xff09;消息设备就绪状态&#xff08;DRS&#…

【系统架构师】-案例篇(八)数据流图

数据流&#xff1a;数据流是系统中数据的流动&#xff0c;它可以是输入、输出或存储在系统中的数据。 数据处理过程&#xff1a;数据处理过程是对数据进行处理的单元&#xff0c;可以是一个物理设备或软件模块。 数据存储&#xff1a;数据存储是系统中存储数据的单元&#xff0…

焦作定制在线教育系统上线,小学英语教案怎么写?教案要怎么下笔?

说到小学英语这也是当前&#xff0c;学生们的重点&#xff0c;那作为配套的辅导机构&#xff0c;要怎么写教案?这也是需要关注的地方&#xff0c;因为教案关系着教学&#xff0c;有了它学生们上课才会更有效率&#xff0c;所以&#xff0c;会写教案也是上课的第一步。 教案要怎…

小红书·电商运营课:小红书开店流程,小红书电商如何运营(18节视频课)

课程目录 第1节课:学习流程以及后续实操流程注意事项 第2节课:小红书店铺类型解析以及开店细节 第3节课:小红书电商运营两种玩法之多品店铺解析 第4节课:小红书电商运营两种玩法之单品店铺解析 第5节课:选品课(多品类类目推荐) 第6节课:选品课(多品类类目推荐) 第7节课:…