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

news2024/11/18 7:41:08

一、数据接口分析

主页地址:某课网

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
                } else
                    r.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
                } else
                    f = 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.coloradmin.cn/o/886804.html

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

相关文章

Lodash——使用与实例

1. 简介 Lodash是一个一致性、模块化、高性能的JavaScript实用库。Lodash通过降低array、number、objects、string等等的使用难度从而让JavaScript变得简单。Lodash的模块方法&#xff0c;非常适用于&#xff1a; 遍历array、object 和 string对值进行操作和检测创建符合功能的…

注册中心Eureka和Nacos,以及负载均衡Ribbon

1.初识微服务 1.1.什么是微服务 微服务&#xff0c;就是把服务拆分成为若干个服务&#xff0c;降低服务之间的耦合度&#xff0c;提供服务的独立性和灵活性。做到高内聚&#xff0c;低耦合。 1.2.单体架构和微服务架构的区别&#xff1a; 单体架构&#xff1a;简单方便&#…

【干货】通过Bootstrap框架添加下拉框到导航栏

最终效果展示详细步骤及代码1、获取相关代码2、引入CSS和JavaScript文件3、全部代码 最终效果展示 详细步骤及代码 1、获取相关代码 https://v3.bootcss.com/components/#navbar-default 本文用到代码为 <nav class"navbar navbar-default"><div class&…

第六阶|见道明心的笔墨(上)从书法之美到生活之美——林曦老师的线上直播书法课

如果你有需要&#xff0c;可以找我的&#xff0c;我这边有老师的所有课程 如果你有需要&#xff0c;可以找我的&#xff0c;我这边有老师的所有课程

零售行业供应链管理核心KPI指标(二) – 线上订单履行周期

一般品牌零售商有一个大的渠道就是全国连锁的商超、大卖场&#xff0c;非常重要的渠道&#xff0c;要去铺货。同类型的产品都在竞争这个大渠道&#xff0c;但商超、大卖场在这类产品的容量是有限的&#xff0c;所以各个品牌就要去争夺整个容量&#xff0c;看谁在有限的容量里占…

最小二乘线性拟合FC(SCL计算源代码)

采用PLC等微控制器采集一些线性传感器数据时&#xff0c;如果已知线性关系&#xff0c;我们可以利用直线方程求解。具体的算法公式和讲解大家可以查看下面相关文章&#xff1a; PLC模拟量采集算法数学基础&#xff08;线性传感器&#xff09;_plc3秒采集一次模拟量_RXXW_Dor的…

expert systems with applications latex使用、投稿、合集(超详细)

目录 一、main.tex 1、框架 2、图片 3、表格 4、公式 5、文献引用 6、引用文献高亮 及 其他需要导入的包 7、特殊符号 比如 ✔ ∈ 二、投稿 1、orcid 身份码 2、.bib 文件设置为 manuscript 3、Cover Letter 4、declaration of interest statement 5、模板及其…

分享一个恒流源和恒压源电路,可实现恒压、恒流充放电

通过控制输出DA-IOUT1,DA-VOUT1电流和电压DA的大小&#xff0c;及继电器控制和CH1I,CH1V的采用反馈&#xff0c;该电路可实现&#xff0c;恒流充电&#xff0c;恒压充电&#xff0c;恒流恒压充电&#xff0c;恒流放电&#xff0c;恒阻充电&#xff0c;恒功率充电等充放电模式&a…

01_YS_LED_USART1_KEY_Test_Demo

1.硬件设计参考图 参考&#xff1a;00_YS_硬件电路图_往事不可追_来日不方长的博客-CSDN博客 2.配置LED 2.1代码部分 代码初始化部分如下图MX自动生成&#xff1a; // main.h 中/* Private defines -----------------------------------------------------------*/ #define…

Wordcloud | 风中有朵雨做的‘词云‘哦!~

1写在前面 今天可算把key搞好了&#xff0c;不得不说&#x1f3e5;里手握生杀大权的人&#xff0c;都在自己的能力范围内尽可能的难为你。&#x1f602; 我等小大夫也是很无奈&#xff0c;毕竟奔波霸、霸波奔是要去抓唐僧的。 &#x1f910; 好吧&#xff0c;今天是词云&#x…

