一、逆向案例之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地址或主机名执行持续…