爬虫逆向实战(十三)--某课网登录

一、数据接口分析

主页地址:某课网

1、抓包

通过抓包可以发现登录接口是user/login
在这里插入图片描述

2、判断是否有加密参数

  1. 请求参数是否加密?
    通过查看“载荷”模块可以发现有一个password加密参数,还有一个browser_key这个可以写死不需要关心
    在这里插入图片描述
  2. 请求头是否加密?
  3. 响应是否加密?
  4. 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)
}

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

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

相关文章

【11】Redis学习笔记 (微软windows版本)【Redis】

注意:官redis方不支持windows版本 只支持linux 此笔记是依托微软开发windows版本学习 一、前言 Redis简介&#xff1a; Redis&#xff08;Remote Dictionary Server&#xff09;是一个开源的内存数据结构存储系统&#xff0c;它也被称为数据结构服务器。Redis以键值对&am…

取证的学习

Volatility命令语法 1.判断镜像信息&#xff0c;获取操作系统类型 Volatility -f xxx.vmem imageinfo 在查到操作系统后如果不确定可以使用以下命令查看 volatility - f xxx.vmem --profile [操作系统] volshell 2.知道操作系统类型后&#xff0c;用–profile指定 volat…

【Oracle 数据库 SQL 语句 】积累1

Oracle 数据库 SQL 语句 1、分组之后再合计2、显示不为空的值 1、分组之后再合计 关键字&#xff1a; grouping sets &#xff08;&#xff08;分组字段1&#xff0c;分组字段2&#xff09;&#xff0c;&#xff08;&#xff09;&#xff09; select sylbdm ,count(sylbmc) a…

DR模式 LVS负载均衡群集

数据包流向分析&#xff1a; &#xff08;1&#xff09;客户端发送请求到 Director Server&#xff08;负载均衡器&#xff09;&#xff0c;请求的数据报文&#xff08;源 IP 是 CIP,目标 IP 是 VIP&#xff09;到达内核空间。 &#xff08;2&#xff09;Director Server 和 Re…

Docker 网络

目录 Docker 网络实现原理 Docker 的网络模式&#xff1a; 网络模式详解&#xff1a; 1&#xff0e;host模式 2&#xff0e;container模式 3&#xff0e;none模式 4&#xff0e;bridge模式 5&#xff0e;自定义网络 Docker 网络实现原理 Docker使用Linux桥接&#x…

Linux下如何修改CPU 电源工作模式

最近处理一起历史遗留问题&#xff0c;感觉很爽。 现象&#xff1a; 背景&#xff1a;设备采用ARM&#xff0c;即rk3568处理器&#xff0c;采用Linux系统&#xff1b;主要用于视觉后端处理 现象&#xff1a;当软件运行一段时间&#xff0c;大概1个小时&#xff08;也不是很固定…

考研算法第46天: 字符串转换整数 【字符串,模拟】

题目前置知识 c中的string判空 string Count; Count.empty(); //正确 Count ! null; //错误c中最大最小宏 #include <limits.h>INT_MAX INT_MIN 字符串使用发运算将字符加到字符串末尾 string Count; string str "liuda"; Count str[i]; 题目概况 AC代码…

国内的PMP有多少含金量?

1.PMP是什么 PMP&#xff08;Project Management Professional&#xff09;指项目管理专业人士资格认证。它是由美国项目管理协会&#xff08;PMI&#xff09;举办的项目管理专业人员&#xff08;PMP&#xff09;认证考试&#xff0c;在全球190多个国家和地区推广&#xff0c;…

vue 数字递增(滚动从0到)

使用 html <Incremental :startVal"0" :endVal"1000" :duration"500" />js&#xff1a; import Incremental from /utils/num/numViewjs let lastTime 0 const prefixes webkit moz ms o.split( ) // 各浏览器前缀let requestAnimatio…

[C++] string类的介绍与构造的模拟实现,进来看吧,里面有空调

