爬蟲逆向--Day15--核心逆向案例2(Python逆向實現請求加密、請求堆棧、攔截器關鍵字)

一、逆向案例之Python逆向實現請求加密

image

//具體代碼如下
function l(t, e) {return t.toString().toUpperCase() > e.toString().toUpperCase() ? 1 : t.toString().toUpperCase() == e.toString().toUpperCase() ? 0 : -1}function u(t) {for (var e = Object.keys(t).sort(l), n = "", a = 0; a < e.length; a++)if (void 0 !== t[e[a]])if (t[e[a]] && t[e[a]]instanceof Object || t[e[a]]instanceof Array) {var i = JSON.stringify(t[e[a]]);n += e[a] + i} elsen += e[a] + t[e[a]];return n}function d(t) {for (var e in t)"" !== t[e] && void 0 !== t[e] || delete t[e];var n = r["a"] + u(t);return s(n).toLocaleLowerCase()}

1.1、步驟1,通過https://curlconverter.com/ 生成基礎爬蟲代碼

image

?1.2、Python代碼的結構調整

image

?1.3、補充知識點1:0值的概念? ? ??

在整型中,只有0是false? 其他的不管是正數1 2 3...還是-1,-2,-3...都是true

在字符串中,只有“”,是false ;其他的“ ”,“0”...等只要不是空字符串都是true

image

?1.4、補充知識點2:與或非邏輯運算? 短路運算

與 and(Pyhon)? &&(JS)? 全真為真,有假既假

或 or(Python)? || (JS)? ?有真既真,全假為假

image

?1.5、在對列表或字典進行便利的時候,不能直接對其進行操作(增刪改),需要用t.copy

"""  一、處理“零值”  【t是一個字典】for (var e in t)"" !== t[e] && void 0 !== t[e] || delete t[e];1、Python沒===2、Python 的 or 后面不能使用del命令,所以只能使用t.pop進行刪除操作3、在對列表或字典進行便利的時候,不能直接對其進行操作(增刪改),需要用t.copyt.copy()產生一個新的字典去循環便利,   t.pop()在對原始字典進行操作處理"""# 方式1:for key in t.copy():print(key)  # 獲取每一個keyt[key] != "" and t[key] != 0 or t.pop(key)print(t)

1.6、列表和元組排序:sort()? ? ? ?sorted()

l = [10, 2, 3, 1, 5]
l.sort()  # 從小到大
print(l)  # [1, 2, 3, 5, 10]l = [10, 2, 3, 1, 5]
l.sort(reverse=True)  # 從大到小
print(l)  # [10, 5, 3, 2, 1]l = ["2", "1", "10", "100", "5"]
l.sort()  # 字符串安裝ASCII碼字母表排序從小到大,所以結果有點亂七八糟
print(l)  # ['1', '10', '100', '2', '5']# 補充知識點:sorted()
l = [10, 2, 3, 1, 5]
print(sorted(l))  # [1, 2, 3, 5, 10]# sorted() 比sort()強大的多,sort()不管什么是什么元素直接就給你硬排,而且需要對象進行調用
# sorted() 有返回值,可以自定義排序規則# 案例1
# my_sort函數是排序規則 只能有一個形參item,是l2中的每一個元素
def my_sort(item):# 然后根據每一個元素中的具體數據進行排序,根據什么排序,就返回什么,例如根據年齡就返回item[1]return item[1]# l2必須是列表或者元組,不能是字典,字典是無序的沒辦法排序
l2 = [["yuan", 23, 175], ["rain", 18, 180], ["alvin", 45, 165]]
# 對誰進行排序l2  如何排序,排序規則  key
print(sorted(l2, key=my_sort))
# [['rain', 18, 180], ['yuan', 23, 175], ['alvin', 45, 165]]
print(sorted(l2, key=lambda item: item[1]))  # 使用lambda函數# [['rain', 18, 180], ['yuan', 23, 175], ['alvin', 45, 165]]# 案例2
def my_sort2(item):return item["height"]l3 = [{"name": "yuan","age": 23,"height": 175},{"name": "rain","age": 18,"height": 180},{"name": "alvin","age": 45,"height": 165},
]
print(sorted(l3, key=my_sort2))
# [{'name': 'alvin', 'age': 45, 'height': 165}, {'name': 'yuan', 'age': 23, 'height': 175}, {'name': 'rain', 'age': 18, 'height': 180}]# 由以上案例1和案例2,總結如下
t = {"ts": 1754484535355,"pageNo": 4,"pageSize": 20,"total": 2749,"KIND": "GCJS","GGTYPE": "1","timeType": "6","BeginTime": "2025-02-06 00:00:00","EndTime": "2025-08-06 23:59:59"
}# 由于字典沒辦法進行排序,所以只能先把字典轉列表
t_list = t.items()
print("::::",t_list)
# [('ts', 1754484535355), ('pageNo', 4), ('pageSize', 20), ('total', 2749), ('KIND', 'GCJS'), ('GGTYPE', '1'), ('timeType', '6'), ('BeginTime', '2025-02-06 00:00:00'), ('EndTime', '2025-08-06 23:59:59')]# 案例2
def my_sort3(item):return item[0]print(sorted(t_list,key=my_sort3))
# [('BeginTime', '2025-02-06 00:00:00'), ('EndTime', '2025-08-06 23:59:59'), ('GGTYPE', '1'), ('KIND', 'GCJS'), ('pageNo', 4), ('pageSize', 20), ('timeType', '6'), ('total', 2749), ('ts', 1754484535355)]

