老飞机 发表于 2020-4-12 19:30

分析并破解某猫网站js数据接口请求参数加密

============================================================================================================================
            1:手把手交小白破解js加密
    2:主角:



   今天发现国内某猫网站数据挺诱人{:1_886:},反手给它抓了个包{:1_900:},哦豁下面图中是什么。好慌

            




















不皮了;现在开始分析:
===================================================防偷窥{:1_886:}===========================================================================
有点意思,它的参数是加密的





干它就完事了:
ctrl+shift+f 调出全局搜索框,直接搜索网站后半截:/api/banner/index进去到js里面





点击下面{}可以优化代码




这有个参数很眼熟;

仔细看看这不就是请求的参数??

============================================================================================================================
长长的一串真的好慌;接下来就是硬给它下几个断点


出来了好多{:1_894:},慢慢分析



继续进行断点



接下来怎么办

它在m这个变量完成了加密




============================================================================================================================


不慌,先屡一下思路
仔细想了想:它在m这个变量完成了加密,我们直接找到调用它的方法不就行了??


鼠标移到s这,等它弹出这个框框,然后鼠标右击Show function definition进去它的方法;




============================================================================================================================


这个是什么???



进来可以看到;秘钥和偏移,以及加密方法

加密方法:AES/CBC/Pkcs7Padding/HEX

o = r.a.enc.Utf8.parse("x;j/6olSp})&{ZJD")
a = r.a.enc.Utf8.parse("znbV%$JN5olCpt<c");

mode: r.a.mode.CBC
padding: r.a.pad.Pkcs7


============================================================================================================================


接下来回到原来那串不知道什么鬼的长长一串data参数


随便找个cbc解密网站:https://www.ssleye.com/aes_cipher.html


可以看到,解密出来没问题,和断点是看到的一模一样




============================================================================================================================


又发现问题了,这个signature又是什么鬼??



带着问题回到原来的断点位置,仔细分析一波:




这个不就是signature值


既然找到了原型,可以看到,开始是那么长的一串,经过了不知道什么的加密,变成了短短的32位。
各位应该想到了{:1_886:},这个不就是md5??


接下来找一个在线加密网站测试一下。

一毛一样,加密参数解决了,接下来用Python代码尝试一下请求




============================================================================================================================


没毛病,请求出来了





接下来就是给数据解密了,首先我们去看看,在第三方网站能不能解密出来:




OK,py代码解密也是没有问题。

============================================================================================================================


AES/CBC/PKCS7Padding 解密代码:
from Crypto.Cipher import AESfrom binascii import b2a_hex, a2b_hex
from cryptography.hazmat.primitives import padding
from cryptography.hazmat.primitives.ciphers import algorithms

'''
AES/CBC/PKCS7Padding 加密解密
环境需求:
pip3 install pycryptodome
'''


class PrpCrypt(object):

    def __init__(self):
      self.key = '625202f9149e061d'.encode('utf-8')
      self.mode = AES.MODE_CBC
      self.iv = b'5efd3f6060e20330'
      # block_size 128位

    # 加密函数,如果text不足16位就用空格补足为16位,
    # 如果大于16但是不是16的倍数,那就补足为16的倍数。
    def encrypt(self, text):
      cryptor = AES.new(self.key, self.mode, self.iv)
      text = text.encode('utf-8')

      # 这里密钥key 长度必须为16(AES-128),24(AES-192),或者32 (AES-256)Bytes 长度
      # 目前AES-128 足够目前使用

      text = self.pkcs7_padding(text)

      self.ciphertext = cryptor.encrypt(text)

      # 因为AES加密时候得到的字符串不一定是ascii字符集的,输出到终端或者保存时候可能存在问题
      # 所以这里统一把加密后的字符串转化为16进制字符串
      return b2a_hex(self.ciphertext).decode().upper()

    @staticmethod
    def pkcs7_padding(data):
      if not isinstance(data, bytes):
            data = data.encode()

      padder = padding.PKCS7(algorithms.AES.block_size).padder()

      padded_data = padder.update(data) + padder.finalize()

      return padded_data


    # 解密后,去掉补足的空格用strip() 去掉
    def decrypt(self, text):
      #偏移量'iv'
      cryptor = AES.new(self.key, self.mode, self.iv)
      plain_text = cryptor.decrypt(a2b_hex(text))
      # return plain_text.rstrip('\0')
      return bytes.decode(plain_text).rstrip("\x01"). \
            rstrip("\x02").rstrip("\x03").rstrip("\x04").rstrip("\x05"). \
            rstrip("\x06").rstrip("\x07").rstrip("\x08").rstrip("\x09"). \
            rstrip("\x0a").rstrip("\x0b").rstrip("\x0c").rstrip("\x0d"). \
            rstrip("\x0e").rstrip("\x0f").rstrip("\x10")


