<python爬虫之JS逆向实例-1>新浪网

2023-11-09

声明:本文只作学习研究,禁止用于非法用途,否则后果自负,如有侵犯了您的合法权益,请告知,我将及时更正、删除,谢谢。邮箱地址:lc1139411732@163.com


文章目录:

一、项目准备

二、参数分析

三、静态调试

四、动态调试

五、堆栈跟踪

一、项目准备

作者环境:win10,node.js 

开发工具:WebStorm

目标网址: aHR0cHM6Ly93d3cuc2luYS5jb20uY24v 

二、参数分析

    点击登录过后浏览器捕获到了多个数据包,我们可以通过响应内容中的数据判定那个才是我们想要的。

https://login---.com.cn--脱敏处理---1647765920689

图1

     对于做登录分析的话,我们如何快速找到那个才是我们想要的数据包呢,根据我的个人经验总结①对于登录数据传输绝大部分都是POST请求②数据包名称中包含login这样的关键词③查看响应内容

    接下来我们继续,我们顺利的根据上面的分析找到了响应内容如图2所示,内容的字符进行了unicode编码,我们做一个在线解码查看结果。可以看到对应的就是,登录名或密码错误

图2

图3

    查看参数根据经验发现四个可疑参数su、servertime、nonce、sp

图4

三、静态调试

    经过静态分析调试我们知道了参数加密位置,在代码的名称道中我们也可以看到一些很熟悉的面孔,例如base64\RSAkey\setPublic在里面还掺杂着username\password这样的参数因此我们可以初步判断这就是加密位置,加密的算法是密码学中的RSA非对称加密。

图5

四、动态调试

    通过断点动态调试我们可以发现,我们的账号和密码都是在这个位置进行加密的,对于username的结果我们是可以直接和图4中完全吻合的,密码部分是因为RAS加密的特性他的结果必然是对不上的,我们暂时可以忽略。

图6

五、堆栈跟踪(根据加密参数进行图解,加密代码全部做了脱敏处理,只截取了关键部分)-想要进一步了解学习可以在公众号留言

--------------------------su加密--------------------------

1.su - 针对账号进行加密

图7 定位到加密函数扣出代码本地生成

base64 = {
    encode: function(n) {
        n = "" + n;
        if (n == "") {
            return ""
        }
        var l = "";
        var u, s, q = "";
        var t, r, p, o = "";
        var m = 0;
        do {
            u = n.charCodeAt(m++);
            s = n.charCodeAt(m++);
            q = n.charCodeAt(m++);
            t = u >> 2;
            r = ((u & 3) << 4) | (s >> 4);
            p = ((s & 15) << 2) | (q >> 6);
            o = q & 63;
            if (isNaN(s)) {
                p = o = 64
            } else {
                if (isNaN(q)) {
                    o = 64
                }
            }
            l = l + this._keys.charAt(t) + this._keys.charAt(r) + this._keys.charAt(p) + this._keys.charAt(o);
            u = s = q = "";
            t = r = p = o = ""
        } while (m < n.length);
        return l
    } 
    },
    _keys: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",
    _keys_urlsafe: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_=",
    _subp_v2_keys: "uAL715W8e3jJCcNU0lT_FSXVgxpbEDdQ4vKaIOH2GBPtfzqsmYZo-wRM9i6hynrk=",
    _subp_v3_keys_3: "5WFh28sGziZTeS1lBxCK-HgPq9IdMUwknybo.LJrQD3uj_Va7pE0XfcNR4AOYvm6t"
};


console.log(base64.encode("113222222"))

图8 定位到加密位置寻找加密函数

图9 寻找到加密函数 本地生成

2.nonce  - 随机生成固定位数字符串

// len = 你想要生成多少位的随机组合结果----- 该加密写死了6位
var makeNonce = function(len) {
    var x = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
    var str = "";
    for (var i = 0; i < len; i++) {
        str += x.charAt(Math.ceil(Math.random() * 1000000) % x.length)
    }
    return str
};
console.log(makeNonce(6))

