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

2024-05-12 10:44

本文主要是介绍最新巨量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}')

在这里插入图片描述

这篇关于最新巨量X-Bogus、_signature参数逆向分析与算法还原的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


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

相关文章

java -jar命令运行 jar包时运行外部依赖jar包的场景分析

《java-jar命令运行jar包时运行外部依赖jar包的场景分析》:本文主要介绍java-jar命令运行jar包时运行外部依赖jar包的场景分析,本文给大家介绍的非常详细,对大家的学习或工作... 目录Java -jar命令运行 jar包时如何运行外部依赖jar包场景:解决:方法一、启动参数添加: -Xb

Apache 高级配置实战之从连接保持到日志分析的完整指南

《Apache高级配置实战之从连接保持到日志分析的完整指南》本文带你从连接保持优化开始,一路走到访问控制和日志管理,最后用AWStats来分析网站数据,对Apache配置日志分析相关知识感兴趣的朋友... 目录Apache 高级配置实战:从连接保持到日志分析的完整指南前言 一、Apache 连接保持 - 性

MySQL 存储引擎 MyISAM详解(最新推荐)

《MySQL存储引擎MyISAM详解(最新推荐)》使用MyISAM存储引擎的表占用空间很小,但是由于使用表级锁定,所以限制了读/写操作的性能,通常用于中小型的Web应用和数据仓库配置中的只读或主要... 目录mysql 5.5 之前默认的存储引擎️‍一、MyISAM 存储引擎的特性️‍二、MyISAM 的主

Linux中的more 和 less区别对比分析

《Linux中的more和less区别对比分析》在Linux/Unix系统中,more和less都是用于分页查看文本文件的命令,但less是more的增强版,功能更强大,:本文主要介绍Linu... 目录1. 基础功能对比2. 常用操作对比less 的操作3. 实际使用示例4. 为什么推荐 less?5.

spring-gateway filters添加自定义过滤器实现流程分析(可插拔)

《spring-gatewayfilters添加自定义过滤器实现流程分析(可插拔)》:本文主要介绍spring-gatewayfilters添加自定义过滤器实现流程分析(可插拔),本文通过实例图... 目录需求背景需求拆解设计流程及作用域逻辑处理代码逻辑需求背景公司要求,通过公司网络代理访问的请求需要做请

Java集成Onlyoffice的示例代码及场景分析

《Java集成Onlyoffice的示例代码及场景分析》:本文主要介绍Java集成Onlyoffice的示例代码及场景分析,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要... 需求场景:实现文档的在线编辑,团队协作总结:两个接口 + 前端页面 + 配置项接口1:一个接口,将o

IDEA下"File is read-only"可能原因分析及"找不到或无法加载主类"的问题

《IDEA下Fileisread-only可能原因分析及找不到或无法加载主类的问题》:本文主要介绍IDEA下Fileisread-only可能原因分析及找不到或无法加载主类的问题,具有很好的参... 目录1.File is read-only”可能原因2.“找不到或无法加载主类”问题的解决总结1.File

Dubbo之SPI机制的实现原理和优势分析

《Dubbo之SPI机制的实现原理和优势分析》:本文主要介绍Dubbo之SPI机制的实现原理和优势,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Dubbo中SPI机制的实现原理和优势JDK 中的 SPI 机制解析Dubbo 中的 SPI 机制解析总结Dubbo中

C#继承之里氏替换原则分析

《C#继承之里氏替换原则分析》:本文主要介绍C#继承之里氏替换原则,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C#里氏替换原则一.概念二.语法表现三.类型检查与转换总结C#里氏替换原则一.概念里氏替换原则是面向对象设计的基本原则之一:核心思想:所有引py

Python多进程、多线程、协程典型示例解析(最新推荐)

《Python多进程、多线程、协程典型示例解析(最新推荐)》:本文主要介绍Python多进程、多线程、协程典型示例解析(最新推荐),本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定... 目录一、multiprocessing(多进程)1. 模块简介2. 案例详解:并行计算平方和3. 实现逻