最新巨量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.pswp.cn/web/10583.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/10583.shtml
英文地址,請注明出處:http://en.pswp.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節課:…