爬虫逆向实战(十三)--某课网登录
一、数据接口分析
主页地址:某课网
1、抓包
通过抓包可以发现登录接口是user/login
2、判断是否有加密参数
- 请求参数是否加密?
通过查看“载荷”模块可以发现有一个password
加密参数,还有一个browser_key
这个可以写死不需要关心
- 请求头是否加密?
无 - 响应是否加密?
无 - cookie是否加密?
无
二、加密位置定位
1、看启动器
查看启动器发现里面有一个SSOController.login
,点进去查看
点进去之后可以发现,上方有对password
的处理,可以怀疑此处就是加密位置
在此处打断点,再次点击登录发现可以断住,并且window.btoa(e)
的结果就是密文,所以可以断定此处就是加密位置
三、扣js代码
将定位到的加密位置的代码扣出,缺啥补啥。
但是当我扣代码时会发现缺少一些参数以及加密密钥,此时我们可以观察抓包发现,网站是请求了prelogin接口获取的。
所以我们需要先请求这个prelogin接口,获取到这些参数,然后使用这些参数对密码进行加密,再发包请求登录接口即可
源代码:
var K = function(a, f) {function e(b) {N = b;G = Array(N);for (b = 0; b < G.length; b++)G[b] = 0;new h;E = new h;E.digits[0] = 1}function h(b) {this.digits = "boolean" == typeof b && 1 == b ? null : G.slice(0);this.isNeg = !1}function u(b) {var c = new h(!0);c.digits = b.digits.slice(0);c.isNeg = b.isNeg;return c}function k(b) {for (var c = new h, r = b.length, d = 0; 0 < r; r -= 4,++d) {for (var a = c.digits, O = d, g = b.substr(Math.max(r - 4, 0), Math.min(r, 4)), e = 0, f = Math.min(g.length, 4), l = 0; l < f; ++l) {e <<= 4;var n = g.charCodeAt(l);e |= 48 <= n && 57 >= n ? n - 48 : 65 <= n && 90 >= n ? 10 + n - 65 : 97 <= n && 122 >= n ? 10 + n - 97 : 0}a[O] = e}return c}function w(b, c) {if (b.isNeg != c.isNeg) {c.isNeg = !c.isNeg;var r = l(b, c);c.isNeg = !c.isNeg} else {r = new h;for (var d = 0, a = 0; a < b.digits.length; ++a)d = b.digits[a] + c.digits[a] + d,r.digits[a] = d & 65535,d = Number(65536 <= d);r.isNeg = b.isNeg}return r}function l(b, c) {if (b.isNeg != c.isNeg) {c.isNeg = !c.isNeg;var r = w(b, c);c.isNeg = !c.isNeg} else {r = new h;for (var a, m = a = 0; m < b.digits.length; ++m)a = b.digits[m] - c.digits[m] + a,r.digits[m] = a & 65535,0 > r.digits[m] && (r.digits[m] += 65536),a = 0 - Number(0 > a);if (-1 == a) {for (m = a = 0; m < b.digits.length; ++m)a = 0 - r.digits[m] + a,r.digits[m] = a & 65535,0 > r.digits[m] && (r.digits[m] += 65536),a = 0 - Number(0 > a);r.isNeg = !b.isNeg} elser.isNeg = b.isNeg}return r}function n(b) {for (var c = b.digits.length - 1; 0 < c && 0 == b.digits[c]; )--c;return c}function v(b) {var c = n(b);b = b.digits[c];c = 16 * (c + 1);var a;for (a = c; a > c - 16 && 0 == (b & 32768); --a)b <<= 1;return a}function t(b, c) {for (var a = new h, d, m = n(b), e = n(c), g, f = 0; f <= e; ++f) {d = 0;g = f;for (j = 0; j <= m; ++j,++g)d = a.digits[g] + b.digits[j] * c.digits[f] + d,a.digits[g] = d & 65535,d >>>= 16;a.digits[f + m + 1] = d}a.isNeg = b.isNeg != c.isNeg;return a}function p(b, c, a, d, m) {for (m = Math.min(c + m, b.length); c < m; ++c,++d)a[d] = b[c]}function y(b, c) {var a = Math.floor(c / 16), d = new h;p(b.digits, 0, d.digits, a, d.digits.length - a);c %= 16;a = 16 - c;for (var m = d.digits.length - 1, e = m - 1; 0 < m; --m,--e)d.digits[m] = d.digits[m] << c & 65535 | (d.digits[e] & P[c]) >>> a;d.digits[0] = d.digits[m] << c & 65535;d.isNeg = b.isNeg;return d}function L(b, a) {var c = Math.floor(a / 16), d = new h;p(b.digits, c, d.digits, 0, b.digits.length - c);a %= 16;c = 16 - a;for (var e = 0, f = e + 1; e < d.digits.length - 1; ++e,++f)d.digits[e] = d.digits[e] >>> a | (d.digits[f] & Q[a]) << c;d.digits[d.digits.length - 1] >>>= a;d.isNeg = b.isNeg;return d}function C(a, c) {var b = new h;p(a.digits, 0, b.digits, c, b.digits.length - c);return b}function x(a, c) {var b = new h;p(a.digits, c, b.digits, 0, b.digits.length - c);return b}function D(a, c) {var b = new h;p(a.digits, 0, b.digits, 0, c);return b}function M(a, c) {if (a.isNeg != c.isNeg)return 1 - 2 * Number(a.isNeg);for (var b = a.digits.length - 1; 0 <= b; --b)if (a.digits[b] != c.digits[b])return a.isNeg ? 1 - 2 * Number(a.digits[b] > c.digits[b]) : 1 - 2 * Number(a.digits[b] < c.digits[b]);return 0}function F(a) {this.modulus = u(a);this.k = n(this.modulus) + 1;a = new h;a.digits[2 * this.k] = 1;var c = this.modulus, b = v(a), d = v(c), e = c.isNeg;if (b < d)if (a.isNeg) {var f = u(E);f.isNeg = !c.isNeg;a.isNeg = !1;c.isNeg = !1;var g = l(c, a);a.isNeg = !0;c.isNeg = e} elsef = new h,g = u(a);else {f = new h;g = a;for (var q = Math.ceil(d / 16) - 1, k = 0; 32768 > c.digits[q]; )c = y(c, 1),++k,++d,q = Math.ceil(d / 16) - 1;g = y(g, k);b = Math.ceil((b + k) / 16) - 1;for (d = C(c, b - q); -1 != M(g, d); )++f.digits[b - q],g = l(g, d);for (; b > q; --b) {d = b >= g.digits.length ? 0 : g.digits[b];var p = b - 1 >= g.digits.length ? 0 : g.digits[b - 1], t = b - 2 >= g.digits.length ? 0 : g.digits[b - 2], B = q >= c.digits.length ? 0 : c.digits[q], z = q - 1 >= c.digits.length ? 0 : c.digits[q - 1];f.digits[b - q - 1] = d == B ? 65535 : Math.floor((65536 * d + p) / B);for (var A = f.digits[b - q - 1] * (65536 * B + z), x = 4294967296 * d + (65536 * p + t); A > x; )--f.digits[b - q - 1],A = f.digits[b - q - 1] * (65536 * B | z),x = 4294967296 * d + (65536 * p + t);t = d = C(c, b - q - 1);B = f.digits[b - q - 1];result = new h;p = n(t);for (z = A = 0; z <= p; ++z)A = result.digits[z] + t.digits[z] * B + A,result.digits[z] = A & 65535,A >>>= 16;result.digits[1 + p] = A;g = l(g, result);g.isNeg && (g = w(g, d),--f.digits[b - q - 1])}g = L(g, k);f.isNeg = a.isNeg != e;a.isNeg && (f = e ? w(f, E) : l(f, E),c = L(c, k),g = l(c, g));0 == g.digits[0] && 0 == n(g) && (g.isNeg = !1)}a = [f, g];this.mu = a[0];this.bkplus1 = new h;this.bkplus1.digits[this.k + 1] = 1;this.modulo = H;this.multiplyMod = I;this.powMod = J}function H(a) {var b = x(a, this.k - 1);b = t(b, this.mu);b = x(b, this.k + 1);a = D(a, this.k + 1);b = t(b, this.modulus);b = D(b, this.k + 1);a = l(a, b);a.isNeg && (a = w(a, this.bkplus1));for (b = 0 <= M(a, this.modulus); b; )a = l(a, this.modulus),b = 0 <= M(a, this.modulus);return a}function I(a, c) {a = t(a, c);return this.modulo(a)}function J(a, c) {var b = new h;for (b.digits[0] = 1; ; ) {0 != (c.digits[0] & 1) && (b = this.multiplyMod(b, a));c = L(c, 1);if (0 == c.digits[0] && 0 == n(c))break;a = this.multiplyMod(a, a)}return b}function K(a) {this.e = k("10001");this.d = k("");this.m = k(a);this.chunkSize = 128;this.radix = 16;this.barrett = new F(this.m)}var N, G, E;e(20);(function(a) {var b = new h;b.isNeg = 0 > a;a = Math.abs(a);for (var f = 0; 0 < a; )b.digits[f++] = a & 65535,a >>= 16;return b})(1E15);var P = [0, 32768, 49152, 57344, 61440, 63488, 64512, 65024, 65280, 65408, 65472, 65504, 65520, 65528, 65532, 65534, 65535], Q = [0, 1, 3, 7, 15, 31, 63, 127, 255, 511, 1023, 2047, 4095, 8191, 16383, 32767, 65535];e(131);return function(a) {var b = [], e = a.length, d, m = "", l = new K(f);e > l.chunkSize - 11 && (e = l.chunkSize - 11);var g = 0;for (d = e - 1; g < e; )b[d] = a.charCodeAt(g),g++,d--;for (d = l.chunkSize - e % l.chunkSize; 0 < d; ) {for (a = Math.floor(256 * Math.random()); !a; )a = Math.floor(256 * Math.random());b[g] = a;g++;d--}b[e] = 0;b[l.chunkSize - 2] = 2;b[l.chunkSize - 1] = 0;e = b.length;for (g = 0; g < e; g += l.chunkSize) {var q = new h;d = 0;for (a = g; a < g + l.chunkSize; ++d)q.digits[d] = b[a++],q.digits[d] += b[a++] << 8;d = l.barrett.powMod(q, l.e);q = "";for (a = n(d); -1 < a; --a) {var k = d.digits[a];var p = String.fromCharCode(k & 255);k = String.fromCharCode(k >>> 8 & 255) + p;q += k}d = q;m += d}return m}(a)}function get_pwd(password, w, l, f) {
var e = K(w + "\t" + l + "\t" + password, f);return btoa(e)
}
相关文章:

爬虫逆向实战(十三)--某课网登录
一、数据接口分析 主页地址:某课网 1、抓包 通过抓包可以发现登录接口是user/login 2、判断是否有加密参数 请求参数是否加密? 通过查看“载荷”模块可以发现有一个password加密参数,还有一个browser_key这个可以写死不需要关心 请求头…...

4.SpringCloud
1.SpringCloud概述 Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智能路由,微代理,控制总线,一次性令牌,全局锁,…...

OLED透明屏采购指南:如何选择高质量产品?
着科技的不断进步,OLED透明屏作为一种创新的显示技术,在各个行业中得到了广泛应用。 在进行OLED透明屏采购时,选择高质量的产品至关重要。在这篇文章中,尼伽将为您提供一个全面的OLED透明屏采购指南,帮助您了解关键步…...

机器学习编译系列
机器学习编译MLC 1. 引言2. 机器学习编译--概述2.1 什么是机器学习编译 1. 引言 陈天奇目前任教于CMU,研究方向为机器学习系统。他是TVM、MXNET、XGBoost的主要作者。2022年夏天,陈天奇在B站开设了《机器学习编译》的课程。 《机器学习编译》课程共分…...
MySQL 数据库巡检系统的设计与应用
文章目录 MySQL 数据库巡检系统的设计与应用引言1. 设计思路1.1 数据采集模块1.2 数据分析模块1.3 前端展示模块1.4 报警模块2. 实现步骤2.1 数据采集2.2 数据分析2.3 前端展示2.4 报警模块3. 应用案例3.1 数据采集步骤一:安装 Zabbix Agent步骤二:添加监控项步骤三:添加用户…...

