Python 爬虫进阶必备 | 某直播数据分析平台加密参数 sign 分析
今日网站
aHR0cHMlM0EvL3d3dy5ocmRqeXVuLmNvbS8lM0YlMjMvYW5jaG9yTGlzdA==
被催更了,最近临近特殊时期,所以比较忙,趁着晚上有空来一发。
抓包分析与加密定位
今天这个网站的加密也是比较简单的,所以速战速决。
先看看需要分析的请求
我们需要抓取的是主播流量数据,通过抓包分析可以定位到下面这个请求
在请求头里有两个加密的参数token
和sign
分析这两个参数可以通过参数名检索和xhr
断点两种方式分析,这里先简单检索一下参数名。
如果是新手朋友,
xhr
断点的分析方式可以在用参数名分析的方式定位出加密位置之后自己另外试试,锻炼自己分析堆栈的思维
我们直接检索sign
不管是否加上:
结果都是非常多的
所以尝试下之前提过的方法
当检索加密参数名,结果很多的时候,可以通过检索请求的其他参数名来分析定位,一般它们都是一起提交的,所以一般都会写在一块
所以这里检索tenant
这个参数,可以看到结果很少,而且有价值的结果也很明显
在第二条结果里再次定位,就能够看到我们需要的结果了
打上断点再次刷新验证猜想
可以看到断点成功断上了
我们简单分析一下
变量f
也就是参数sign
它的加密是由V(pe(be(h)) + "&accessSecret=800006").toUpperCase();
得到的
参数token
的结果是由c["a"].globalData.token;
得到的
现在只要把其中的执行的函数扣出来,能跑通就完成参数的生成了
加密逻辑分析
先来看看参数token
从名字来看,这个参数是一个全局的变量,但是通过检索,发现这个参数是没有检索结果的,而且多次刷新都没有变化
我切换到其他的浏览器测试,这个参数的值多次刷新也是没有变化的,所以这个参数可能是账号+浏览器环境结合生成的的一种标识,长得唬人而已,当作固定值就好
再看下参数sign
可以看到它的加密是由V(pe(be(h)) + "&accessSecret=800006").toUpperCase();
得到的,所以我们一步一步来看
首先执行的是be(h)
好像看不出来有做什么特殊的操作,我们验证一下
继续验证下pe(be(h)
可以看到pe
是用=
将参数拼接起来
继续看V()
,这个时候传入的参数是days=3&accessSecret=800006
同时传入到X(Q(K(e)))
这段代码里,我们继续调试
同时用console
辅助调试
方法K
将参数做了CharCode
这里因为我们的参数是由英文和数字组成,所以没有变化
下面继续分析方法Q
,console
辅助调试结果显示,Q
也是做了一系列的位运算
没分析出来具体是什么,直接抠出来
得到Q
的结果之后再看X
这里的W
是固定值0
我们直接带入代码就可以得到下面的结果了
可以看到和浏览器运行结果一样
之后经过大写转换就和请求提交的完全一样了
之后直接传入Python
脚本就可以了
好了,以上就是今天的全部内容了,咱们下次再会~
[ 完 ]
- python多版本的pip共存问题解决办法
- C++ 对vector进行排序
- 小程序优化36计
- 神经网络权重初始化问题
- Andrew Ng机器学习课程笔记--week11(图像识别&总结划重点)
- 市民近期到南沙有望体验到无人驾驶技术
- Andrew Ng机器学习课程笔记--week10(优化梯度下降)
- Andrew Ng机器学习课程笔记--week9(下)(推荐系统&协同过滤)
- Andrew Ng机器学习课程笔记--week9(上)(异常检测&推荐系统)
- python程序员开发必备的5大工具,你用过几个?
- Andrew Ng机器学习课程笔记--week8(K-means&PCA)
- Andrew Ng机器学习课程笔记--week7(SVM)
- Pytorch windows10安装教程
- Udacity并行计算课程笔记-The GPU Programming Model
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- innobackupex命令总结
- 使用sysbench对数据库进行压测 Part2 sysbench语法介绍
- MySQL Galera Cluster全解析 Part 9 监控Galera Cluster
- redis的介绍及安装
- 使用oradebug捕获SQL语句
- MySQL information_schema详解 PROCESSLIST
- MySQL组复制(MGR)全解析 Part 6 监控MySQL组复制
- 代码审计day2
- 使用XtraBackup备份MySQL 8.0 Part 8 xtrabackup 命令总结
- 代码审计day5
- 使用innobackupex对数据库进行部分备份(指定表或数据库)
- 使用Django获取Linux性能数据并存放在redis中
- MySQL组复制(MGR)全解析 Part 5 MGR单主模式部署指南
- php学习day4
- 使用Python爬取动态网页-腾讯动漫(Selenium)