python爬虫-逆向实例小记-1

注意!!!!某政府网站逆向实例仅作为学习案例,禁止其他个人以及团体做谋利用途!!!!

案例分析

第一步:下图标注出来的是获取请求断点,断点出自 请求url

python爬虫-逆向实例小记-1_第1张图片

 第二步:有点玄学了(鄙人才疏学浅,所以会通篇进行手动实现响应这个过程可以看到一些重要信息)。手动实现断点后响应过程

python爬虫-逆向实例小记-1_第2张图片

第三步:通过手动进行下一步会得到每一步的操作后的内容(与调试debug是一样的)

python爬虫-逆向实例小记-1_第3张图片

 第四步:从一大串响应内容到得到页面正常的内容,调用了f m(t)函数, 鼠标放在该位置,会得到相关的.js 文件。点进去即可

python爬虫-逆向实例小记-1_第4张图片

第五步:展示一下: f m(t) 函数。通过这个函数可以很肯定的是,使用了AES CBC模式pkcs7 填充。从下图可知,f 是key ,h 是偏移量(vi),  n 是通过hex 和base64 包装后的一大串内容

python爬虫-逆向实例小记-1_第5张图片

第六步:一步一步执行,就可以看到从“乱码”到内容的关键过程。

python爬虫-逆向实例小记-1_第6张图片

 代码

python AES部分参考https://blog.csdn.net/yt_xy/article/details/108863258 博主

# 十六进制转base64
import codecs
hex_string = ''    # 十六进制数值
b64_string = codecs.encode(codecs.decode(hex_string, 'hex'), 'base64').decode()

# 解密
# !!!!!!!!
# 本人参考https://blog.csdn.net/yt_xy/article/details/108863258 博主
from Crypto.Cipher import AES
import base64
class Encrypt:
    def __init__(self, key, iv):
        self.key = key.encode('utf-8')
        self.iv = iv.encode('utf-8')

    # @staticmethod
    def pkcs7padding(self, text):
        """明文使用PKCS7填充 """
        bs = 16
        length = len(text)
        bytes_length = len(text.encode('utf-8'))
        padding_size = length if (bytes_length == length) else bytes_length
        padding = bs - padding_size % bs
        padding_text = chr(padding) * padding
        self.coding = chr(padding)
        return text + padding_text

    def aes_encrypt(self, content):
        """ AES加密 """
        cipher = AES.new(self.key, AES.MODE_CBC, self.iv)
        # 处理明文
        content_padding = self.pkcs7padding(content)
        # 加密
        encrypt_bytes = cipher.encrypt(content_padding.encode('utf-8'))
        # 重新编码
        result = str(base64.b64encode(encrypt_bytes), encoding='utf-8')
        return result


    def aes_decrypt(self, content):
        """AES解密 """
        self.pkcs7padding(content)
        cipher = AES.new(self.key, AES.MODE_CBC, self.iv)
        content = base64.b64decode(content)
        text = cipher.decrypt(content).decode('utf-8')
        return text.rstrip(self.coding)

if __name__ == '__main__':
    key = '******'
    iv = '****'
    a = Encrypt(key=key, iv=iv)
    d = a.aes_decrypt(b64_string)
    print("解密:", d)

仅作为笔记记录,如有问题请各位大佬来指导

你可能感兴趣的:(Python,python,爬虫)