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

news2025/8/11 14:08:50

目录

  • 前言
    • 分析
    • 代码过程
    • 結果
    • 完整代码

前言

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

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

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}')

时间戳后台会验证,所以要一定用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)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/33790.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

GO面试一定要看看这些面试题

Go核心特性 1.goroutine 协程是用户态轻量级线程,它是线程调度的基本单位。 使用者分配足够多的任务,系统能自动帮助使用者把任务分配到 CPU 上,让这些任务尽量并发运作。这种机制在 Go语言中被称为 goroutine(协程&#xff09…

【javaEE】网络原理(网络层)

努力经营当下,直至未来明朗 文章目录前言一、网络层简述【IP协议】THINK前言 一个人最大的痛苦来源于对自己无能的愤怒 Hi,这里是不想秃头的宝贝儿! 本文主要介绍【网络层】,其中最关键的就是【IP协议】。(同样&…

【天池竞赛】心跳数据挖掘

天池学习赛 心跳数据挖掘 168分攻略 Chapter 1. 赛题解析 就如比赛界面所介绍的一般,这里再复述一遍 本次新人赛是Datawhale与天池联合发起的0基础入门系列赛事 —— 心跳信号分类预测。赛题以心电图心跳信号数据为背景,要求选手根据心电图感应数据预测…

【序列召回推荐】(task4)多兴趣召回实践:MIND(更新中)

note 阿里的序列召回MIND模型:引入了胶囊网络,将胶囊网络的动态路由算法引入到了用户的多兴趣建模上,通过B2I动态路由很好的从用户的原始行为序列中提取出用户的多种兴趣表征。在离线训练阶段,通过提出Label-Aware Attention详细…

Lifecycle 生命周期组件的那些事

引言 在2022的今天,AndroidX 普遍的情况下,JetPack Lifecycle 也早已经成为了开发中的基础设施,小到 View(扩展库) ,大到 Activity,都隐藏着它的身影,而了解 Lifecycle 也正是理解 JetPack 组件系列库生命感知设计的基…

D-013 蜂鸣器硬件电路设计

蜂鸣器硬件电路设计1 简介2 蜂鸣器电路设计1 简介 蜂鸣器是一种一体化结构的电子讯响器,采用直流电压供电,广泛应用于计算机、打印机、复印机、报警器、电子玩具、汽车电子设备、电话机、定时器等电子产品中做发声器件。 蜂鸣器的分类:压电…

【ASM】字节码操作 工具类与常用类 AnalyzerAdapter初步介绍

文章目录 1.概述1.1 第一句话1.2 第二句话2. AnalyzerAdapter2.1 class info2.2 fields2.3 constructors2.4 methods2.4.1 execute方法2.4.2 return和throw2.4.3 jump2.4.4 visitFrame方法2.4.5 new和invokespecial1.概述 在上一篇文章:

创建KVM虚拟机公共镜像

手动配置kvm教程: https://blog.csdn.net/nvd11/article/details/127435990 但是毕竟每次创建新的虚拟机时,还要装一次系统比较麻烦。 打算做个公共的ubuntu镜像出来。 目标: NoDESCcpu数内存第一步创建虚拟机vm128g第二步创建虚拟机镜像文…

第五章《类的继承》第1节:继承的概念与实现方式

继承是面向对象最显著的一个特性,它是以已存在的类为基础定义新类的技术,新的类可以继承已有类的属性和方法,也可以增加新的类成员。 5.1.1什么是继承 在现实生活中,一类事物往往都可以划分成更小的类别。例如:“人”就是一类事物,按照人的身份和职业,可以把人划分成学…

SSTV慢速扫描的几种模式优劣对比

下面使用的图片是我自己拍摄的照片,无版权问题 原图: 扫描环境: 家中客厅,窗户打开,窗外有鸟叫和人声.模拟了介于野外和户外之间的环境 ,两部设备相隔1厘米,音量35%,所有测试下来设备未移动. Martin1 模式 : 扫描时长: 1分55秒 扫描后图片 Martin2 模式 : 扫描时长: 58秒…

Pywinauto的安装及使用

目录 1.pywinauto简单介绍 2.pywinauto的安装 3. 通过启动windows自带记事本,检查是否可正常使用 1.pywinauto简单介绍 pywinauto是一组用于自动化测试脚本的python模块,用于自动化Microsoft Windows GUI。它允许将鼠标和键盘操作发送到windows对话框…

基于JSP的企业固定资产管理系统【数据库设计、源码、开题报告】

数据库脚本下载地址: https://download.csdn.net/download/itrjxxs_com/86466989 主要使用技术 SpringStruts2HibernateJSPCSSJSMysql 功能介绍 固定资产管理系统是对高校固定资产的一个信息化管理系统,基本功能包括: 对固定资产的购进、…

基于遥感和GIS技术的生态承载力评价的解决方案

生态承载力的概念最早来自于生态学。1921年,Park和Burgess在生态学领域中首次应用了生态承载力的概念,即在某一特定环境条件下(主要指生存空间、营养物质、阳光等生态因子的组合),某种个体存在数量的最高极限。生态承载…

2023-2028年中国化肥行业市场需求预测与投资趋势分析报告

本报告由锐观咨询重磅推出,对中国化肥行业的发展现状、竞争格局及市场供需形势进行了具体分析,并从行业的政策环境、经济环境、社会环境及技术环境等方面分析行业面临的机遇及挑战。还重点分析了重点企业的经营现状及发展格局,并对未来几年行…

m分集2跳OFDM系统中基于功率分配和子载波配对算法的信道容量matlab仿真

目录 1.算法描述 2.仿真效果预览 3.MATLAB部分代码预览 4.完整MATLAB程序 1.算法描述 随着当代无线通信事业的迅猛发展,无线频谱资源已显得越来越匮乏,传统固定静态的无线频谱分配模式和策略,很难为未来的无线通信事业的进一步发展提供更多可利用的无线频谱带宽和更高的频谱…

源码分析 Laravel 重复执行同一个队列任务的原因

发现问题 在 Laravel 中使用 Redis 处理队列任务,框架提供的功能非常强大,但是最近遇到一个问题,就是发现一个任务被多次执行,这是为什么呢? 先说原因: 因为在 Laravel 中如果一个队列(任务&a…

Java项目:JSP民宿预订网站信息管理平台

作者主页:源码空间站2022 简介:Java领域优质创作者、Java项目、学习资料、技术互助 文末获取源码 项目介绍 本项目为前后台,包括管理员与普通用户两种角色; 管理员角色包含以下功能: 管理员登录,用户管理,会员管理,…

高斯消元总结

A-Matrix Equation_第 45 届国际大学生程序设计竞赛(ICPC)亚洲区域赛(济南)(重现赛) 自己写一个2维矩阵或者3维矩阵就可以发现对于每一列来说都是独立的,每一列的n个Cij都是都关系的&#xff0c…

Sentinel熔断降级

Sentinel熔断降级 1、介绍 官网地址:https://github.com/alibaba/Sentinel/wiki/熔断降级 Sentinel 提供以下几种熔断策略: 慢调用比例 (SLOW_REQUEST_RATIO):选择以慢调用比例作为阈值,需要设置允许的慢调用 RT(即最…

cesium for ue5中actor的cesium georeference组件的改变

今天,重新回顾下cesium for ue的教程,actor添加cesium georeference组件 发现在ue5中,没有这个组件了, 忍住卸载ue5,重新安装ue4.27的冲动,cesium的组件数量增多了,反而功能减少了&#xff…