# 加解密
if __name__ == '__main__':
    pc = PrpCrypt()
    a = '{"kind_id":"","page":1,"label_id":"","writer_id":"","date":""}'
    print("加密前:%s" % a)
    b = pc.encrypt(a)
    print("加密后:%s" % b)
    print("大写变小写:%s" % b.lower())
    v = pc.decrypt('0DB0A472B06172ED60E35371ABA83D8182AB92B58ADA52C1B746643210B40C883E568A3D29C202D1AE82952434E4029DE1C6121A29315B3815FEBCCAB4C06D8F')
    print('解密后',v)








============================================================================================================================


最后:

加密方法:AES/CBC/Pkcs7Padding/HEX
key:x;j/6olSp})&{ZJD

iv :znbV%$JN5olCpt<c

涉及违规
想要源码的大伙可以去Github上面搜索

时光书窝 发表于 2020-4-12 19:40

伤身体还是算了算了

老飞机 发表于 2021-5-14 14:41

本帖最后由 老飞机 于 2021-5-15 19:19 编辑

wannabe 发表于 2021-5-10 20:19
膜拜大佬,达到可以帮忙看看这个p的值不,地址:https://z1.m1907.cn/?jx=https://v.qq.com/x/cover/mcv8hk ...
import time
import hashlib
import requests

def MD5(str):
    md = hashlib.md5()
    md.update(str.encode(encoding='utf-8'))
    return md.hexdigest()


def Get_Time():
    l = time.time()*1000
    u = 6e4 * -480
    d = l + u + 36e5 * 8
    time_local = time.localtime(d / 1000)
    # 转换成新的时间格式(精确到秒)
    dt = time.strftime("%m", time_local)
    return int(dt) + 11397


def Get_M3u8():
    url = "https://z1.m1907.cn/api/v/?"
    today = time.strftime("%d", time.localtime(time.time()))
    z = MD5(str(int(today) + 9 + 9 ^ 10))
    z = MD5(z)
    params = {
            "z" : z,
            "jx" : "https://v.qq.com/x/cover/mcv8hkc8zk8lnov/z0036hyi31y.html",
            "s1ig" : Get_Time(),
            "g" : "",
            }
    response = requests.get(url , params = params).json()
    print(response)

Get_M3u8()

随心的我 发表于 2020-4-12 19:34

666,学习了

i52088 发表于 2020-4-12 19:36

大佬大佬学习了

夜陌 发表于 2020-4-12 19:40

视频源去水印 能扒拉下来?自己写了一个采集程序 能采集出来 就是有水印 能解决吗没研究过网页解密

mosou 发表于 2020-4-12 19:43

github地址 或者搜啥

老飞机 发表于 2020-4-12 19:45

mosou 发表于 2020-4-12 19:43
github地址 或者搜啥

zg10472580我的用户名

老飞机 发表于 2020-4-12 19:46

夜陌 发表于 2020-4-12 19:40
视频源去水印 能扒拉下来?自己写了一个采集程序 能采集出来 就是有水印 能解决吗没研究过网页解密

这东西用户上传的的时候好像就是有水印了的,没研究过

mosou 发表于 2020-4-12 19:52

mosou 发表于 2020-4-12 19:43
github地址 或者搜啥

已给star 啥时候解密手淘xsign的时候@下我 付费学

A00 发表于 2020-4-12 19:53

学习了,谢谢
页: [1] 2 3 4 5 6 7 8
查看完整版本: 分析并破解某猫网站js数据接口请求参数加密