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
脚本就可以了
好了,以上就是今天的全部内容了,咱们下次再会~
[ 完 ]
- MapReduce 中的两表 join 几种方案简介
- MapReduce中的自定义多目录/文件名输出HDFS
- 通过hiveserver远程服务构建hive web查询分析工具
- Hive 中内部表与外部表的区别与创建方法
- 常用统计分析 SQL 在 AWK 中的实现
- java 中 16 进制 HEX 转换成字节码形式的 UTF-8
- Hadoop 多表 join:map side join 范例
- 实战 windows7 下 eclipse 远程调试 linux hadoop
- Hive 在多维统计分析中的应用 & 技巧总结
- shell 学习笔记(18)
- Hive 中的复合数据结构简介以及一些函数的用法说明
- BloomFilter 简介及在 Hadoop reduce side join 中的应用
- 关于 hadoop reduce 阶段遍历 Iterable 的 2 个“坑”
- Hadoop Mapper 阶段将数据直接从 HDFS 导入 Hbase
- 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 数组属性和方法
- Java实现基本数据结构(二)——栈
- Java实现基本数据结构(一)——数组
- concurrently 实现前后端连载启动
- Vue+Koa2 前后端分离项目线上部署
- Nativefier— 将网站打包成桌面程序
- JAVA反射功能
- Git
- Bootstrap实用功能总结
- Bootstrap基础学习笔记
- 基于Paddle Lite在Android手机上实现图像分类
- redis学习笔记-set
- 图解一致性哈希算法,全网(小区局域网)最通俗易懂
- ES 创建索引时使用Dynamic Mapping动态映射 对字符串字段生成keyword字段
- Java 报错信息 Error during JavaScript execution
- 记录一次SpringBoot Autowired为null的错误