zoukankan      html  css  js  c++  java
  • js加密(六)QB.com

    1. url: https://notice.qb.com/detail?noticeId=256

    2. target: 

     3. 分析:

    3.1 打开网址,刷新页面,看看都发送了哪些请求。

     看到了发送了一些Ajax请求,其中第一个就是我们需要的。下面就对这个请求进行剖析。

    3.2 首先,它是一个post请求:

     多刷新几次就会发现,有两个参数是动态的,一个ts,很明显是十位的时间戳,不用管它。另一个sig,就是我们需要破解的。

     3.3 遇到这种加密参数,首先想到的就是进行直接搜索,看看哪些js中涉及到,一般直接return到加密参数相关的,就是我们要找的js代码。

    搜索:

     3.4 接着,我们找到了这个:

    看起来有点像,那就试试看吧,把几个相关的变量打上断点。

    执行到这里,发现m.sig的值已经出来了,记录一下。调试完毕,最后看看post请求的sig值和记录的值是否一致,发现是一致的。

    省略调试过程。

    3.5 接下来就剩下解密这段js了。看过程结合js代码,是对“_”的值进行了md5加密,再进行md5加密,再来一个sha256加密,而“_”的值就在上面:

     "a=at&appId=0&con=1&device=Windows+10&deviceId=Chrome79.0.3945.88&id=256&la=1&p=0&ps=10&reqLang=0&ts=1577196094&ty=0&version=1.6.2370f239020d3a28b8d24ba1706f2dd7c03dcaa2fa5e7a077f1f517e5f2d3a68a1"

    多调试几遍,就会发现这个变量只有一个ts参数是变的,别的都不变。而ts就是一个时间戳而已,用的时候拼接一下。接下来去编写python程序。

    4. 代码:

    import json
    import time
    import hashlib
    import requests
    import re
    from afterWork.config import userAgent, proxies
    
    def myMd5(value):
        return hashlib.md5(value.encode('utf-8')).hexdigest()
    
    def mySha256(value):
        return hashlib.sha256(value.encode('utf-8')).hexdigest()
    
    def getSig():
        # 15771 80402
        ts = time.time()
        # print('1577180402')
        # print(str(ts)[:10])
        sig = 'a=at&appId=0&con=1&device=Windows+10&deviceId=Chrome79.0.3945.88&id=256&la=1&p=0&ps=10&reqLang=0&ts={}&ty=0&version=1.6.2370f239020d3a28b8d24ba1706f2dd7c03dcaa2fa5e7a077f1f517e5f2d3a68a1'.format(ts)
        return ts, mySha256(myMd5(myMd5(sig)))
    
    def getData():
        ts, sig = getSig()
        d1 = {'id': 256,
              'ty': 0,
              'con': 1,
              'p': 0,
              'ps': 10,
              'la': 1}
        data = {
            "a": "at",
            "d": d1,
            "ts": ts,
            "reqLang": 0,
            "appId": 0,
            "device": "Windows 10",
            "deviceId": "Chrome79.0.3945.88",
            "version": "1.6.23",
            "sig": sig
        }
        # return data
        return json.dumps(data)
    
    def getInfo(url):
        # print(type(getData()))
        res = requests.post(url=url,
                            data=getData(),
                            # headers={'User-Agent': userAgent.random()},
                            proxies=proxies,
                            timeout=10)
        print(json.loads(res.text)['d']['d'][0]['su'])
        print(re.sub(r'<.*?>', '', json.loads(res.text)['d']['d'][0]['cnt']))
    
    if __name__ == '__main__':
        url = 'https://api.qb.com/v1/common/'
        getInfo(url)

    结果:

     学习研究,勿作他用。

  • 相关阅读:
    C# BackGroundWorker控件演示代码
    C#多线程池演示例程下载图片
    反流技术之IE插件技术研究第二部分
    C# 从剪贴板中读取HTML中的中文字符出现乱码问题的解决方案
    C#单线程演示程序带参数
    C# 中as和is的用法总结
    Delphi关于记录文件的操作
    用PowerDesigner创建Access数据库
    常用Delphi开发资料网址
    等待外部应用程序的执行结果
  • 原文地址:https://www.cnblogs.com/zrmw/p/12093862.html
Copyright © 2011-2022 走看看