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

共 5292字,需浏览 11分钟

 ·

2023-07-28 11:51

大家好,我是安果!

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

面对这种情况,我们需要分析源码,找到前端的解密逻辑,使用 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 逆向之字体反爬(下)

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


END


好文和朋友一起看~

浏览 1968
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报