某度网盘提取下载链接JS逆向分析(一)

本次目标网址如下,使用base64解码后获得
aHR0cHM6Ly9wYW4uYmFpZHUuY29tL3MvMUZsaDBPeGpZamZJTFVZWUQzTm9fVnc=
链接提取码为:ly12

本次逆向分析分为上下两篇文章说明,一为讲解如何从原链接通过逆向拿到下载链接,二为逆向登录拿到cookie,因为在获取下载链接的过程中,是要登录百度网盘的账号的,本文在讲解提取的过程中,登录后的cookies先固定死,只讲解最后拿到的百度网盘链接,后面再讲解逆向登录拿到cookie

解密流程

    • 1、找到下载链接
    • 2、分析接口参数
    • 3、分析data参数
    • 4、分析链接参数
    • 5、组装加密接口

1、找到下载链接

下载链接其实非常好找,打开network,点击下载查看接口协议就能看到,如下图
在这里插入图片描述
将下载链接跟接口中比对查找后就能发现,与dlink字段的值一模一样,那么下载链接就在share这个接口里面

2、分析接口参数

我们将share接口复制成curl请求后,放到该网站解析
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/ad8500f6d7a144a89bca7466207471bb.png

https://curlconverter.com/python/

通过转换成python代码后如下
在这里插入图片描述
那么本次需要分析的就是data参数和url链接参数

3、分析data参数

这些参数我们逐个研究,先从data参数入手,这里固定的参数就不再多说了,只说变化的参数,全局搜索extra字段, 通过试错查找,发现在这个位置生成
在这里插入图片描述
我们跟进s函数,发现就是取出cookie,那个extra值就是cookie中的BDCLND,由于之前说过,本文不涉及登录,cookie参数是固定的,所以这里就不再往下追究去找cookie的来源了

在这里插入图片描述
vcode_input是输入验证码的参数,vcode_str是请求验证码时附带的校验参数,需要和正确的验证码一起传回去,校验验证码是否正确,如下图,可以找到vcode_str的来源
在这里插入图片描述
接着看primaryid参数,还是跟栈查找,在这个位置
在这里插入图片描述
查找流程就不多说了,稍微根根就能找到,可以发现,primaryid就是shareid, uk就是share_uk,一下子解决两个参数,我们再往前跟栈找找,查看参数生成的位置
在这里插入图片描述
最终我们发现,这两个参数都是在请求网页时附带生成, 同样fid_list应该就是文件列表的id,也在加载网页时就附带了
在这里插入图片描述
至此,data参数已经分析完毕

4、分析链接参数

接着,我们看请求链接中的参数,我们重放请求后,最后确定,可变的参数如下

 f'https://pan.baidu.com/api/sharedownload?sign={sign}&timestamp={timestamp}&channel=chunlei&web=1&app_id={appid}&bdstoken={bdstoken}&logid={logid}&clienttype=0&jsToken={jsToken}&dp-logid={dplogid}'

sign和timestamp在tplconfig接口里面
在这里插入图片描述
appid是固定应用id,bdstoken在yundata里面
在这里插入图片描述
logid是cookie里的BAIDUID
dplogid是全局函数window.BpDataInstance.getDpLogId()
在这里插入图片描述
至此,所有加密参数已经找到

5、组装加密接口

加密接口组装流程如下,
初始化进入页面接口-获取sign接口-获取验证码接口-获取下载链接接口
按照流程,组装代码如下