3.sp   -  对servertime时间戳 + nonce随机字符串 + 密码 进行加密

图10 跟踪到生成raskey

图11 生成key后与参数一起进行加密

在本地调试rsa加密时内部会有检查navigator中的appName、appVersion参数需要自己本地构造。


navigator = {
    appName: "Netscape",
    appVersion: "5.0 (Windows NT 10.0; WOW64; Trident/7.0; .NET4.0C; .NET4.0E; .NET CLR 2.0.50727; .NET CLR 3.0.30729; .NET CLR 3.5.30729; InfoPath.3; rv:11.0) like Gecko",
  
}, window = this, window.navigator = navigator;

sinaSSOEncoder = {
    "base64": {
        "_keys": "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",
        "_keys_urlsafe": "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_=",
        "_subp_v2_keys": "uAL715W8e3jJCcNU0lT_FSXVgxpbEDdQ4vKaIOH2GBPtfzqsmYZo-wRM9i6hynrk=",
        "_subp_v3_keys_3": "5WFh28sGziZTeS1lBxCK-HgPq9IdMUwknybo.LJrQD3uj_Va7pE0XfcNR4AOYvm6t"
    },
    "Cookie": {},
    "getSUBPCookie": {},
    "n": null,
    "e": 0,
    "d": null,
    "p": null,
    "q": null,
    "dmp1": null,
    "dmq1": null,
    "coeff": null
}

