最新巨量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

相关文章

[职场] 公务员的利弊分析 #知识分享#经验分享#其他

公务员的利弊分析     公务员作为一种稳定的职业选择,一直备受人们的关注。然而,就像任何其他职业一样,公务员职位也有其利与弊。本文将对公务员的利弊进行分析,帮助读者更好地了解这一职业的特点。 利: 1. 稳定的职业:公务员职位通常具有较高的稳定性,一旦进入公务员队伍,往往可以享受到稳定的工作环境和薪资待遇。这对于那些追求稳定的人来说,是一个很大的优势。 2. 薪资福利优厚:公务员的薪资和

ABAP怎么把传入的参数刷新到内表里面呢?

1.在执行相关的功能操作之前,优先执行这一段代码,把输入的数据更新入内表里面 DATA: lo_guid TYPE REF TO cl_gui_alv_grid.CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'IMPORTINGe_grid = lo_guid.CALL METHOD lo_guid->check_changed_data.CALL M

代码随想录算法训练营:12/60

非科班学习算法day12 | LeetCode150:逆波兰表达式 ,Leetcode239: 滑动窗口最大值  目录 介绍 一、基础概念补充: 1.c++字符串转为数字 1. std::stoi, std::stol, std::stoll, std::stoul, std::stoull(最常用) 2. std::stringstream 3. std::atoi, std

人工智能机器学习算法总结神经网络算法(前向及反向传播)

1.定义,意义和优缺点 定义: 神经网络算法是一种模仿人类大脑神经元之间连接方式的机器学习算法。通过多层神经元的组合和激活函数的非线性转换,神经网络能够学习数据的特征和模式,实现对复杂数据的建模和预测。(我们可以借助人类的神经元模型来更好的帮助我们理解该算法的本质,不过这里需要说明的是,虽然名字是神经网络,并且结构等等也是借鉴了神经网络,但其原型以及算法本质上还和生物层面的神经网络运行原理存在

SQL Server中,用Restore DataBase把数据库还原到指定的路径

restore database 数据库名 from disk='备份文件路径' with move '数据库文件名' to '数据库文件放置路径', move '日志文件名' to '日志文件存放置路径' Go 如: restore database EaseWe from disk='H:\EaseWe.bak' with move 'Ease

20170723 做的事 ecdsa的签名验证时间短于bls signature

1 今天在虚拟机 /home/smile/Desktop/20170610/Test//time_ecdsa 文件夹下,找到ecdsa的验证时间是 989.060606μs μs 先 make ,然后run。 再取BLS的签名生成时间: ./run  2  gnuplot 画图,画对比的时间 gnuplot 画图参考教程 http://blog.sciencen

高度内卷下,企业如何通过VOC(客户之声)做好竞争分析?

VOC,即客户之声,是一种通过收集和分析客户反馈、需求和期望,来洞察市场趋势和竞争对手动态的方法。在高度内卷的市场环境下,VOC不仅能够帮助企业了解客户的真实需求,还能为企业提供宝贵的竞争情报,助力企业在竞争中占据有利地位。 那么,企业该如何通过VOC(客户之声)做好竞争分析呢?深圳天行健企业管理咨询公司解析如下: 首先,要建立完善的VOC收集机制。这包括通过线上渠道(如社交媒体、官网留言

Java面试八股之JVM参数-XX:+UseCompressedOops的作用

JVM参数-XX:+UseCompressedOops的作用 JVM参数-XX:+UseCompressedOops的作用是启用对象指针压缩(Ordinary Object Pointers compression)。这一特性主要应用于64位的Java虚拟机中,目的是为了减少内存使用。在传统的64位系统中,对象引用(即指针)通常占用8字节(64位),而大部分应用程序实际上并不需要如此大的地址空间

大林 PID 算法

Dahlin PID算法是一种用于控制和调节系统的比例积分延迟算法。以下是一个简单的C语言实现示例: #include <stdio.h>// DALIN PID 结构体定义typedef struct {float SetPoint; // 设定点float Proportion; // 比例float Integral; // 积分float Derivative; // 微分flo

LeetCode 算法:二叉树的中序遍历 c++

原题链接🔗:二叉树的中序遍历 难度:简单⭐️ 题目 给定一个二叉树的根节点 root ,返回 它的 中序 遍历 。 示例 1: 输入:root = [1,null,2,3] 输出:[1,3,2] 示例 2: 输入:root = [] 输出:[] 示例 3: 输入:root = [1] 输出:[1] 提示: 树中节点数目在范围 [0, 100] 内 -100 <= Node.