网络爬虫js逆向之某音乐平台案例

 【注意!!!】

前言:

        - 本章主要讲解某音乐平台的js逆向知识

        - 使用关键字搜定位加密入口

        - 通过多篇文章【文字+案例】的形式系统化进行描述

        - 本文章全文进行了脱敏处理

        - 详细代码不进行展示,需要则私聊作者

爬虫js逆向专栏:https://blog.csdn.net/2201_75422674/category_12875823.html

爬虫专栏:https://blog.csdn.net/2201_75422674/category_12686609.html

        - 大家喜欢可以订阅一下,不收费用的

目录

【1】抓包分析

【2】入口定位

​【3】逆向

3.1 逆向思路

3.2 深度刨析

3.2.1 求解d、e、f、g的值

3.2.2 求解i的值

3.2.3 逆向h.encText的值,分析b函数

3.2.4 逆向h.encSecKey的值,分析c函数

【4】结果展示


【1】抓包分析

点击F12,打开谷歌开发者工具,确认发送数据包具体的网址以及发送请求需要携带的加密参数

【2】入口定位

这里使用关键字搜定位入口

 【3】逆向

3.1 逆向思路

 function a(a) {var d, e, b = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789", c = "";for (d = 0; a > d; d += 1)e = Math.random() * b.length,e = Math.floor(e),c += b.charAt(e);return c}​function d(d, e, f, g) {var h = {}, i = a(16);return h.encText = b(d, g),h.encText = b(h.encText, i),h.encSecKey = c(i, e, f),h}

总体思路为:

第一,先通过a函数随机挑选出i的值

第二,然后调用b函数传入d、g的值得到第一个h.encText的结果

第三,然后再调用b函数传入h.encText、i的值得到第二个h.encText的结果

第四,然后调用c函数传入i、e、f的值得到h.encSecKey的结果

最后,return跟着的是一个逗号表达式,返回最后一个h变量,再发送阿贾克斯请求

3.2 深度刨析

3.2.1 求解d、e、f、g的值

这里d的值很重要,因为点击播放音乐时,该网站会同时发送好几个请求,d的值在变化,如果d的值不是对应播放音乐的相应值,会导致参数错误!!!

断点后重新发送请求,d、e、f、g的值每次都一样。

3.2.2 求解i的值

1. 断点+分析

2. 查看i的值

如上所示:i的值就是16位随机组合的字符串

3.2.3 逆向h.encText的值,分析b函数

1. 悬浮定位查看b函数

2. 进入b函数,并打上断点

3. 每次发现第一次的a、b值永远为以下的值

    var a1 = '{"ids":"[歌曲id]","level":"standard","encodeType":"aac","csrf_token":"16fb7117e480783d71478af079eaec9d"}';var b1 = '0CoJUm6Qyw8W8jud'

4. 分析b函数中的c、d、e、f值

  • 4.1 逆向c的值

结果返回该c的值,发现一直都是一样的,因为传入的参数没变,只是对传入的参数进行了一个反序列化操作;同理见d、e的值

  • 4.2 求解f的值

 f = CryptoJS.AES.encrypt(e, c, {iv: d,mode: CryptoJS.mode.CBC});return f.toString()// e: 明文,c:key,iv:偏移量,mode:CBC加密模式

由上所见,这是一个标准的AES加密,最终得到f的字符串形式

通过控制台打印输出,这个f.toString()的返回值和第一次得到的h.encText一模一样

 h.encText = b(h.encText, i) // 重复上述步骤,一样的
3.2.4 逆向h.encSecKey的值,分析c函数

1. 悬浮定位查看c函数

2. 进入c函数,并打上断点

3. 分析RSAKeyPair函数

4. 进入RSAKeyPair函数并打上断点,结果发现每次经过RSAKeyPair产生的d值都一样

由此可见,主要的问题是e函数怎么搞。

5. 分析encryptedString函数

  • 断点+分析,主要为以下代码

当我进入里面想暴力破解它的加密逻辑时,发现对应了一大堆函数,果断使用抠js代码逆向的方式进行处理。

【4】结果展示

由上可见,已经成功获取数据!操作不易,请点个赞,谢谢~ 

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

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

相关文章

腾讯云 TI 平台部署与调用DeepSeek-R1大模型的实战指南

今天我们将继续探讨如何部署一个私有化的 DeepSeek-R1 大模型,具体的部署过程我们将利用腾讯云的 TI 平台进行操作。当前,腾讯云 TI 平台为用户提供了免费体验的满血版 DeepSeek-R1 大模型,同时该平台还提供了开放的 API 接口服务&#xff0c…

Python自动化测试selenium指定截图文件名方法

这篇文章主要介绍了Python自动化测试selenium指定截图文件名方法,Selenium 支持 Web 浏览器的自动化,它提供一套测试函数,用于支持 Web 自动化测试,下文基于python实现指定截图文件名方法,需要的小伙伴可以参考一下 前…

Gurobi基础语法之 addConstr, addConstrs, addQConstr, addMQConstr

在新版本的 Gurobi 中,向 addConstr 这个方法中传入一个 TempConstr 对象,在模型中就会根据这个对象生成一个约束。更重要的是:TempConstr 对象可以传给所有addConstr系列方法,所以下面先介绍 TempConstr 对象 TempConstr TempC…

Django框架丨从零开始的Django入门学习

Django 是一个用于构建 Web 应用程序的高级 Python Web 框架,Django是一个高度模块化的框架,使用 Django,只要很少的代码,Python 的程序开发人员就可以轻松地完成一个正式网站所需要的大部分内容,并进一步开发出全功能…

Redis --- 秒杀优化方案(阻塞队列+基于Stream流的消息队列)

下面是我们的秒杀流程: 对于正常的秒杀处理,我们需要多次查询数据库,会给数据库造成相当大的压力,这个时候我们需要加入缓存,进而缓解数据库压力。 在上面的图示中,我们可以将一条流水线的任务拆成两条流水…

开源AI智能名片2 + 1链动模式S2B2C商城小程序:内容价值创造与传播新引擎

摘要:本文聚焦于信息爆炸时代下,内容价值的创造与传播。随着用户角色的转变,其在内容生产与传播中的价值日益凸显。同时,深入探讨开源AI智能名片2 1链动模式S2B2C商城小程序这一创新商业模式,如何借助用户创造内容并传…

游戏引擎 Unity - Unity 打开项目、Unity Editor 添加简体中文语言包模块、Unity 项目设置为简体中文

Unity Unity 首次发布于 2005 年,属于 Unity Technologies Unity 使用的开发技术有:C# Unity 的适用平台:PC、主机、移动设备、VR / AR、Web 等 Unity 的适用领域:开发中等画质中小型项目 Unity 适合初学者或需要快速上手的开…

AllData数据中台核心菜单十二:数据同步平台

🔥🔥 AllData大数据产品是可定义数据中台,以数据平台为底座,以数据中台为桥梁,以机器学习平台为中层框架,以大模型应用为上游产品,提供全链路数字化解决方案。 ✨奥零数据科技官网:…

备考蓝桥杯嵌入式4:使用LCD显示我们捕捉的PWM波

上一篇博客我们提到了定时器产生PWM波,现在,我们尝试的想要捕获我们的PWM波,测量它的频率,我们应该怎么做呢?答案还是回到我们的定时器上。 我们知道,定时器是一个高级的秒表(参考笔者的比喻&a…

数字人|通过语音和图片来创建高质量的视频

简介 arXiv上的计算机视觉领域论文: AniPortrait: Audio-Driven Synthesis of Photorealistic Portrait Animation AniPortrait:照片级真实感肖像动画的音频驱动合成 核心内容围绕一种新的人像动画合成框架展开。 研究内容 提出 AniPortrait 框架&a…

stm32点灯 GPIO的输出模式

目录 1.选择RCC时钟 2.SYS 选择调试模式 SW 3.GPIO 配置 4.时钟树配置( 默认不变)HSI 高速内部时钟8Mhz 5.项目配置 6.代码 延时1s循环LED亮灭 1.选择RCC时钟 2.SYS 选择调试模式 SW 3.GPIO 配置 4.时钟树配置( 默认不变&#xff09…

OpenEuler学习笔记(十六):搭建postgresql高可用数据库环境

以下是在OpenEuler系统上搭建PostgreSQL高可用数据环境的一般步骤,通常可以使用流复制(Streaming Replication)或基于Patroni等工具来实现高可用,以下以流复制为例: 安装PostgreSQL 配置软件源:可以使用O…

Sentinel的安装和做限流的使用

一、安装 Release v1.8.3 alibaba/Sentinel GitHubA powerful flow control component enabling reliability, resilience and monitoring for microservices. (面向云原生微服务的高可用流控防护组件) - Release v1.8.3 alibaba/Sentinelhttps://github.com/alibaba/Senti…

【C++】STL——stack的底层实现

目录 💕 1.适配器Container 💕2.真实的底层实现 💕3.测试用例 💕4.完结 一个人的坚持到底有多难 声明:需先了解vector,list,stack的使用 💕 1.适配器Container 在实现栈的底层实现时&am…

PostgreSQL证书什么样子的?

PostgreSQL证书,一般指的是PostgreSQL数据库的能力认证证书,跟Oracle数据库的认证(OCA、OCP、OCM,这里的“O”表示Oracle)类似,这里介绍的PostgreSQL数据库认证也分为三种,分别是PGCA、PGCP、PGCM,这里的“…

每日Attention学习18——Grouped Attention Gate

模块出处 [ICLR 25 Submission] [link] UltraLightUNet: Rethinking U-shaped Network with Multi-kernel Lightweight Convolutions for Medical Image Segmentation 模块名称 Grouped Attention Gate (GAG) 模块作用 轻量特征融合 模块结构 模块特点 特征融合前使用Group…

Three.js 后期处理(Post-Processing)详解

目录 前言 一、什么是后期处理? 二、Three.js 后期处理的工作流程 2.1 创建 EffectComposer 2.2 添加渲染通道(Render Pass) 2.3 应用最终渲染 三、后期处理实现示例 3.1 基础代码 四、常见的后期处理效果 4.1 辉光效果&#xf…

Kubernetes 中 BGP 与二层网络的较量:究竟孰轻孰重?

如果你曾搭建过Kubernetes集群,就会知道网络配置是一个很容易让人深陷其中的领域。在负载均衡器、服务通告和IP管理之间,你要同时应对许多变动的因素。对于许多配置而言,使用二层(L2)网络就完全能满足需求。但边界网关协议(BGP)—— 支撑互联网运行的技术 —— 也逐渐出…

数据结构初探:链表之双向链表篇

本文图皆为作者手绘,所有代码基于vs2022运行测试 系列文章目录 数据结构初探: 顺序表 数据结构初探:链表之单链表篇 文章目录 系列文章目录前言一.双向链表的概念二.双向链表的存储结构三.准备工作四.双向链表的增删查改的实现1.List.h2.List.c2.1双向链表的可复用的节点创建函…

尝试把clang-tidy集成到AWTK项目

前言 项目经过一段时间的耕耘终于进入了团队开发阶段,期间出现了很多问题,其中一个就是开会讨论团队的代码风格规范,目前项目代码风格比较混乱,有的模块是驼峰,有的模块是匈牙利,后面经过讨论,…