深度解析:用Python爬虫逆向破解某查查加密数据!

大家好!我是爱摸鱼的小鸿,关注我,收看编程干货。

本期文章将带你详细地逆向解析某查查 加密数据的构造逻辑,Follow me~

特别声明 :本篇文章仅供学习与研究使用,不用做任何非法用途,请大家遵守相关法律法规
作者:Maker陈,本文字数:1.2k,阅读时长≈2分钟

目录

一、逆向目标

逆向网站:

python 复制代码
aHR0cHM6Ly93d3cuaGFuZ2hhbmdjaGEuY29t

逆向接口:

python 复制代码
aHR0cHM6Ly9hcGkuaGFuZ2hhbmdjaGEuY29tL2hoYy9hbm9ueW1vdXMvaW52ZXN0L2dldFRvcFRlbk5ld3M/ZmlsdGVyPSU3QiUyMnNraXAlMjIlM0EwJTJDJTIybGltaXQlMjIlM0EyMCU3RA==

二、前期准备

欲行其事,必先利其器,本期逆向实战需要2个第三方库:

用于模拟接口请求的库:

python 复制代码
pip install requests

用于数据加密或解密算法的库:

python 复制代码
pip install pycryptodome

三、逆向分析

使用开发者工具,切换到network面板,找到目标接口:

发现响应数据是加密过的:

全局搜索是进行逆向分析最简单直接的方法,那么使用什么关键词进行全局搜索呢?

如果使用响应数据字段data进行全局搜索肯定不太行,既然我们想要的是最后的解密数据,可以先使用关键词decrypt 进行全局搜索,并在定义位置和return位置打上断点执行:

我们发现Decrypt函数就是解密函数,该函数有两个形参word和keyStr,word就是加密过的响应数据,而keyStr是写死的字符串:

python 复制代码
3sd&d24h@$udD2s

并且函数中可直观地看到,解密使用的是AES,模式是ECB,填充方式为Pkcs7

而这种解密方式可以直接通过pycryptodome 库完成解密过程,不用再模拟执行JS了,至此逆向分析解密算法完成

四、Python实现解密算法

解密过程我们已经分析好了,先用Python简单写一下;

python 复制代码
import base64
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad, unpad


def aes_decrypt(padding=None, encrypt_str=None, key_str=None, mode=None):
    key_str = key_str.encode('utf-8')
    aes = AES.new(key_str, mode)
    
    encrypt_str = base64.b64decode(encrypt_str)
    decrypt_str = aes.decrypt(encrypt_str).decode('utf-8')

    return decrypt_str

再用requests模拟请求看一下解密数据:

python 复制代码
import requests
import urllib3
from urllib.parse import quote

urllib3.disable_warnings()


key = '3sd&d24h@$udD2s*'
headers = {
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36'
}
condition = '{"skip":0,"limit":20}'
api = f'https://*/hhc/anonymous/invest/getTopTenNews?filter={quote(condition)}'
res = requests.get(api, headers=headers, verify=False).json()
data = res.get('data')
data = aes_decrypt(padding='pkcs7', encrypt_str=data, key_str=key, mode=AES.MODE_ECB)
print(data)

运行看一下数据格式:

成功解密,返回数据类型是str类型,在数据的最后我们发现有一个类似省略号的东西,字符长度为11,我们需要把这个东西去掉,才能较方面的转换为JSON对象并解析,有三种方式可解决:

python 复制代码
#第一种解决方式
length = ord(decrypt_str[-1])
return decrypt_str[:-length]

#第二种解决方式
return decrypt_str[:-11]

#第三种解决方式
return decrypt_str.replace('           ', '')

去掉这个麻烦的东西以后就可以转换为JSON对象获取数据了:

python 复制代码
import json

json_object = json.loads(data)
for d in json_object['data']['data']:
    print(d, '\n')

数据变得可观了许多;

如果您对爬虫逆向感兴趣、想要深入了解或者有疑问,欢迎与我进行学习与交流。

五、作者Info

Author:小鸿的摸鱼日常,Goal:让编程更有趣!

专注于算法、爬虫,Web开发,数据分析、自然语言处理,AI等,期待你的关注,让我们一起成长、一起Coding!

版权说明:本文禁止抄袭、转载,侵权必究!

相关推荐
数据智能老司机3 小时前
精通 Python 设计模式——分布式系统模式
python·设计模式·架构
数据智能老司机4 小时前
精通 Python 设计模式——并发与异步模式
python·设计模式·编程语言
数据智能老司机4 小时前
精通 Python 设计模式——测试模式
python·设计模式·架构
数据智能老司机4 小时前
精通 Python 设计模式——性能模式
python·设计模式·架构
c8i5 小时前
drf初步梳理
python·django
每日AI新事件5 小时前
python的异步函数
python
这里有鱼汤6 小时前
miniQMT下载历史行情数据太慢怎么办?一招提速10倍!
前端·python
databook15 小时前
Manim实现脉冲闪烁特效
后端·python·动效
程序设计实验室15 小时前
2025年了,在 Django 之外,Python Web 框架还能怎么选?
python
倔强青铜三17 小时前
苦练Python第46天:文件写入与上下文管理器
人工智能·python·面试