破解响应加密:Python 与 JS 逆向结合的最佳实践 您所在的位置:网站首页 python加密解密进度条 破解响应加密:Python 与 JS 逆向结合的最佳实践

破解响应加密:Python 与 JS 逆向结合的最佳实践

2024-04-16 00:03| 来源: 网络整理| 查看: 265

大家好,我是安果!

有些网站为了增强数据的安全性,针对接口的响应值做了一层加密,这样我们没法直接通过接口调用获取有效的数据

面对这种情况,我们需要分析源码,找到前端的解密逻辑,使用 Python 改写一下即可

本篇文章将通过一个简单的实例进行讲解

目标对象:

aHR0cHM6Ly93d3cuaGFuZ2hhbmdjaGEuY29tL2luZHVzdHJ5

具体操作步骤如下:

1-1 安装依赖

# 安装依赖 pip3 install pycryptodome

1-2 分析加密逻辑

打开目标网站,通过关键字搜索数据报告,发现响应中的 data 值是加密的

由于关键字 data 不易于全局查找解密逻辑,这里使用关键字 decrypt 在 Source 面板全局进行查询(Ctrl+Shift+F)

然后在上面搜索到的所有代码块处都新增一个断点,通过通过搜索再次触发一次请求,定位到下面的解密逻辑

我们发现解密使用的是: AES(对称加密),模式是 ECB,填充方式为 Pkcs7,另外密钥 key 通过调试也能拿到

1-3 AES 解密(Python)

首先,利用 Python 实现 AES 的解密逻辑

import requests import base64 from Crypto.Cipher import AES from Crypto.Util.Padding import pad, unpad class AESObject(object): def __init__(self, block_size=16): self.__block_size = block_size # AES解密 def aes_decrypt(self, padding: str, content: str, key: str, mode, *args): key = key.encode('utf-8') aes = AES.new(key, mode, *args) content = base64.b64decode(content) # 解密 content_raw = aes.decrypt(content).decode('utf-8') if padding == 'zero': return content_raw pad_ = ord(content_raw[-1]) return content_raw[:-pad_]

然后,通过请求获取加密内容,调用上面的方法进行解密

def get_info(): url = "https://**/hhc/industry/articleWithTags?filter=%7B%22title%22%3A%221%22%2C%22keyword%22%3A%221%22%2C%22sortType%22%3Anull%2C%22limit%22%3A9%2C%22skip%22%3A0%2C%22userId%22%3A4220972%7D" payload = {} headers = { 'Accept': 'application/json, text/javascript, */*; q=0.01', 'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8', 'Auth-Plus': '', 'Connection': 'keep-alive', 'Origin': 'https://**', 'Sec-Fetch-Dest': 'empty', 'Sec-Fetch-Mode': 'cors', 'Sec-Fetch-Site': 'same-site', 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36', 'X-Requested-With': 'XMLHttpRequest', 'clientInfo': 'web', 'clientVersion': '1.0.2', 'currentHref': 'https://**/industry', 'sec-ch-ua': '"Not.A/Brand";v="8", "Chromium";v="114", "Google Chrome";v="114"', 'sec-ch-ua-mobile': '?0', 'sec-ch-ua-platform': '"Windows"', 'Cookie': '登录后获取的ck' } # 加密内容data data = requests.request("GET", url, headers=headers, data=payload).json()['data'] # AES加密 key = '调试拿到的key' aESObject = AESObject(block_size=16) # 解密 data_de = aESObject.aes_decrypt('pkcs7', data, key, AES.MODE_ECB) print(data_de)

PS:这里只针对填充方式为 Pkcs7 做了处理,如果为其他填充模式,可以自行进行改写

如果你觉得文章还不错,请大家 点赞、分享、留言 下,因为这将是我持续输出更多优质文章的最强动力!

推荐阅读

5 分钟,教你从零快速编写一个油猴脚本!

Python 绝招:解锁小红书信息流的无限潜力!

反爬篇 | 手把手教你处理 JS 逆向之字体反爬(下)

休闲时光:最近上映的电影与爬虫世界,带您彻底放松!



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有