某航參數逆向及設備指紋分析

文章目錄

  • 1. 寫在前面
  • 2. 接口分析
  • 3. 加密分析
  • 4. 算法還原
  • 5. 設備指紋風控分析與繞過

【🏠作者主頁】:吳秋霖
【💼作者介紹】:擅長爬蟲與JS加密逆向分析!Python領域優質創作者、CSDN博客專家、阿里云博客專家、華為云享專家。一路走來長期堅守并致力于Python與爬蟲領域研究與開發工作!
【🌟作者推薦】:對爬蟲領域以及JS逆向分析感興趣的朋友可以關注《爬蟲JS逆向實戰》《深耕爬蟲領域》
未來作者會持續更新所用到、學到、看到的技術知識!包括但不限于:各類驗證碼突防、爬蟲APP與JS逆向分析、RPA自動化、分布式爬蟲、Python領域等相關文章

作者聲明:文章僅供學習交流與參考!嚴禁用于任何商業與非法用途!否則由此產生的一切后果均與作者無關!如有侵權,請聯系作者本人進行刪除!

1. 寫在前面

??今天端午節,祝大家端午安康!最近事情比較多,所以又有很長一段時間沒有寫文章了(差點忘了這個好習慣~~)。剛好今天過節有時間,把前些天看的一些小案例分享一下。這期分析的是某航空網站的加密參數跟它的設備指紋風控,通過非登錄游客身份搜索航班機票查詢然后解決風控標記彈行為驗證(比較簡單適合新手研究


分析網站

aHR0cHM6Ly93d3cuYWlyY2hpbmEuY29tLmNuL2dhdGV3YXkvYXBpL2ZsaWdodC9saXN0

2. 接口分析

隨便在搜索入口查詢一趟航班信息,可以看到發包請求參數params一段密文,如下所示:

在這里插入圖片描述

除了請求參數加密外,請求頭也有一個x-device-token參數疑似動態生成的(但不是直接網站的JS代碼層面生成的)。如下所示:

在這里插入圖片描述

像這種Token請求頭的參數一般情況下我們可以先不去管它,先去分析請求參數的加密。頭部一般非簽名的核心參數,你固定測試一次兩次是可以重放的。但是請求參數的加密對什么加密了、明文是什么以及后續能夠模擬偽造出請求來測試是必須

初看這個Token的時候我感覺在哪里見過(比較熟悉)。有經驗的可能會猜測它是由某個接口動態請求之后服務端下發的(在有效的時間范圍可以有效固定去使用)做過某東逆向分析的可以發現它的這個參數開頭tak01...跟它們官方的那個設備指紋高度相似(后續驗證發現就是用的某東的設備指紋風控)

3. 加密分析

開始定位找到發包加密的位置,這里可以直接通過XHR斷點去跟棧就能夠溯源到整個發包跟調用加密的位置,如下所示:

在這里插入圖片描述

可以看到o.P就是加密方法,直接跳轉到對應的JS代碼,如下:
在這里插入圖片描述

var c = function(e) {try {var t = encodeURIComponent(JSON.stringify(e));return o.sm2.doEncrypt(t, "04064c2a3bcafba2c1ca4f5fb8ecd876b23d70fc4479b78f3c8066c02a8c17749458bca86361bc563d2501b61e2ac93a676a1305893aafcc6be2ea48ecb048672e", a.yV)} catch (n) {return console.log(n),""}}

看上面加密代碼的入口,比較明顯的可以看到使用了疑似sm2國密算法。像一般我們猜測到了加密算法大致看看是否標準的就可以直接使用自己擅長的語言導個包去進行還原。后面那一串的話看起來就是它的密鑰,sm2一般長度256 bit,開頭04表示非壓縮。后面那64字節(128個十六進制字符),大致如下得出:

04 || <X (64 hex)> || <Y (64 hex)> = 1 + 64 + 64 = 129 hex digits

略微看一下它的那個JS實現,是標準一個sm2。然后要還原這個加密算法的方式可以直接把doEncrypt的JS代碼扣出來(webpack)然后導出模塊再調用即可。還有就是確定完整個加密算法是標準的還是變異的或者魔改的后用其他語言實現(代碼量會大大降低

4. 算法還原

既然是分享,這里扣webpack跟使用純算還原的方式都說一下。首先跳轉到sm2.doEncrypt代碼處,開始扣一些JS。扣代碼的也是講究精扣粗扣

這里精扣的話就幾百行涉及加密的這幾段JS代碼就行。新手你全部粗扣下來也無所謂(4W多行-不用在意這些細節-能用就行

在這里插入圖片描述

然后再把webpack內部的模塊加載函數導出來,模塊加載器的結構一般如下所示:

function enc(n) {var f = t[n];if (void 0 !== f) return f.exports;...e[n].call(r.exports, r, r.exports,enc)...return r.exports
}

t[n]: 緩存已加載模塊
e[n]: 模塊定義函數對象(模塊id -> 函數)類似Dict
r.exports: 模塊的導出結果

之后找到SM2加密方法的所在模塊ID(70686),如下所示:

在這里插入圖片描述

那么這個時候我們就可以在JS中直接導出扣下來的webpack模塊,重新封裝一下加密方法。代碼實現如下:

function encrypt(e) {var o = sm2(70686), // 加密模塊try {var t = encodeURIComponent(JSON.stringify(e));return 0.sm2.doEncrypt(t, "04064c2a3bcafba2c1ca4f5fb8ecd876b23d70fc4479b78f3c8066c02a8c17749458bca86361bc563d2501b61e2ac93a676a1305893aafcc6be2ea48ecb048672e", 1);} catch (n) {console.log(n);return "";}
}

除了上面說到的扣代碼,再就是直接使用導包的方式來還原(前提上面的分析我們已經知道了它是一個標準的加密算法),這里我們直接可以使用NodeJS導出加密模塊的方式實現,實現代碼如下:

const smCrypto = require('sm-crypto');
const { sm2 } = smCrypto;function encrypt(e) {try {const t = encodeURIComponent(JSON.stringify(e));// 密鑰const publicKey = "04064c2a3bcafba2c1ca4f5fb8ecd876b23d70fc4479b78f3c8066c02a8c17749458bca86361bc563d2501b61e2ac93a676a1305893aafcc6be2ea48ecb048672e";return sm2.doEncrypt(t, publicKey, 1);} catch (error) {console.error("加密失敗:", error);return "";}
}

這個密鑰好像是定期會更新的,然后接下來我們驗證一下已經通過逆向分析還原出來的加密算法,對接到單次的請求中是否可以正常拿到接口的響應數據,代碼實現如下:

import execjs
import requests
from loguru import logger
from getuseragent import UserAgentdef encrypt_request_data(data):with open("sm2.js", encoding='utf-8') as f:ctx = execjs.compile(f.read()) res = ctx.call("encrypt",data) return resdef send_request(encrypted_data):random_ua_list = ["chrome", "firefox", "safari"]ua = UserAgent(random.choice(random_ua_list))useragent = ua.Random()url = "https://www.xxx.com.cn/gateway/api/flight/list"headers = headers = {"Content-Type": "application/json","Accept": "application/json, text/plain, */*","Sec-Fetch-Site": "same-origin","Accept-Language": "zh-CN,zh-Hans;q=0.9","Accept-Encoding": "gzip, deflate, br","Sec-Fetch-Mode": "cors","Host": "www.xxx.com.cn","Origin": "https://www.xxx.com.cn","User-Agent": useragent,"Referer": "https://www.xxx.com.cn/flight/oneway/pek-ctu/2025-06-04","Content-Length": "846","Connection": "keep-alive","Sec-Fetch-Dest": "empty","X-Locale": "zh-CN","X-Device-Token": "" # 自行獲取}data = {'params': encrypted_data,'RequestParameterEncryptionIdentificationBit': True}data = json.dumps(data, separators=(',', ':'))response = requests.post(url, headers=headers, data=data)return response.json()if __name__ == "__main__":# 請求明文參數params = {"Trip": [{"Date": "2025-06-05", "Dep": "PEK", "Arrival": "CTU"}],"Passenger": {"adult": 1, "child": 0, "baby": 0},"notchType": None,"aimPrice": None,"RequestParameterSecurityIdentificationBit": True}encrypted_data = encrypt_request_data(params)logger.info(f'加密參數: {encrypted_data}')result = send_request(encrypted_data)logger.info(f'查詢數據: {result}')

運行一下上面封裝好的Python請求代碼,可以看到是沒有問題的。能夠正常拿到數據,如下所示:

在這里插入圖片描述

5. 設備指紋風控分析與繞過

上面測試的是非登錄狀態下的情況,其實登不登錄都無所謂。它本身是有一個風控參的,整個爬蟲的風控也都基于它來開展。就是前面我一開始分析提到的X-Device-Token

這個參數就是設備指紋的信息,用來防護惡意請求的。一個X-Device-Token可以請求的次數在10次以內,瀏覽器的環境就會被標記再配合風控判定推送行為驗證碼(點選),如下所示:

在這里插入圖片描述

在這里插入圖片描述

所以如果需要多次持續的請求查詢一些數據的話,要么就是直接再逆向分析點選的協議,拿到驗證的Token提交也是可以的。再就是解決這個參數繞過點選。繼續進一步分析這個參數發現是使用的某東設備指紋風控(包括這個點選也是某東云的驗證碼系統)如下所示:

在這里插入圖片描述

這個參數收集了【瀏覽器的指紋CanvasWebGL分辨率、Storage...】以及一些初始化加載行為

在這里插入圖片描述

針對這個X-Device-Token參數的對抗方案其實也是有很多種的,第一個就是自己定制魔改,第二個就是使用開源好已經從Chromium源碼層修改瀏覽器指紋信息的方案(外面的指紋瀏覽器也是可以的

這里我們就簡單的用魔改過的方案自己在本地搭一個服務,然后通過注入JS的方式刷票務的接口Hook到最新的這個參數,如下所示:

在這里插入圖片描述
經過多次測試,一個設備指紋的新參數在請求風控出現行為驗證碼的時候,調用測試搭建的刷新設備指紋的服務獲取新的X-Device-Token都是可以立即繞過行為驗證正常再次請求數據的(因為我們使用的魔改方案、它會認為我們是一個新的設備及瀏覽器),如下所示:

在這里插入圖片描述

它這個不管是自動化瀏覽器的方案還是接口協議的方案都會遇到行為驗證碼的風控(它的行為驗證不像其他平臺是必須要過的、可以規避掉)。然后像這種非登錄狀態或者游客模式可以訪問的爬蟲方案,廠商針對的風控一般只會從IP設備指紋開展

最后多說一句(爬蟲目前想要持續抓取一些頭部平臺的數據、除了很普遍的很基本的接口驗簽逆向外。需要解決的就是風控,風控涉及的細分領域有很多。而其中最常遇見的就是設備指紋風控跟行為驗證風控,那么對抗是對抗的什么呢?就是這一系列的風控防護,所以定制或魔改指紋、改機這些都是需要涉及的。以前可能只需要考慮策略,但那已經是S3賽季了...

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/82032.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/82032.shtml
英文地址,請注明出處:http://en.pswp.cn/web/82032.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Python訓練營---Day41

DAY 41 簡單CNN 知識回顧 數據增強卷積神經網絡定義的寫法batch歸一化&#xff1a;調整一個批次的分布&#xff0c;常用與圖像數據特征圖&#xff1a;只有卷積操作輸出的才叫特征圖調度器&#xff1a;直接修改基礎學習率 卷積操作常見流程如下&#xff1a; 1. 輸入 → 卷積層 …

【Netty系列】Reactor 模式 2

目錄 流程圖說明 關鍵流程 以下是 Reactor 模式流程圖&#xff0c;結合 Netty 的主從多線程模型&#xff0c;幫助你直觀理解事件驅動和線程分工&#xff1a; 流程圖說明 Clients&#xff08;客戶端&#xff09; 多個客戶端&#xff08;Client 1~N&#xff09;向服務端發起連…

前端開發中 <> 符號解析問題全解:React、Vue 與 UniApp 場景分析與解決方案

前端開發中 <> 符號解析問題全解&#xff1a;React、Vue 與 UniApp 場景分析與解決方案 在前端開發中&#xff0c;<> 符號在 JSX/TSX 環境中常被錯誤解析為標簽而非比較運算符或泛型&#xff0c;導致語法錯誤和邏輯異常。本文全面解析該問題在不同框架中的表現及解…

【Web應用】 Java + Vue 前后端開發中的Cookie、Token 和 Swagger介紹

文章目錄 前言一、Cookie二、Token三、Swagger總結 前言 在現代的 web 開發中&#xff0c;前后端分離的架構越來越受到歡迎&#xff0c;Java 和 Vue 是這一架構中常用的技術棧。在這個過程中&#xff0c;Cookie、Token 和 Swagger 是三個非常重要的概念。本文將對這三個詞進行…

投稿Cover Letter怎么寫

Cover Letter控制在一頁比較好&#xff0c;簡短有力地推薦你的文章。 Dear Editors: Small objects detection in remote sensing field remains several challenges, including complex backgrounds, limited pixel representation, and dense object distribution, which c…

創建型設計模式之Prototype(原型)

創建型設計模式之Prototype&#xff08;原型&#xff09; 摘要&#xff1a; Prototype&#xff08;原型&#xff09;設計模式通過復制現有對象來創建新對象&#xff0c;避免重復初始化操作。該模式包含Prototype接口聲明克隆方法、ConcretePrototype實現具體克隆邏輯&#xff…

spark在執行中如何選擇shuffle策略

目錄 1. SortShuffleManager與HashShuffleManager的選擇2. Shuffle策略的自動選擇機制3. 關鍵配置參數4. 版本差異(3.0+新特性)5. 異常處理與調優6. 高級Shuffle服務(CSS)1. SortShuffleManager與HashShuffleManager的選擇 SortShuffleManager:默認使用,適用于大規模數據…

AUTOSAR圖解==>AUTOSAR_EXP_AIADASAndVMC

AUTOSAR高級駕駛輔助系統與車輛運動控制接口詳解 基于AUTOSAR R22-11標準的ADAS與VMC接口規范解析 目錄 1. 引言2. 術語和概念說明 2.1 坐標系統2.2 定義 2.2.1 乘用車重心2.2.2 極坐標系統2.2.3 車輛加速度/推進力方向2.2.4 傾斜方向2.2.5 方向盤角度2.2.6 道路變量2.2.7 曲率…

26考研——文件管理_文件目錄(4)

408答疑 文章目錄 二、文件目錄1、目錄的作用與結構1.1、目錄的基本概念1.2、目錄的組織形式1.2.1、單級目錄結構1.2.2、兩級目錄結構1.2.3、多級&#xff08;樹形&#xff09;目錄結構1.2.4、無環圖目錄結構 1.3、目錄的實現方式1.3.1、線性列表1.3.2、哈希表 2、文件共享與鏈…

Maven 項目中集成數據庫文檔生成工具

在 Maven 項目中&#xff0c;可以通過集成 數據庫文檔生成工具&#xff08;如 screw-maven-plugin、mybatis-generator 或 liquibase&#xff09;來自動生成數據庫文檔。以下是使用 screw-maven-plugin&#xff08;推薦&#xff09;的完整配置步驟&#xff1a; 1. 添加插件配置…

WebSocket指數避讓與重連機制

1. 引言 在現代Web應用中&#xff0c;WebSocket技術已成為實現實時通信的重要手段。與傳統的HTTP請求-響應模式不同&#xff0c;WebSocket建立持久連接&#xff0c;使服務器能夠主動向客戶端推送數據&#xff0c;極大地提升了Web應用的實時性和交互體驗。然而&#xff0c;在實…

本地部署AI工作流

&#x1f9f0; 主流 RAG / 工作流工具對比表&#xff08;含是否免費、本地部署支持與資源需求&#xff09; 工具名類型是否支持 RAG可視化目標用戶是否免費支持本地部署本地部署一般配置Dify企業級問答系統平臺??非技術 & 企業用戶? 免費版 商業版? 支持2C4G 起&…

React 第五十節 Router 中useNavigationType的使用詳細介紹

前言 useNavigationType 是 React Router v6 提供的一個鉤子&#xff0c;用于確定用戶如何導航到當前頁面。 它提供了關于導航類型的洞察&#xff0c;有助于優化用戶體驗和實現特定導航行為。 一、useNavigationType 核心用途 1.1、檢測導航方式&#xff1a; 判斷用戶是通過…

4.2.3 Spark SQL 手動指定數據源

在本節實戰中&#xff0c;我們學習了如何在Spark SQL中手動指定數據源以及如何使用format()和option()方法。通過案例演示&#xff0c;我們讀取了不同格式的數據文件&#xff0c;包括CSV、JSON&#xff0c;并從JDBC數據源讀取數據&#xff0c;展示了如何將這些數據轉換為DataFr…

【AUTOSAR OS】計數器Counter機制解析:定義、實現與應用

一、Counter的定義與作用 在AUTOSAR Classic Platform&#xff08;CP&#xff09;中&#xff0c;**Counter&#xff08;計數器&#xff09;**是系統實現時間管理的核心組件&#xff0c;用于測量時間間隔、觸發報警&#xff08;Alarm&#xff09;和調度表&#xff08;Schedule …

在機器視覺測量和機器視覺定位中,棋盤格標定如何影響精度

棋盤格標定是機器視覺(尤其是基于相機的系統)中進行相機內參(焦距、主點、畸變系數)和外參(相機相對于世界坐標系的位置和姿態)標定的經典且廣泛應用的方法。它的質量直接、顯著且多方面地影響最終的視覺測量和定位精度。 以下是棋盤格標定如何影響精度的詳細分析: 標定…

SOC-ESP32S3部分:21-非易失性存儲庫

飛書文檔https://x509p6c8to.feishu.cn/wiki/QB0Zw7GLeio4l4kyaWQcuQT3nZS 非易失性存儲 (NVS) 庫主要用于在 flash 中存儲鍵值格式的數據。 它允許我們在芯片的閃存中存儲和讀取數據&#xff0c;即使在斷電后&#xff0c;這些數據也不會丟失。 NVS 是 ESP32 flash&#xff…

讓大模型看得見自己的推理 — KnowTrace結構化知識追蹤

讓大模型“看得見”自己的推理 —— KnowTrace 結構化知識追蹤式 RAG 全解析 一句話概括:把檢索-推理“改造”成 動態知識圖構建任務,再讓 LLM 只關注這張不斷精煉的小圖 —— 這就是顯式知識追蹤的核心價值。 1. 背景:為什么 RAG 仍難以搞定多跳推理? 長上下文負擔 傳統 I…

新版智慧景區信息化系統解決方案

該智慧景區信息化系統解決方案以云 + 大數據 + 物聯網技術為核心,秉持 “匯聚聯合,突顯數據隱性價值” 理念,通過數據融合、業務融合、技術融合,構建 “營銷、服務、管理” 三位一體模式。方案涵蓋智慧票務、智能入園、精準營銷、景區管理(如用電安全監測、森林防火、客流…

人工智能在智能健康監測中的創新應用與未來趨勢

隨著人們健康意識的不斷提高和醫療資源的日益緊張&#xff0c;智能健康監測作為一種新興的健康管理方式&#xff0c;正在迅速發展。人工智能&#xff08;AI&#xff09;技術通過其強大的數據分析和預測能力&#xff0c;為智能健康監測提供了重要的技術支持。本文將探討人工智能…