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

一、数据接口分析

主页地址:某课网

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.hqwc.cn/news/70446.html

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

相关文章

回归预测 | MATLAB实现GRU门控循环单元多输入多输出

回归预测 | MATLAB实现GRU门控循环单元多输入多输出 目录 回归预测 | MATLAB实现GRU门控循环单元多输入多输出预测效果基本介绍程序设计往期精彩参考资料 预测效果 基本介绍 MATLAB实现GRU门控循环单元多输入多输出&#xff0c;数据为多输入多输出预测数据&#xff0c;输入10个…

prompt-engineering-note(面向开发者的ChatGPT提问工程学习笔记)

介绍&#xff1a; ChatGPT Prompt Engineering Learning Notesfor Developers (面向开发者的ChatGPT提问工程学习笔记) 课程简单介绍了语言模型的工作原理&#xff0c;提供了最佳的提示工程实践&#xff0c;并展示了如何将语言模型 API 应用于各种任务的应用程序中。 此外&am…

爬虫逆向实战(十六)--某建筑市场平台

一、数据接口分析 主页地址&#xff1a;某建筑市场平台 1、抓包 通过抓包可以发现数据接口是list 2、判断是否有加密参数 请求参数是否加密&#xff1f; 无请求头是否加密&#xff1f; 无响应是否加密&#xff1f; 通过查看“响应”模块可以发现&#xff0c;返回的响应是…

设计HTML5列表和超链接

在网页中&#xff0c;大部分信息都是列表结构&#xff0c;如菜单栏、图文列表、分类导航、新闻列表、栏目列表等。HTML5定义了一套列表标签&#xff0c;通过列表结构实现对网页信息的合理排版。另外&#xff0c;网页中还包含大量超链接&#xff0c;通过它实现网页、位置的跳转&…

编程练习(2)

一.选择题 第一题&#xff1a; 考察转义字符和strlen函数求解字符串长度 进一步在VS中可以智能看出哪些字符是转义字符&#xff1a; 因此本体答案选择B 第二题&#xff1a; 本体较为简单&#xff0c;宏定义了三个数N,M,NUM,N值为2,M值为3&#xff0c;因此NUM值为8&#xff0c;…

FFmpeg常见命令行(四):FFmpeg流媒体

前言 在Android音视频开发中&#xff0c;网上知识点过于零碎&#xff0c;自学起来难度非常大&#xff0c;不过音视频大牛Jhuster提出了《Android 音视频从入门到提高 - 任务列表》&#xff0c;结合我自己的工作学习经历&#xff0c;我准备写一个音视频系列blog。本文是音视频系…

工程项目管理系统源码+功能清单+项目模块+spring cloud +spring boot em

​ 工程项目管理软件&#xff08;工程项目管理系统&#xff09;对建设工程项目管理组织建设、项目策划决策、规划设计、施工建设到竣工交付、总结评估、运维运营&#xff0c;全过程、全方位的对项目进行综合管理 工程项目各模块及其功能点清单 一、系统管理 1、数据字典&#…

vivo 容器集群监控系统优化之道

作者&#xff1a;vivo 互联网容器团队 - Han Rucheng 本文介绍了vivo容器团队基于 Prometheus等云原生监控生态来构建的容器集群监控体系&#xff0c;在业务接入容器监控的过程中遇到的挑战、困难&#xff0c;并分享了相应的应对策略和优化方案。 一、背景介绍 随着vivo业务迁…

Python爬虫——scrapy_工作原理

引擎向spiders要url引擎把将要爬取的url给调度器调度器会将url生成的请求对象放入到指定的队列中从队列中出队一个请求引擎将请求交给下载器进行处理下载器发送请求获取互联网数据下载器将数据返回给引擎引擎将数据再次给到spidersspiders通过xpath解析该数据&#xff0c;得到数…

QT生成Word PDF文档

需求&#xff1a;将软件处理的结果保存为一个报告文档&#xff0c;文档中包含表格、图片、文字&#xff0c;格式为word的.doc和.pdf。生成word是为了便于用户编辑。 开发环境&#xff1a;qt4.8.4vs2010 在qt的官网上对于pdf的操作介绍如下&#xff1a;http://qt-project.org/…

springboot结合shiro实战-身份认证

目录 环境搭建 配置shiro环境 总结 hello&#xff0c;大家好&#xff0c;我们写任何企业级项目基本都会需要做权限&#xff0c;权限包含身份认证和授权。 所谓身份认证&#xff0c;就是证明你是你。 所谓授权就是明白你登录之后能干什么。 现在&#xff0c;让我们用sprin…

键盘居然“软硬可调”,达尔优的GAS可调系统究竟是什么?

达尔优在7月29日上海 ChinaJoy 2023上发布了A98系列最新的重磅产品——A98Master机械键盘。采用了行业首创的GAS可调结构,被粉丝成为“绝技”,GAS可调系统到底有什么作用?还特地做这么隆重的发布? 达尔优的GAS可调系统简单说是Gasket方案软硬可调结构。通过小工具调节键盘的内…