工程项目管理系统源码+功能清单+项目模块+spring cloud +spring boot em
工程项目管理软件(工程项目管理系统)对建设工程项目管理组织建设、项目策划决策、规划设计、施工建设到竣工交付、总结评估、运维运营,全过程、全方位的对项目进行综合管理 工程项目各模块及其功能点清单 一、系统管理 1、数据字典&#…...

前端笔试+面试分享
以下是个人线下面试遇到的真实的题,仅供参考和学习 1. css 选择符有哪些?哪些属性可以继承?优先级算法加何计算? CSS选择符有很多种,例如类型选择器、类选择器、ID选择器、属性选择器、伪类选择器、伪元素选择器等。 …...
C Language Handout
明天(9月3日)上课时间 上午:09:30 - 12:00 下午:14:30 - 17:00 周末 - 务必 - 找一下报名/班主任老师 - 确认账号是否为正式账号 今日内容: 一.第一个C语言程序 mkdir /home/tarena/stdc/day03 -p cd /home/tarena/stdc/day03 vim hello.c #include <stdio.h> /* 这是…...

数据结构——栈(C语言)
需求:无 栈的概念: 栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端为栈底。栈中的数据元素遵守后进先出(LIFO)原则。压栈&…...
Linux 内核内存管理 page_address 函数
文章目录 一、page_address1.1 page_address1.2 page_to_pfn1.3 PFN_PHYS1.4 __va(x)1.5 总结1.6 page_to_virt 二、使用demo 一、page_address 1.1 page_address 内核用 struct page 结构体来表示系统中的每个物理页面,该结构体用来跟踪和管理这些物理页面的使用…...