!(function() {
        var av;
        var ah = 244837814094590;
        var Y = ((ah & 16777215) == 15715070);
        function aq(z, t, az) {
            if (z != null) {
                if ("number" == typeof z) {
                    this.fromNumber(z, t, az)
                } else {
                    if (t == null && "string" != typeof z) {
                        this.fromString(z, 256)
                    } else {
  
        function S() {
            d(new Date().getTime())
        }
        if (T == null) {
            T = new Array();
            ab = 0;
            var I;
            if (navigator.appName == "Netscape" && navigator.appVersion < "5" && window.crypto && typeof (window.crypto.random) === "function") {
                var F = window.crypto.random(32);
                for (I = 0; I < F.length; ++I) {
                    T[ab++] = F.charCodeAt(I) & 255
                }
            }
            while (ab < M) {
                I = Math.floor(65536 * Math.random());
                T[ab++] = I >>> 8;
                T[ab++] = I & 255
            }
            ab = 0;
            S()
        }
   
        function L() {
            this.n = null;
            this.e = 0;
            this.d = null;
            this.p = null;
            this.q = null;
            this.dmp1 = null;
            this.dmq1 = null;
            this.coeff = null
        }
        function o(z, t) {
            if (z != null && t != null && z.length > 0 && t.length > 0) {
                this.n = g(z, 16);
                this.e = parseInt(t, 16)
            } else {
                alert("Invalid RSA public key")
            }
        }
        function V(t) {
            return t.modPowInt(this.e, this.n)
        }
        function p(az) {
            var t = ae(az, (this.n.bitLength() + 7) >> 3);
            if (t == null) {
                return null
            }
            var aA = this.doPublic(t);
            if (aA == null) {
                return null
            }
            var z = aA.toString(16);
            if ((z.length & 1) == 0) {
                return z
            } else {
                return "0" + z
            }
        }
        L.prototype.doPublic = V;
        L.prototype.setPublic = o;
        L.prototype.encrypt = p;
        this.RSAKey = L
    }

).call(sinaSSOEncoder);

最终输出结果:

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

<python爬虫之JS逆向实例-1>新浪网 的相关文章

  • Python 的键盘中断不会中止 Rust 函数 (PyO3)

    我有一个使用 PyO3 用 Rust 编写的 Python 库 它涉及一些昂贵的计算 单个函数调用最多需要 10 分钟 从 Python 调用时如何中止执行 Ctrl C 好像只有执行结束后才会处理 所以本质上没什么用 最小可重现示例 Ca
  • SQLAlchemy 通过关联对象声明式多对多自连接

    我有一个用户表和一个朋友表 它将用户映射到其他用户 因为每个用户可以有很多朋友 这个关系显然是对称的 如果用户A是用户B的朋友 那么用户B也是用户A的朋友 我只存储这个关系一次 除了两个用户 ID 之外 Friends 表还有其他字段 因此
  • 如何在flask中使用g.user全局

    据我了解 Flask 中的 g 变量 它应该为我提供一个全局位置来存储数据 例如登录后保存当前用户 它是否正确 我希望我的导航在登录后在整个网站上显示我的用户名 我的观点包含 from Flask import g among other
  • 使用带有关键字参数的 map() 函数

    这是我尝试使用的循环map功能于 volume ids 1 2 3 4 5 ip 172 12 13 122 for volume id in volume ids my function volume id ip ip 我有办法做到这一点
  • Django:按钮链接

    我是一名 Django 新手用户 尝试创建一个按钮 单击该按钮会链接到我网站中的另一个页面 我尝试了一些不同的例子 但似乎没有一个对我有用 举个例子 为什么这不起作用
  • 从字符串中删除识别的日期

    作为输入 我有几个包含不同格式日期的字符串 例如 彼得在16 45 我的生日是1990年7月8日 On 7 月 11 日星期六我会回家 I use dateutil parser parse识别字符串中的日期 在下一步中 我想从字符串中删除
  • 以编程方式停止Python脚本的执行? [复制]

    这个问题在这里已经有答案了 是否可以使用命令在任意行停止执行 python 脚本 Like some code quit quit at this point some more code that s not executed sys e
  • Python pickle:腌制对象不等于源对象

    我认为这是预期的行为 但想检查一下 也许找出原因 因为我所做的研究结果是空白 我有一个函数可以提取数据 创建自定义类的新实例 然后将其附加到列表中 该类仅包含变量 然后 我使用协议 2 作为二进制文件将该列表腌制到文件中 稍后我重新运行脚本
  • 如何在Python中获取葡萄牙语字符?

    我正在研究葡萄牙语 角色看起来很奇怪 我怎样才能解决这个问题 代码 import feedparser import random Vou definir os feeds feeds conf feedurl http pplware s
  • Python 的“zip”内置函数的 Ruby 等价物是什么?

    Ruby 是否有与 Python 内置函数等效的东西zip功能 如果不是 做同样事情的简洁方法是什么 一些背景信息 当我试图找到一种干净的方法来进行涉及两个数组的检查时 出现了这个问题 如果我有zip 我可以写这样的东西 zip a b a
  • 在Python中获取文件描述符的位置

    比如说 我有一个原始数字文件描述符 我需要根据它获取文件中的当前位置 import os psutil some code that works with file lp lib open path to file p psutil Pro
  • IO 密集型任务中的 Python 多线程

    建议仅在 IO 密集型任务中使用 Python 多线程 因为 Python 有一个全局解释器锁 GIL 只允许一个线程持有 Python 解释器的控制权 然而 多线程对于 IO 密集型操作有意义吗 https stackoverflow c
  • 无法在 Python 3 中导入 cProfile

    我试图将 cProfile 模块导入 Python 3 3 0 但出现以下错误 Traceback most recent call last File
  • 使用 \r 并打印一些文本后如何清除控制台中的一行?

    对于我当前的项目 有一些代码很慢并且我无法使其更快 为了获得一些关于已完成 必须完成多少的反馈 我创建了一个进度片段 您可以在下面看到 当你看到最后一行时 sys stdout write r100 80 n I use 80覆盖最终剩余的
  • 如何在Python中对类别进行加权随机抽样

    给定一个元组列表 其中每个元组都包含一个概率和一个项目 我想根据其概率对项目进行采样 例如 给出列表 3 a 4 b 3 c 我想在 40 的时间内对 b 进行采样 在 python 中执行此操作的规范方法是什么 我查看了 random 模
  • 类型错误:预期单个张量时的张量列表 - 将 const 与 tf.random_normal 一起使用时

    我有以下 TensorFlow 代码 tf constant tf random normal time step batch size 1 1 我正进入 状态TypeError List of Tensors when single Te
  • Rocket UniData/UniVerse:ODBC 无法分配足够的内存

    每当我尝试使用pyodbc连接到 Rocket UniData UniVerse 数据时我不断遇到错误 pyodbc Error 00000 00000 Rocket U2 U2ODBC 0302810 Unable to allocate
  • Python 类继承 - 诡异的动作

    我观察到类继承有一个奇怪的效果 对于我正在处理的项目 我正在创建一个类来充当另一个模块的类的包装器 我正在使用第 3 方 aeidon 模块 用于操作字幕文件 但问题可能不太具体 以下是您通常如何使用该模块 project aeidon P
  • 导入错误:没有名为 site 的模块 - mac

    我已经有这个问题几个月了 每次我想获取一个新的 python 包并使用它时 我都会在终端中收到此错误 ImportError No module named site 我不知道为什么会出现这个错误 实际上 我无法使用任何新软件包 因为每次我
  • NotImplementedError:无法将符号张量 (lstm_2/strided_slice:0) 转换为 numpy 数组。时间

    张量流版本 2 3 1 numpy 版本 1 20 在代码下面 define model model Sequential model add LSTM 50 activation relu input shape n steps n fe

随机推荐

  • java基础语法(二)

    3 java基础语法 3 1 注释 理解 注释是对代码的解释和说明文字 可以提高程序的可读性 因此在程序中添加必要的注释文字十分重要 Java中的注释分为三种 单行注释 单行注释的格式是使用 从 开始至本行结尾的文字将作为注释文字 这是单行
  • js正则表达式 必须包含数字、字母、指定特殊字符且不包含root

    js正则表达式要求 1 必须包含数字 大写字母 小写字母 特殊符号且长度在10到20之间 2 特殊符号包括 3 不包含root字符串 补充一下 有些朋友问到 最少包含2个大写字母 2个小写字母 2个数字 2个指定的特殊字符 长度10到20
  • FISCO BCOS(二)———配置及使用控制台

    1 准备依赖 安装java 推荐使用java 14 sudo apt install y default jdk 获取控制台并回到fisco目录 cd fisco curl LO https github com FISCO BCOS co
  • Spring Boot 多模块项目创建与配置

    最近在负责的是一个比较复杂项目 模块很多 代码中的二级模块就有9个 部分二级模块下面还分了多个模块 代码中的多模块是用maven管理的 每个模块都使用spring boot框架 之前有零零散散学过一些maven多模块配置的知识 但没自己从头
  • MATLAB 对多个数据自动寻峰/能谱图自动寻峰

    自动读取文件夹中的所有同类型数据文件 记录每个数据文件的峰值 并将所有峰值保存在excel中 数据是负的峰值类型 寻峰的逻辑是 设定一个阈值 0 002 挨个读取某一数据文件中的数据 如果当前数据大于阈值 则读取下一个数据 当当前数据小于阈
  • MANIFEST.MF文件作用及格式要求

    MANIFEST MF文件作用及格式要求 manifest mf文件格式如下 Manifest Version 1 0 Class Path xxx1 jar xxx2 jar xxx3 jar xxx4 jar xxx5 jar Main
  • 跨模态预训练迁移

    1 ViLD Zero Shot Detection via Vision and Language Knowledge Distillation code 2 OVR CNN Open Vocabulary Object Detectio
  • Tars源码分析---智能指针的实现

    前言 TC AutoPtr TC HandleBaseT 构造函数 赋值重载 析构函数 TC ScopedPtr TC SharedPtr tc shared count base tc shared count impl p tc sha
  • pycharm所有版本 http://www.jetbrains.com/pycharm/download/previous.html 打开激活窗口 选择 Activate new license

    pycharm所有版本 http www jetbrains com pycharm download previous html 打开激活窗口 选择 Activate new license with License server 用li
  • YAML学习笔记

    一 YAML概念 在运维日常工作中又很多遇到yaml 例如写ansible的playbook 利用yaml来定义创建各应用及服务 1 1 概念 YAML 发音 j m l 是一个类似 XML JSON 的数据序列化语言 YAML是专门用来写
  • HTTP Status 400 – Bad Request

    采用SpringMVC架构 写的一个简单的form请求 结果出错了 报错信息如下 Type Status Report Description The server cannot or will not process the reques
  • 计算机启动过程详解

    打开电源启动机器几乎是电脑爱好者每天必做的事情 面对屏幕上出现的一幅幅启动画面 我们一点儿也不会感到陌生 但是 计算机在显示这些启动画面时都做了些什么工作呢 相信有的朋友还不是很清楚 本文就来介绍一下从打开电源到出现Windows的蓝天白云
  • opencv源码阅读之——iOS的两条接口UIImageToMat()和MatToUIImage()

    转自 https www cnblogs com panxiaochun p 5387743 html 本文为作者原创 未经允许不得转载 原文由作者发表在博客园 http www cnblogs com panxiaochun p 5387
  • 小程序微信支付申请与配置完整版操作流程

    小程序微信支付申请与配置完整版操作流程 一 申请小程序微信支付 微信支付申请分为两种情况 情况一 申请新的微信支付商户号 情况二 绑定已有微信支付商户号 注意 申请微信支付的小程序账户需要进行微信认证 注册主体为个人的小程序目前暂不支持微信
  • Excel转CSV格式

    注意 CSV文件导出来的 可以理解为 就是一个 普通的文件 但至于使用什么样的软件打开就是另一马事了 比如Excel打开后 出来 自动过滤了数字前面的0 这玩意程序控制不到 那是Excel的事情 CSV不是Excel文件切记 只不过用表格软
  • Cuda 11/10的Dockerfile

    说明 如果NVIDIA显卡不满足要求 请修改dockerfile文件配置要求或慎重使用 关于dockerfile使用请参考我的博客文章 https blog csdn net weixin 41194129 category 1021002
  • 期中总结(码猿周六下午)

    期中总结 这半个学期我们第一二节课考了试 但是 第一次 115分 第二次 110分 结果都很不理想 不过这也在情理之中 之后我们学习了 简单分治 前缀和 二分法 贪心加强 递推 但是实际上后面几题都听得云里雾里的 毕竟是基础不好 再加上码龄
  • 一元多项式求导 C语言

    设计函数求一元多项式的导数 注 x n n为整数 的一阶导数为nxn 1 输入格式 以指数递降方式输入多项式非零项系数和指数 绝对值均为不超过 1000 的整数 数字间以空格分隔 输出格式 以与输入相同的格式输出导数多项式非零项的系数和指数
  • 前端优秀插件网站汇总整理——轻松建站。。。

    1 Amaze Ui 妹子UI 中国首个html5跨屏前端框架 http amazeui org 2 WebUploader 一个简单的以HTML5为主 FLASH为辅的现代文件上传组件 http fex baidu com webuplo
  • <python爬虫之JS逆向实例-1>新浪网

    声明 本文只作学习研究 禁止用于非法用途 否则后果自负 如有侵犯了您的合法权益 请告知 我将及时更正 删除 谢谢 邮箱地址 lc1139411732 163 com 文章目录 一 项目准备 二 参数分析 三 静态调试 四 动态调试 五 堆栈