文章目录 1、string类的出现1.1 C语言中的字符串 2、标准库中的string类2.1 string类 3、string类的常见接口说明及模拟实现3.1 string的常见构造3.2 string的构造函数3.3 string的拷贝构造3.4 string的赋值构造 4、完整代码 1、string类的出现 1.1 C语言中的字符串 C语言中&…

「Qt」文件读写操作

0、引言 我们知道 C 和 C 都提供了文件读写的类库&#xff0c;不过 Qt 也有一套自己的文件读写操作&#xff1b;本文主要介绍 Qt 中进行文件读写操作的类 —— QFile。 1、QFileDialog 文件对话框 一般的桌面应用程序&#xff0c;当我们想要打开一个文件时&#xff0c;通常会弹…

php+echarts实现数据可视化实例

效果&#xff1a; 代码&#xff1a; php <?php include(includes/session.inc); include(includes/SQL_CommonFunctions.inc); ?> <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv&quo…

OpenLayers入门,OpenLayers加载google街景地图

专栏目录: OpenLayers入门教程汇总目录 前言 本章讲解OpenLayers加载google街景地图,无需科学上网,也可以正常访问瓦片。 二、依赖和使用 "ol": "^6.15.1"使用npm安装依赖npm install ol@6.15.1使用Yarn安装依赖yarn add olvue中如何使用: vue项…

FastApi-1-结合sql 增/查demo

目录 FastAPI学习记录项目结构部分接口/代码展示感受全部代码 FastAPI学习记录 fastapi已经学习有一段时间&#xff0c;今天抽时间简单整理下。 官网介绍&#xff1a; FastAPI 是一个用于构建 API 的现代、快速&#xff08;高性能&#xff09;的 web 框架&#xff0c;使用 Py…

SpringBoot的配置文件以及日志设置

在使用SpringBoot开发的过程中我们通常会用到配置文件来设置配置信息 以及使用日志来进行记录我们的操作&#xff0c;方便我们对错误的定位 配置文件的作用在于&#xff1a;设置端口&#xff0c;设置数据库连接信息&#xff0c;设置日志等等 在SpringBoot中&#xff0c;配置…

Linux系统编程:通过System V共享内存实现进程间通信

目录 一. 共享内存实现进程间通信的原理 二. 共享内存相关函数 2.1 共享内存的获取 shmget / ftok 2.2 共享内存与进程地址空间相关联 shmat 2.3 取消共享内存与进程地址空间的关联 shmdt 2.4 删除共享内存 shmctl 2.5 通信双方创建共享内存代码 三. 共享内存实现进程间…

承接各种设计

小弟985研究生毕业&#xff0c;目前攻读读博士&#xff0c;可做各种设计&#xff0c;包括但不限于Matlab 电力电子/电气工程&#xff0c;matlab/simulink 电气专业仿真MATLAB 电气工程专业&#xff0c;matlab建模 电力电子&#xff0c;电气工程&#xff0c;电力系统&#xff0c…

vue echarts macd指标 完整代码

1 逻辑 给指定的series两个对象 两个对象有相同的xAxisIndex: 2,yAxisIndex: 2, 不同的data {name: "",type: "line",data: data1,xAxisIndex: 2,yAxisIndex: 2,},{name: "",type: "bar",data: data2,xAxisIndex: 2,yAxisIndex: 2,},…

Mac M2 Pro安装使用Cocoapods

Mac Pro M2安装使用Cocoapods 在新公司要做iOS开发&#xff0c;所以在新电脑上安装Cocoapods 在升级gem&#xff0c;sudo gem update --system&#xff0c;和安装cocoapods时都遇到如下的提示&#xff1a; ERROR: While executing gem ... (Errno::EPERM)Operation not per…

Linux下安装nodejs

1、下载nodejs 点击前往&#xff1a;Download | Node.js 2、解压 tar -xvf node-v18.16.0-linux-x64.tar.xz mv node-v18.16.0-linux-x64/ /usr/local/nodejs 3、 建立软链接 此时的bin文件夹中已经存在node以及npm&#xff0c;如果你进入到对应文件的中执行命令行一点问题…