macOS使用ffmpeg与QT进行音视频推拉流
1.先启动流服务器 ./mediamtx 2.开始推流: ffmpeg -re -stream_loop -1 -i /Users/hackerx/Desktop/test.mp4 -c copy -rtsp_transport tcp -f rtsp rtsp://127.0.0.1:8554/stream 3. 安装ffmpeg 4.4 brew install ffmpeg4 4.添加ffmpeg头文件目录与库目录 5.链接ffmpeg相关库…...
ARTS打卡:双指针的尝试
替换空格 <?php class Solution {/*** param String $s* return String*/function replaceSpace($s) {$arrstr_split($s); //转化成数组foreach($arr as &$item){if($item ){//执行替换操作$item%20;}}return implode(,$arr); //数组转化成字符串返回} } 反转链表…...

JavaWeb-DAO设计模式
目录 DAO设计模式 1.认识DAO 2.DAO各部分的详解 3.DAO设计模式流程 DAO设计模式 1.认识DAO DAO(Data Acess Object 数据库访问对象)的主要功能是操作数据库,所以DAO在标准开发架构中数据数据层,以下是标准开发的架构 客户层:目前使用B/…...
重温git和GitHub
1.初始化本地库:让git获取到这个目录的管理权 git init 查看文件夹的文件命令:ll 查看文件夹的隐藏的文件命令:ll -a 查看状态的命令:git status cat文件名:查看文件内容 工作区:当git status时,名字为红色则在工作区&…...

C# WPF 中 外部图标引入iconfont,无法正常显示问题 【小白记录】
wpf iconfont 外部图标引入,无法正常显示问题。 1. 检查资源路径和引入格式是否正确2. 检查资源是否包含在程序集中 1. 检查资源路径和引入格式是否正确 正确的格式,注意字体文件 “xxxx.ttf” 应写为 “#xxxx” <TextBlock Text"…...

Hi-TRS:骨架点视频序列的层级式建模及层级式自监督学习
论文题目:Hierarchically Self-Supervised Transformer for Human Skeleton Representation Learning 论文下载地址:https://www.ecva.net/papers/eccv_2022/papers_ECCV/papers/136860181.pdf 代码地址:https://github.com/yuxiaochen1103…...

FPGA 之 xilinx DDS IP相位控制字及频率控制字浅析
浅析相位环在Xilinx DDS中的理解 本文仅为个人理解之用; 相关仿真结果如下:...

[鹏城杯 2022]简单包含
直接用php:// 有wtf 加脏数据绕过...
Required request parameter ‘XXX‘ for method parameter type XXX is not present问题
今日工作中遇到很奇葩的问题,用翻译软件翻译结果为 方法参数类型XXX所需的请求参数XXX不存在 也就是说前端没有给后端传值 后端的接收方式为 public Result demo(RequestParam("id") String id){}...
centOS 快速安装和配置 NVIDIA docker Container Toolkit
要在 CentOS 上正确安装和配置 NVIDIA Container Toolkit,您可以按照以下步骤进行操作,如果1和2都已经完成,可以直接进行第3步NVIDIA Container Toolkit安装配置。 1. 安装 NVIDIA GPU 驱动程序: 您可以从 NVIDIA 官方网站下载适…...
ssc377d修改flash分区大小
1、flash的分区默认分配16M、 / # df -h Filesystem Size Used Available Use% Mounted on /dev/root 1.9M 1.9M 0 100% / /dev/mtdblock4 3.0M...
大模型多显卡多服务器并行计算方法与实践指南
一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...

图表类系列各种样式PPT模版分享
图标图表系列PPT模版,柱状图PPT模版,线状图PPT模版,折线图PPT模版,饼状图PPT模版,雷达图PPT模版,树状图PPT模版 图表类系列各种样式PPT模版分享:图表系列PPT模板https://pan.quark.cn/s/20d40aa…...
Java多线程实现之Thread类深度解析
Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...

Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

技术栈RabbitMq的介绍和使用
目录 1. 什么是消息队列?2. 消息队列的优点3. RabbitMQ 消息队列概述4. RabbitMQ 安装5. Exchange 四种类型5.1 direct 精准匹配5.2 fanout 广播5.3 topic 正则匹配 6. RabbitMQ 队列模式6.1 简单队列模式6.2 工作队列模式6.3 发布/订阅模式6.4 路由模式6.5 主题模式…...

网站指纹识别
网站指纹识别 网站的最基本组成:服务器(操作系统)、中间件(web容器)、脚本语言、数据厍 为什么要了解这些?举个例子:发现了一个文件读取漏洞,我们需要读/etc/passwd,如…...

TSN交换机正在重构工业网络,PROFINET和EtherCAT会被取代吗?
在工业自动化持续演进的今天,通信网络的角色正变得愈发关键。 2025年6月6日,为期三天的华南国际工业博览会在深圳国际会展中心(宝安)圆满落幕。作为国内工业通信领域的技术型企业,光路科技(Fiberroad&…...
【前端异常】JavaScript错误处理:分析 Uncaught (in promise) error
在前端开发中,JavaScript 异常是不可避免的。随着现代前端应用越来越多地使用异步操作(如 Promise、async/await 等),开发者常常会遇到 Uncaught (in promise) error 错误。这个错误是由于未正确处理 Promise 的拒绝(r…...
区块链技术概述
区块链技术是一种去中心化、分布式账本技术,通过密码学、共识机制和智能合约等核心组件,实现数据不可篡改、透明可追溯的系统。 一、核心技术 1. 去中心化 特点:数据存储在网络中的多个节点(计算机),而非…...