• 【爬虫进阶】易班登录加密逆向


    前言

    demo比较简单,逆向难点:rsa加密,图片验证码

    分析

    在这里插入图片描述我们模拟登录,请求一下
    在这里插入图片描述
    红框内是我们提交的参数,password看上去应该是rsa加密,captcha是验证码,keysTime是一个时间戳,account是手机号。
    在这里插入图片描述
    全局搜索一个参数,点进去找找加密位置。
    在这里插入图片描述
    找到加密位置,下断点,再次请求后,开始调式。

    在这里插入图片描述
    搜索g_param,找到time生成方法,看上去像是写在网页里面,在网页上搜索一下。

    在这里插入图片描述
    果然是保存在网页中,上面应该是rsa公钥,一举两得,下面接着逆向password。
    在这里插入图片描述
    搜索password,找到加密位置。
    在这里插入图片描述
    继续跟进。
    在这里插入图片描述
    这里有两种方法:1,把加密方法全部扣下来 2,安装node第三方库node-jsencrypt,建议使用第二种,方便省事。
    在这里插入图片描述

    到此为止加密参数就算全部解析完毕,下面讲验证码。

    在这里插入图片描述
    随机提取一个验证码,保存到本地。

    在这里插入图片描述
    因为验证码不算复杂,用ddddocr识别即可,识别率还可以。

    代码过程

    首先我们把网页中的信息提取出来:key、key_time、图片链接

    import requests
    from lxml import etree
    
    session = requests.session()
    headers = {
        'User-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.0.0 Safari/537.36'
    }
    
    def get_params():
        url = 'https://www.yiban.cn/login?go=https%3A%2F%2Fwww.yiban.cn%2F'
        res = session.get(url,headers=headers).text
        html = etree.HTML(res)
        key = html.xpath('//div[@class="login-cont"]/ul/@data-keys')[0] # 秘钥
        time = html.xpath('//div[@class="login-cont"]/ul/@data-keys-time')[0] #时间戳
        img = html.xpath('//img[@class="captcha"]/@src')[0]
        img_url = 'https://www.yiban.cn/' + img  # 图片链接
        img_res = requests.get(img_url).content 
        flie_name = './img/VerifyCode.png' # 路径
        
        # 保存验证码
        with open(flie_name, 'wb') as f:
            f.write(img_res)
            
        print(key,time,img_url)
        return key, time
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    拿到上面数据之后,该加密的加密,该识别的识别

    import ddddocr
    import requests
    from lxml import etree
    import execjs
    from loguru import logger
    
    logger.add("./logs/yiban.log", rotation='00:00', level="WARNING", encoding='utf-8')
    
    session = requests.session()
    headers = {
        'User-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.0.0 Safari/537.36',
    }
    
    def recognize(image):
        ocr = ddddocr.DdddOcr()
        with open(image, 'rb') as f:
            img_bytes = f.read()
        res = ocr.classification(img_bytes)
    
        return res
    
    def spider(user,pwd):
        url = 'https://www.yiban.cn/login/doLoginAjax'
        key,time = get_params() 
        captcha = recognize('./img/VerifyCode.png')  # 识别验证码
        logger.debug(f'验证码:{captcha}')
        with open('yiban.js','r') as f:
            f_data = f.read()
        js_data = execjs.compile(f_data).call('EncryptPassword',key,pwd)  # js加密
        logger.debug(f'密码加密:{js_data}')
        data = {
            'account': user,
            'password':js_data,
            'captcha': captcha,
            'keysTime': time,
        }
        res = session.post(url,headers=headers,data=data).json()
        logger.debug(f'结果:{res}')
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39

    时间戳后台会验证,所以要一定用session

    結果

    因为我没注册账号,为了测试,随便填写的手机号,报以下错误,说明逆向思路没问题。
    在这里插入图片描述
    如果不用session,结果会怎样呢?

    在这里插入图片描述
    不多解释,不懂的,可以看下我那篇讲解session的文章,大家找一下。

    完整代码

    import ddddocr
    import requests
    from lxml import etree
    import execjs
    from loguru import logger
    
    logger.add("./logs/yiban.log", rotation='00:00', level="WARNING", encoding='utf-8')
    
    session = requests.session()
    headers = {
        'User-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.0.0 Safari/537.36',
    }
    
    
    def recognize(image):
        ocr = ddddocr.DdddOcr()
        with open(image, 'rb') as f:
            img_bytes = f.read()
        res = ocr.classification(img_bytes)
    
        return res
    
    def get_params():
        url = 'https://www.yiban.cn/login?go=https%3A%2F%2Fwww.yiban.cn%2F'
        res = session.get(url,headers=headers).text
        html = etree.HTML(res)
        key = html.xpath('//div[@class="login-cont"]/ul/@data-keys')[0] # 秘钥
        time = html.xpath('//div[@class="login-cont"]/ul/@data-keys-time')[0] #时间戳
        img = html.xpath('//img[@class="captcha"]/@src')[0]
        img_url = 'https://www.yiban.cn/' + img  # 图片链接
        img_res = requests.get(img_url).content
        flie_name = './img/VerifyCode.png' # 路径
    
        # 保存验证码
        with open(flie_name, 'wb') as f:
            f.write(img_res)
    
        logger.debug(f'key:{key},key_time:{time},img_url:{img_url}')
        return key, time
    
    def spider(user,pwd):
        url = 'https://www.yiban.cn/login/doLoginAjax'
        key,time = get_params()
        captcha = recognize('./img/VerifyCode.png')
        logger.debug(f'验证码:{captcha}')
        with open('yiban.js','r') as f:
            f_data = f.read()
        js_data = execjs.compile(f_data).call('EncryptPassword',key,pwd)
        logger.debug(f'密码加密:{js_data}')
        data = {
            'account': user,
            'password':js_data,
            'captcha': captcha,
            'keysTime': time,
        }
        res = requests.post(url,headers=headers,data=data).json()
        logger.debug(f'结果:{res}')
    
    
    user = '18576543215'
    pwd = '######'
    spider(user,pwd)
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
  • 相关阅读:
    ORB-SLAM3算法学习—Frame构造—ORB特征提取和BRIEF描述子计算
    阿里云易立:以云原生之力,实现大模型时代基础设施能力跃升 | KubeCon 主论坛分享
    牛客网SQL159
    Java连接数据库(JDBC非常重要)
    MySQL的MHA
    【关于ensp的bug】关于网传mac地址颠倒学习的现象
    linux常用指令==Linux操作系统4
    SA8155P Flat Build QFIL刷机
    Redis高可用的主从复制、哨兵、cluster集群
    神经网络编译器TVM
  • 原文地址:https://blog.csdn.net/fun_sn/article/details/128020992