Vue3 Router路由单页面跳转简单应用

去官网学习→介绍 | Vue Router cd 到项目 安装 Router &#xff1a; cnpm install --save vue-router 或着 创建项目时勾选Router vue create vue-demo <i> to invert selection, and <enter> to proceed)(*) Babel( ) TypeScript(*) Progressive Web …

《vue3实战》运用radio单选按钮或Checkbox复选框实现单选多选的试卷制作

文章目录 目录 系列文章目录 1.《Vue3实战》使用axios获取文件数据以及走马灯Element plus的运用 2.《Vue3实战》用路由实现跳转登录、退出登录以及路由全局守护 3.《vue3实战》运用Checkbox复选框实现单选多选的试卷展现&#xff08;本文&#xff09; 文章目录 前言 radio是什…

【探索Linux】—— 强大的命令行工具 P.3(Linux开发工具 vim)

阅读导航 前言vim简介概念特点 vim的相关指令vim命令模式(Normal mode)相关指令插入模式(Insert mode)相关指令末行模式(last line mode)相关指令 简单vim配置&#xff08;附配置链接&#xff09;温馨提示 前言 前面我们讲了C语言的基础知识&#xff0c;也了解了一些数据结构&…

observer与qt信号槽的区别

observer类图(应用) 定义/区别/注意事项 点击截图后可放大显示,也可图片另存为&#xff0c;这个技术讨论是来接受批评的。 参考&#xff1a;

专访 BlockPI:共建账户抽象未来的新一代 RPC 基础设施

在传统 RPC 服务板块上&#xff0c;开发者一直饱受故障风险、运行环境混乱等难题的折磨。实现 RPC 服务的去中心化&#xff0c;且保持成本优势和可扩展性&#xff0c;始终是区块链基础设施建设的重要命题之一。从 2018 年观察中心化 RPC 供应商服务现状开始&#xff0c;BlockPI…

设计模式之构建器(Builder)C++实现

构建器提出 在软件功能开发中&#xff0c;有时面临“一个复杂对象”的创建工作&#xff0c;该对象的每个功能接口由于需求的变化&#xff0c;会使每个功能接口发生变化&#xff0c;但是该对象使用每个功能实现一个接口的流程是稳定的。构建器就是解决该类现象的。构建就是定义…

C语言好题解析(一)

目录 选择题1选择题2选择题3选择题4编程题一 选择题1 执行下面程序&#xff0c;正确的输出是&#xff08; &#xff09;int x 5, y 7; void swap() {int z;z x;x y;y z; } int main() {int x 3, y 8;swap();printf("%d,%d\n",x, y);return 0; }A: 5,7 B: …

CSRF

CSRF CSRF&#xff0c;跨站域请求伪造&#xff0c;通常攻击者会伪造一个场景&#xff08;例如一条链接&#xff09;&#xff0c;来诱使用户点击&#xff0c;用户一旦点击&#xff0c;黑客的攻击目的也就达到了&#xff0c;他可以盗用你的身份&#xff0c;以你的名义发送恶意请…

基于深度学习的指针式仪表倾斜校正方法——论文解读

中文论文题目:基于深度学习的指针式仪表倾斜校正方法 英文论文题目&#xff1a;Tilt Correction Method of Pointer Meter Based on Deep Learning 周登科、杨颖、朱杰、王库.基于深度学习的指针式仪表倾斜校正方法[J].计算机辅助设计与图形学学报, 2020, 32(12):9.DOI:10.3724…

web前端开发基础入门html5+css3+js学习笔记(一)

目录 1.第一个前端程序2.前端工具的选择与安装3.VSCode开发者工具快捷键4.HTML5简介与基础骨架4.1 HTML5的DOCTYPE声明4.2 HTML5基本骨架4.2.1 html标签4.2.2 head标签4.2.3 body标签4.2.4 title标签4.2.5 meta标签 5.标签之标题5.1 快捷键5.1 标题标签位置摆放 6.标签之段落、…