爬虫逆向实战(十三)--某课网登录
一、数据接口分析
主页地址:某课网
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 官方网站下载适…...
日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻
在如今就业市场竞争日益激烈的背景下,越来越多的求职者将目光投向了日本及中日双语岗位。但是,一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧?面对生疏的日语交流环境,即便提前恶补了…...
Appium+python自动化(十六)- ADB命令
简介 Android 调试桥(adb)是多种用途的工具,该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具,其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利,如安装和调试…...
【位运算】消失的两个数字(hard)
消失的两个数字(hard) 题⽬描述:解法(位运算):Java 算法代码:更简便代码 题⽬链接:⾯试题 17.19. 消失的两个数字 题⽬描述: 给定⼀个数组,包含从 1 到 N 所有…...
Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级
在互联网的快速发展中,高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司,近期做出了一个重大技术决策:弃用长期使用的 Nginx,转而采用其内部开发…...
html-<abbr> 缩写或首字母缩略词
定义与作用 <abbr> 标签用于表示缩写或首字母缩略词,它可以帮助用户更好地理解缩写的含义,尤其是对于那些不熟悉该缩写的用户。 title 属性的内容提供了缩写的详细说明。当用户将鼠标悬停在缩写上时,会显示一个提示框。 示例&#x…...
RSS 2025|从说明书学习复杂机器人操作任务:NUS邵林团队提出全新机器人装配技能学习框架Manual2Skill
视觉语言模型(Vision-Language Models, VLMs),为真实环境中的机器人操作任务提供了极具潜力的解决方案。 尽管 VLMs 取得了显著进展,机器人仍难以胜任复杂的长时程任务(如家具装配),主要受限于人…...
代码规范和架构【立芯理论一】(2025.06.08)
1、代码规范的目标 代码简洁精炼、美观,可持续性好高效率高复用,可移植性好高内聚,低耦合没有冗余规范性,代码有规可循,可以看出自己当时的思考过程特殊排版,特殊语法,特殊指令,必须…...
深度剖析 DeepSeek 开源模型部署与应用:策略、权衡与未来走向
在人工智能技术呈指数级发展的当下,大模型已然成为推动各行业变革的核心驱动力。DeepSeek 开源模型以其卓越的性能和灵活的开源特性,吸引了众多企业与开发者的目光。如何高效且合理地部署与运用 DeepSeek 模型,成为释放其巨大潜力的关键所在&…...
客户案例 | 短视频点播企业海外视频加速与成本优化:MediaPackage+Cloudfront 技术重构实践
01技术背景与业务挑战 某短视频点播企业深耕国内用户市场,但其后台应用系统部署于东南亚印尼 IDC 机房。 随着业务规模扩大,传统架构已较难满足当前企业发展的需求,企业面临着三重挑战: ① 业务:国内用户访问海外服…...
高效的后台管理系统——可进行二次开发
随着互联网技术的迅猛发展,企业的数字化管理变得愈加重要。后台管理系统作为数据存储与业务管理的核心,成为了现代企业不可或缺的一部分。今天我们要介绍的是一款名为 若依后台管理框架 的系统,它不仅支持跨平台应用,还能提供丰富…...