response = session.get('https://pan.baidu.com/s/1Flh0OxjYjfILUYYD3No_Vw?pwd=ly12?', headers=headers)# 使用正则表达式提取带有 window.jsToken 的 script 标签内容
pattern = r'<script\b[^>]*>([\s\S]*?)<\/script>'
matches = re.findall(pattern, response.text)# 遍历匹配到的 script 标签内容
for match in matches:if 'window.jsToken' in match:# print(match)jsToken = urllib.parse.unquote(match)jsToken = jsToken.split('("')[1].split('")')[0]# 遍历匹配到的 script 标签内容
for match in matches:if 'window.yunData' in match:# 使用正则表达式提取第二个自执行代码块pattern = r'!function\(\)\s*{([\s\S]*?)}\(\);'selfexecutes = re.findall(pattern, match)# 输出第二个自执行代码块for selfexecute in selfexecutes:if "window.yunData" in selfexecute:selfexecutefun = selfexecutesign_url = 'https://pan.baidu.com/share/tplconfig?surl=' + download_paramsekey = urllib.parse.unquote(cookies.get("BDCLND"))jsstr = execjs.compile(jsstr.replace("{selfexecutes}", selfexecutefun))
yunData = jsstr.call("get_yundata")
locals = jsstr.call("get_locals")bdstoken = yunData.get("bdstoken")
fsid = locals.get('file_list')[0].get("fs_id")# 获取sign接口
response = session.get(sign_url + f'&fields=sign,timestamp&channel=chunlei&web=1&app_id={appid}&bdstoken={bdstoken}&logid={logid}&clienttype=0&dp-logid={dplogid}',headers=headers,
)sign = response.json().get("data").get("sign")
timestamp = response.json().get("data").get("timestamp")# 请求验证码
response = session.get(f'https://pan.baidu.com/api/getvcode?prod=pan&t=0.2430438848136891&channel=chunlei&web=1&app_id={appid}&bdstoken={bdstoken}&logid={logid}&clienttype=0&dp-logid={dplogid}',headers=headers,
)
print(response.json())
vcode_str = response.json().get("vcode")
img = response.json().get("img")# 下载验证码
response = session.get(img,cookies=cookies,headers=headers, )
with open('vcode.jpg', 'wb') as f:f.write(response.content)# vcode_str = '3332423865633234636166333465663732323763363637363764323966666433666231363236383236373834303030303030303030303030303031373035353639333539FD63FF431D35E2B5D98E13D16C79AEA0'
print(1)
# 获取下载链接data = {'encrypt': '0','extra': '{"sekey":"%s"}' % sekey,'product': 'share','vcode_input': 'H4DG','vcode_str': vcode_str,'uk': yunData.get("share_uk"),'primaryid': yunData.get("shareid"),'fid_list': f'[{fsid}]','path_list': '','vip': '2',
}response = session.post(f'https://pan.baidu.com/api/sharedownload?sign={sign}&timestamp={timestamp}&channel=chunlei&web=1&app_id={appid}&bdstoken={bdstoken}&logid={logid}&clienttype=0&jsToken={jsToken}&dp-logid={dplogid}',headers=headers,data=data,
)
print(response.text)
dlink = response.json().get('list')[0].get('dlink')
server_filename = response.json().get('list')[0].get('server_filename')response = session.get(dlink,cookies=cookies,headers=headers,
)
print(response)
print(server_filename, len(response.content))
with open(server_filename, "wb") as f:f.write(response.content)

用到的js补环境如下,navigator实际上并没有用到那么多,我使用一键获取,懒得删用不着的变量了:

window = global;navigator = {"vendorSub": "","productSub": "20030107","vendor": "Google Inc.","maxTouchPoints": 0,"scheduling": {},"userActivation": {},"doNotTrack": null,"geolocation": {},"connection": {},"plugins": {"0": {"0": {},"1": {}},"1": {"0": {},"1": {}},"2": {"0": {},"1": {}},"3": {"0": {},"1": {}},"4": {"0": {},"1": {}}},"mimeTypes": {"0": {},"1": {}},"pdfViewerEnabled": true,"webkitTemporaryStorage": {},"webkitPersistentStorage": {},"hardwareConcurrency": 8,"cookieEnabled": true,"appCodeName": "Mozilla","appName": "Netscape","appVersion": "5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36","product": "Gecko","language": "zh-CN","languages": ["zh-CN","zh"],"onLine": true,"webdriver": false,"deprecatedRunAdAuctionEnforcesKAnonymity": false,"bluetooth": {},"clipboard": {},"credentials": {},"keyboard": {},"managed": {},"mediaDevices": {},"storage": {},"serviceWorker": {},"virtualKeyboard": {},"wakeLock": {},"deviceMemory": 8,"cookieDeprecationLabel": {},"login": {},"ink": {},"hid": {},"locks": {},"gpu": {},"mediaCapabilities": {},"mediaSession": {},"permissions": {},"presentation": {},"usb": {},"xr": {},"serial": {},"windowControlsOverlay": {},"userAgentData": {"brands": [{"brand": "Not_A Brand","version": "8"},{"brand": "Chromium","version": "120"},{"brand": "Google Chrome","version": "120"}],"mobile": false,"platform": "Windows"}
}location = {"ancestorOrigins": {},"href": "https://pan.baidu.com/s/1TBy2gI-PUz2P_SWjCjq-ww?pwd=d1g1","origin": "https://pan.baidu.com","protocol": "https:","host": "pan.baidu.com","hostname": "pan.baidu.com","port": "","pathname": "/s/1TBy2gI-PUz2P_SWjCjq-ww","search": "?pwd=d1g1","hash": ""
}document = {}locals = {set: function(k, v){//console.log(k,v);this[k] = v},mset: function(v){this.data = v}
}require("./bpdatajs-sdk-min-1.3.3.js")if (window.BpData) {window.BpDataInstance = new BpData({serverId: 13328,from: 'main',page: 'share_common_page',parasitifer: 'web'})
}{selfexecutes}function getDpLogId(){/*for(var i = 0;i < 40;i ++){window.BpDataInstance.getDpLogId()}*/return window.BpDataInstance.getDpLogId()
}function get_yundata(){return window.yunData;
}
function get_locals(){return locals.data;
}
function get_servertime(){return locals.servertime;
}//console.log(locals);

最后,也能成功下载文件到本地
在这里插入图片描述

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

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

相关文章

flink结合Yarn进行部署

1. 什么是Yarn模式部署Flink 独立&#xff08;Standalone&#xff09;模式由 Flink 自身提供资源&#xff0c;无需其他框架&#xff0c;这种方式降低了和其他第三方资源框架的耦合性&#xff0c;独立性非常强。但我们知道&#xff0c;Flink 是大数据计算框架&#xff0c;不是资…

C++学习笔记——指针

1&#xff0c;指针的基本概念 指针的作用&#xff1a;可以通过指针间接访问内存 内存的编号是从0开始记录的&#xff0c;一般用十六进制数字表示可以利用指针变量保存地址 上图中的p就是a变量的指针&#xff0c;也可以记作*a 2&#xff0c;指针变量的定义和使用 指针变量定…

Linux操作系统——理解文件系统

预备知识 到目前为止&#xff0c;我们所学习到的关于文件的操作&#xff0c;全部都是基于文件被打开&#xff0c;被访问&#xff0c;访问期间比较重要的有重定向&#xff0c;缓冲区&#xff0c;一切皆文件&#xff0c;当我们访问完毕的时候需要将文件关闭&#xff0c;关闭时那…

3.RHCSA脚本配置及通过node2改密码

运行脚本发现node2不成功 脚本破解 选第二个 Ctrl x 换行 破解成功后做node2的改密码题 回到redhat, 发现检测程序检测密码题成功,得了8分.

DBA技术栈MongoDB: 数据增改删除

该博文主要介绍mongoDB对文档数据的增加、更新、删除操作。 1.插入数据 以下案例演示了插入单个文档、多个文档、指定_id、指定多个索引以及插入大量文档的情况。在实际使用中&#xff0c;根据需求选择适合的插入方式。 案例1&#xff1a;插入单个文档 db.visitor.insert({…

【蓝桥杯冲冲冲】动态规划初步[USACO2006 OPEN] 县集市

蓝桥杯备赛 | 洛谷做题打卡day13 文章目录 蓝桥杯备赛 | 洛谷做题打卡day13题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 提示样例说明数据规模与约定 思路&#xff1a;方程&#xff1a; 题解代码我的一些话 [USACO2006 OPEN] 县集市 The County Fair 题目描述 每年…

Threejs实现立体3D园区解决方案及代码

一、实现方案 单独贴代码可能容易混乱&#xff0c;所以这里只讲实现思路&#xff0c;代码放在最后汇总了下。 想要实现一个简单的工业园区、主要包含的内容是一个大楼、左右两片停车位、四条道路以及多个可在道路上随机移动的车辆、遇到停车位时随机选择是否要停车&#xff0…

解决ssh登录Permission denied, please try again

现象截图如下&#xff1a; 确定root的密码是正确的&#xff0c;最后的原因找到了&#xff0c;是远程的服务器&#xff0c;禁用了root账户可以被远程访问的权限。开启操作如下&#xff1a; 1.编辑配置文件 vi /etc/ssh/sshd_config 2.文件中找到PermitRootLogin #PermitRoo…

seaborn可视化示例详解

目录 1、散点图 2、散点图回归线 3、折线图 4、频数柱状图 5、分组散点图 6、箱型图 7、数值分布柱状图 8、频数分布图 9、联合分布图 10、数值分布柱状图 11、相关系数热力图 划重点 少走10年弯路 Seaborn是一个基于Python的数据可视化库&#xff0c;Seaborn提供了许多用…

链表|数据结构|C语言深入学习

什么是链表 离散&#xff0c;就是“分离的、散开的” 链表是什么样子的&#xff1a; 有限个节点离散分配 彼此间通过指针相连 除了首尾节点&#xff0c;每个节点都只有一个前驱节点和一个后继节点 首节点没有前驱结点&#xff0c;尾节点没有后继节点 基本概念术语&#xf…

1.使用分布式文件系统Minio管理文件

分布式文件系统DFS分类 文件系统 文件系统是操作系统用于组织管理存储设备(磁盘)或分区上文件信息的方法和数据结构,负责对文件存储设备空间进行组织和分配,并对存入文件进行保护和检索 文件系统是负责管理和存储文件的系统软件&#xff0c;操作系统通过文件系统提供的接口去…

Docker五部曲之五:通过Docker和GitHub Action搭建个人CICD项目

文章目录 项目介绍Dockerfile解析compose.yml解析Nginx反向代理到容器以及SSL证书设置MySQL的准备工作Spring和环境变量的交互 GitHub Action解析项目测试结语 项目介绍 该项目是一个入门CICD-Demo&#xff0c;它由以下几部分组成&#xff1a; Dockerfile&#xff1a;用于构建…

「 典型安全漏洞系列 」05.XML外部实体注入XXE详解

1. XXE简介 XXE&#xff08;XML external entity injection&#xff0c;XML外部实体注入&#xff09;是一种web安全漏洞&#xff0c;允许攻击者干扰应用程序对XML数据的处理。它通常允许攻击者查看应用程序服务器文件系统上的文件&#xff0c;并与应用程序本身可以访问的任何后…

【Unity小技巧】3D人物移动脚步和跳跃下落音效控制

文章目录 单脚步声多脚步声&#xff0c;跳跃落地音效播放不同材质的多脚步声完结 单脚步声 public AudioClip walkingSound; public AudioClip runningSound;//移动音效 public void MoveSound() {// 如果在地面上并且移动长度大于0.9if (isGround && moveDirection.s…

动物免疫(羊驼免疫)-泰克生物

在过去几十年里&#xff0c;抗体研究和应用的领域已经经历了革命性的变化。在这个进程中&#xff0c;一种特殊来源的抗体 —— 来自骆驼科动物&#xff08;包括羊驼&#xff09;的单链抗体&#xff08;也称纳米抗体&#xff09;引起了全球科学家的广泛关注。 羊驼等骆驼科动物…

【Linux】python版本控制和环境管理

文章目录 1.查看目前python的版本2.添加软件源并更新3.选择你想要下载的版本4.警示&#xff1a;没必要设置默认版本误区千万千万不要覆盖python3软链接解决办法 5.pip软件包管理最省心稍微麻烦换源 网上有很多教程都是教导小白去官方下载之后编译安装。但是&#xff0c;小白连c…

4.go 基础类型及类型转换

目录 概述basic types总结例子 Zero values总结例子 类型转换总结例子 结束 概述 go 版本&#xff1a; go1.20.13 basic types 总结 基本类型如下&#xff1a; boolstringint int8 int16 int32 int64 uint uint8 uint16 uint32 uint64 uintptrbyte // alias for uint8…

[pytorch入门] 2. tensorboard

tensorboard简介 TensorBoard 是一组用于数据可视化的工具。它包含在流行的开源机器学习库 Tensorflow 中.但是也可以独立安装&#xff0c;服务Pytorch等其他的框架 可以常常用来观察训练过程中每一阶段如何输出的 安装pip install tensorboard启动tensorboard --logdir<d…

蓝桥杯理历年真题 —— 数学

1. 买不到的数目 这道题目&#xff0c;考得就是一个日常数学的积累&#xff0c;如果你学过这个公式的话&#xff0c;就是一道非常简单的输出问题&#xff1b;可是如果没学过&#xff0c;就非常吃亏&#xff0c;在考场上只能暴力求解&#xff0c;或是寻找规律。这就要求我们什么…

Python图像处理【19】基于霍夫变换的目标检测

基于霍夫变换的目标检测 0. 前言1. 使用圆形霍夫变换统计图像中圆形对象2. 使用渐进概率霍夫变换检测直线2.1 渐进霍夫变换原理2.2 直线检测 3. 使用广义霍夫变换检测任意形状的对象3.1 广义霍夫变换原理3.2 检测自定义形状 小结系列链接 0. 前言 霍夫变换 (Hough Transform,…