1.7、最終代碼:01逆向案例之Python逆向實現請求加密.py

import requests
from hashlib import md5
import timeheaders = {'Accept': 'application/json, text/plain, */*','Accept-Language': 'zh-CN,zh;q=0.9','Connection': 'keep-alive','Content-Type': 'application/json;charset=UTF-8','Origin': 'https://ggzyfw.fujian.gov.cn','Referer': 'https://ggzyfw.fujian.gov.cn/business/list/','Sec-Fetch-Dest': 'empty','Sec-Fetch-Mode': 'cors','Sec-Fetch-Site': 'same-origin','User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36',# 'portal-sign': 'af2344abf132bc8634f2fc0e28466209',    因為需要替換它,所以這個不需要了'sec-ch-ua': '"Chromium";v="128", "Not;A=Brand";v="24", "Google Chrome";v="128"','sec-ch-ua-mobile': '?0','sec-ch-ua-platform': '"Windows"',
}# 構建一個函數,用來生成sign,并且放到請求頭中
def get_sign(t):"""  一、處理“零值”for (var e in t)"" !== t[e] && void 0 !== t[e] || delete t[e];1、Python沒===2、Python 的 or 后面不能使用del命令,所以只能使用t.pop進行刪除操作3、在對列表或字典進行便利的時候,不能直接對其進行操作(增刪改),需要用t.copyt.copy()產生一個新的字典去循環便利,   t.pop()在對原始字典進行操作處理"""# 方式1:# for key in t.copy():#     print(key)  # 獲取每一個key#     t[key] != "" and t[key] != 0 or t.pop(key)# print(t)# 方式2:# 創建一個新的字典,保存更新后的數據new_t = {}for key, val in t.items():if val == "" or val == 0:continuenew_t[key] = val# print(new_t)# {'pageNo': 1, 'pageSize': 20, 'total': 2810, 'KIND': 'GCJS', 'GGTYPE': '1', 'timeType': '6', 'BeginTime': '2025-02-13 00:00:00', 'EndTime': '2025-08-13 23:59:59', 'ts': 1755068622063}# 二、排序new_t_list = new_t.items()  # 把字典轉換為列表def my_sort3(item):return item[0]# 使用sorted() 對列表進行排序ret = sorted(new_t_list, key=my_sort3)s1 = ""# 便利列表  并把列表中的每個元組的key和val進行拼接,最后在拼接成一個字符串for key, val in ret:s1 += key + str(val)  # key先和val拼接,val有可能是數字所以需要轉字符串print(s1)# BeginTime2025-02-13 00:00:00EndTime2025-08-13 23:59:59GGTYPE1KINDGCJSpageNo1pageSize20timeType6total2810ts1755068622063# 三、拼接參數字符串s2 = "B3978D054A72A7002063637CCDF6B2E5"s = s2 + s1# 四、md5值計算md5_obj = md5()  #md5_obj.update(s.encode())  # 使用s的二進制字節串,所以.encodereturn md5_obj.hexdigest()  # 返回32位的值# 創建一個main函數,把所有的業務流程放到該處
def main():json_data = {'pageNo': 1,'pageSize': 20,'total': 2810,'AREACODE': '','M_PROJECT_TYPE': '','KIND': 'GCJS','GGTYPE': '1','PROTYPE': '','timeType': '6','BeginTime': '2025-02-13 00:00:00','EndTime': '2025-08-13 23:59:59','createTime': '','ts': int(time.time() * 1000),    # 獲取當前的時間戳}# 把Python實現的加密字段替換到請求頭中sign = get_sign(json_data)print(sign)headers["portal-sign"] = signresponse = requests.post('https://ggzyfw.fujian.gov.cn/FwPortalApi/Trade/TradeInfo', headers=headers,json=json_data)print(response.text)main()

?二、入口定位:請求堆棧&&攔截器關鍵字

入口定位-- 關鍵字搜索-- 方法關鍵字-- encrypt-- decrypt-- key關鍵字(最高頻)-- headers關鍵字-- 路徑關鍵字-- 攔截器關鍵字 如果把加密的內容放到了攔截器了,就直接用這個方式搜索interceptors.request.use(func)interceptors.response.use(func)-- 請求堆棧--主要關注請求,響應無關請求入口定位,與響應無關-- hook

2.1、請求堆棧

2.1.1、什么是堆棧,堆棧如何操作

image

image

?2.1.2、堆棧中的參數傳遞

image

image

?備注:由此我們可以推出,如果當我們不知道如何定位加密參數portal_sign找不到這個字段的時候,我們只要定位到最后的一個調用,根據堆棧的請求順序,倒序的去尋找portal_sign字段是在那個函數中產生的,然后在進行解析和代碼的處理

2.1.3、如何準確搞笑的定位入口

方式一:這種方式不好用,有其他的一些接口經常干擾

image

?方式二:經常使用這種方式

image

image

image

image

image

?補充:

2d2e6f993be0969df5f7bb1a6ab646d

6533d7a6ec3829ca64c6fe52ce9e9f6

2.2、攔截器關鍵字:n.then(t.shift(), t.shift())

image

image

image

?類似以上的多個接口都是一樣的加密方式,都有portal_sign

n =?n.then(t.shift(), t.shift());攔截器

-- 攔截器關鍵字 如果把加密的內容放到了攔截器了,就直接用這個方式搜索interceptors.request.use(func)interceptors.response.use(func)

當我們判斷這個網站把接口請求解密的動作放到了攔截器中,就不要用別的關鍵字搜索了

直接搜索

image

?這是前端人員固定語法,調用的一個庫,所以直接進行搜索 攔截器關鍵詞,就可以定位到入口

image

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

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

相關文章

時序數據庫市場前景分析

1. 引言隨著物聯網&#xff08;IoT&#xff09;、工業互聯網、金融科技、智慧城市等領域的快速發展&#xff0c;數據呈現爆發式增長&#xff0c;其中時間序列數據&#xff08;Time-Series Data&#xff09;占據了重要地位。時序數據庫&#xff08;Time-Series Database, TSDB&a…

【網絡安全測試】Burp Suite使用指導、配置及常見問題介紹(有關必回)

Burp Suite 是**滲透測試領域事實上的標準工具**&#xff0c;尤其擅長Web應用與API安全測試。針對AI系統&#xff0c;它主要用于測試模型API、管理后臺等Web接口。以下是專業級使用指南&#xff1a;---### **一、 核心模塊與功能概覽**| **模塊** | **核心功能** | **AI測試重點…

iOS 26 一鍵登錄失效:三大運營商 SDK 無法正常獲取手機號

近期&#xff0c;不少開發者和用戶反饋&#xff0c;在升級到 iOS 26 系統后&#xff0c;App 內的 一鍵登錄功能無法正常使用。無論是移動、電信還是聯通的 SDK&#xff0c;都會出現無法獲取手機號的情況&#xff0c;導致用戶需要改用短信驗證碼或手動輸入手機號完成登錄。問題現…

OpenLayers與Vue.js結合實現前端地圖應用

OpenLayers與Vue.js結合實現前端地圖應用 下面我將為您展示如何將OpenLayers與Vue.js結合創建一個功能豐富的前端地圖應用。這個教程包含了基礎地圖展示、標記點、地圖控件以及交互功能。 實現結果 實現思路 在Vue項目中集成OpenLayers庫創建基礎地圖視圖和OSM圖層添加標記點…

VisDrone數據集,專為無人機視覺任務打造

在農業巡查、環保監測、安防布控等廣闊天地&#xff0c;無人機&#xff08;UAV&#xff09;早已超越了“拍照打卡”的酷炫標簽&#xff0c;成為不可或缺的智能之眼。然而&#xff0c;當計算機視覺模型從地面“抬頭”望向無人機視角時&#xff0c;迎接它的卻是截然不同的挑戰&am…

【Python】Python 函數基本介紹(詳細版)?

Python 函數基本介紹&#xff08;詳細版&#xff09;? 文章目錄Python 函數基本介紹&#xff08;詳細版&#xff09;?前言一、函數的創建?1.1 函數名的命名規則?1.2 函數的創建?1.3 函數的調用?二、函數的參數?2.1 形參和實參?2.2 位置參數?2.3 關鍵字參數?2.4 默認參…

【前端Vue】log-viewer組件的使用技巧

目錄 修改行號和組件的樣式 修改高亮顯示的內容和顏色 **log-viewer組件合集** 【前端Vue】如何優雅地展示帶行號的日志文件或文本內容&#xff08;log-viewer組件的使用&#xff09; 【前端Vue】使用log-viewer組件時的踩坑記錄 【前端Vue】log-viewer組件的使用技巧 【前…

OpenCV Python——報錯AttributeError: module ‘cv2‘ has no attribute ‘bgsegm‘,解決辦法

Python在使用 bgsubmog cv2.bgsegm.createBackgroundSubtractorMOG() 去除背景&#xff0c;報錯AttributeError: module ‘cv2‘ has no attribute ‘bgsegm‘ 報錯原因&#xff1a;使用的python環境中沒有安裝擴展包contrib 可以通過pip或者conda安裝 pip install opencv-con…

react + i18n:國際化

注意版本 我這是舊版 react react 16.8.6 i18next 20.6.1 react-i18next 11.18.6文件&#xff1a;zh.json {“hello”: "你好" }文件&#xff1a;en.json {“hello”: "hello" }文件&#xff1a;i18n.tsx import i18n from i18next; import { initRea…

lesson38:MySQL數據庫核心操作詳解:從基礎查詢到高級應用

目錄 引言 一、條件查詢&#xff1a;精準篩選數據 1.1 基本語法 1.2 比較運算符 1.3 邏輯運算符 1.4 特殊條件查詢 1.4.1 模糊查詢&#xff08;LIKE&#xff09; 1.4.2 IN和NOT IN 1.4.3 BETWEEN AND 1.4.4 IS NULL和IS NOT NULL 二、聚合函數&#xff1a;數據統計與…

【數據分析】調控網絡分析:調節因子在腫瘤樣本中的表達相關性與生存效應分析

禁止商業或二改轉載,僅供自學使用,侵權必究,如需截取部分內容請后臺聯系作者! 文章目錄 介紹 數據準備與模擬 相關性分析與邊表生成 網絡可視化 結果展示與討論 加載R包 模擬數據 Spearman 相關 -> 邊表 畫圖 所有代碼 總結 系統信息 介紹 在生物醫學研究中,N?-甲基腺…

Flask中ORM的使用

Flask中ORM的使用 本文介紹Flask中ORM框架flask_sqlalchemy的基本使用&#xff0c;包含模型定義(簡單模型&#xff0c;一對一&#xff0c;一對多&#xff0c;多對多等)&#xff0c;由于實際開發中很少使用物理外鍵&#xff0c;所有本文所有模型都不使用物理外鍵&#xff0c;而關…

FPGA即插即用Verilog驅動系列——高速12位ADC

實現功能&#xff1a;單通道ADC驅動&#xff0c;速率由驅動的時鐘決定12位數據并行&#xff0c;可輕松修改為其他位寬&#xff0c;適應不同的ADC模塊將ADC輸入的unsigned數據轉換為signed&#xff0c;便于后續FIR&#xff0c;MULTI操作匹配AXI4-STREAM協議&#xff0c;有tvalid…

DeepSeek 部署中的常見問題及解決方案:從環境配置到性能優化的全流程指南

一、引言隨著大模型技術的發展&#xff0c;以 DeepSeek 為代表的開源中文大模型&#xff0c;逐漸成為企業與開發者探索私有化部署、垂直微調、模型服務化的重要選擇。然而&#xff0c;模型部署的過程并非 “一鍵啟動” 那么簡單。從環境依賴、資源限制&#xff0c;到推理性能和…

【機器人-開發工具】ROS 2 (4)Jetson Nano 系統Ubuntu22.04安裝ROS 2 Humble版本

文章目錄1. 系統環境準備1.1. Jetpack簡介1.2. 下載Jetpack安裝系統2. 安裝ROS2 Humble2.1. ROS2 簡介2.2. ROS2 Humble對比Foxy版本2.3. 安裝2.3.1. 更新系統2.3.2. 添加 ROS 2 GPG 密鑰2.3.3. 添加 ROS 2 倉庫源2.3.4. 更新軟件包索引2.3.5. 安裝 ROS 2 Humble 桌面版&#x…

2025年Java大廠面試場景題全解析:高頻考點與實戰攻略

一、2025年Java面試新趨勢與技術棧變化2025年的Java技術生態呈現出明顯的云原生與AI集成趨勢&#xff0c;各大互聯網公司在面試中更加注重候選人對新技術棧的掌握程度和實戰應用能力。1.1 技術棧升級趨勢分析根據最新統計數據&#xff0c;2025年Java面試的技術考察點分布如下&a…

TCP客戶端Linux網絡編程設計詳解

一、TCP 客戶端設計流程TCP客戶端模式的程序設計流程主要分為&#xff1a;套接字初始化( socket()函數)&#xff0c;連接目標網絡服務器 (connect()函數)&#xff0c;向服務器端寫入數據&#xff08;write()函數&#xff09;1、socket() 函數#include <sys/types.h> …

webpack》》

Webpark 介紹 官網 Webpack的功能 在現代前端開發中,我們會使用模塊化、Sass、TypeScript、圖片、字體等資源。但瀏覽器并不天然支持這些格式,因此我們需要工具將它們打包、轉換成瀏覽器能識別的文件格式。Webpack 就是這樣一個強大的前端構建工具。 Webpack 是一個現代 J…

軟件測評中HTTP 安全頭的配置與測試規范

服務器若缺乏必要的安全頭配置&#xff0c;其安全防護能力將大幅降低。X-Content-Type-Options 作為基礎安全頭&#xff0c;需設置 nosniff 參數&#xff0c;以阻止瀏覽器對 MIME 類型進行自主猜測&#xff0c;避免 text/css 等資源被誤當作腳本執行&#xff0c;從源頭切斷此類…

5G專網項目外場常見業務測試指南(六)-PingInfoView

5G項目必然涉及到終端用戶的使用&#xff0c;終端使用情況測試最常用的手段就是長時間7*24小時長ping&#xff0c;對于一個有著幾百用戶的5G專網&#xff0c;我們常用的ping工具-PingInfoView。 PingInfoView是一款輕量級工具&#xff0c;用于同時對多個IP地址或主機名執行持續…