Python 爬虫进阶必备 | 关于某服务平台数据解密流程分析
这真的是我最后一次写喂饭教程了。
目标网站
aHR0cDovL2p6c2MubW9odXJkLmdvdi5jbi9kYXRhL2NvbXBhbnk=
我们今天的目标是分析这个网站的数据解密,至于其他的参数留待后续。
这篇文章偏新手向,愿意支持咸鱼的大佬可以直接划到最后点个赞就好。
现在进入正文,之前已经分析过好多网站的相关加密了,所以今天还是之前的老三样,抓包分析,定位加密,分析加密
抓包分析
打开目标网站,可以看到网站的加载了多页的列表,打开控制台,清除缓存和抓包,重新刷新,务必做到不漏包。
通过刷新网站可以看到一个比较明显的数据包。
查看这个请求的返回,可以看到返回的数据是一串加密的密文数据。
这就是我们需要分析的数据了,新手朋友遇到这样的数据可能无从下手,这里我们会使用到 XHR 断点
工具来帮助我们定位数据加密的位置。
为啥还要重提一个这个工具,因为在博客的私信栏和留言区都被
“大佬,怎么打 XHR 断点分析 ? ”
类似这样的问题塞满了。
所以这里最后写一次。
XHR 断点
按 "F12" 打开开发者工具,切换到sources
面板
在右侧的工具栏中找到下面这个图标,并且像我一样填上
至于为什么是这一串字符串,你只要记住这一串字符串是你要分析的请求的一部分,所以赶紧动手试试吧。(要分析的请求是 xhr 请求才行)
打上XHR 断点
之后就可以刷新页面重新加载了,不要没有刷新就问我为什么断点没有断上。
刷新后,页面出现这样的情况说明就是断上了。
好了,XHR断点
的部分结束
到这里我们就完成了抓包分析的部分。
定位加密
成功的打上断点,之后我们需要逐步调试 js 代码,一定要熟练使用sources
面板的工具啊。
现在我们要再次明确需求,我们是要分析请求返回的加密数据是如何解密的,而我们现在断点的位置是请求发出的位置,所以不要傻傻的分析堆栈了,看不懂还无用。
所以我们需要继续执行断点,直到执行到下图这个位置,这里第一次出现了加密的返回数据。(应该是第一次出现,没太注意)
所以要放慢一点调试
我们继续执行 js,直到这个位置,找到解密的逻辑。
新手朋友肯定要问了,你怎么知道这里就是解密的数据呢?
很简单,你只要继续调试,几步之后你就会看到解密好的数据了,那么解密的代码就在上一次加密参数和明文参数之间的位置,打上断点再调试就可以精准定位了。
分析加密
可以看到在下面这张图中,使用JSON.parse(h(t.data));
解密了数据,除去json
序列化的代码外,就只剩h
这个方法了,所以追进去看看。(快捷键是 F11)
可以看到h
函数的逻辑非常清晰。
通过控制台还可以看到解密结果
整个逻辑是非常简单,怎么扣呢?
不用扣,导入 js 的加密库就好了。
var CryptoJs = require('crypto-js');
var f = CryptoJs.enc.Utf8.parse("jo8j9wGw%6HbxfFn");
var m = CryptoJs.enc.Utf8.parse("0123456789ABCDEF");
function h(t) {
var e = CryptoJs.enc.Hex.parse(t)
, n = CryptoJs.enc.Base64.stringify(e)
, a = CryptoJs.AES.decrypt(n, f, {
iv: m,
mode: CryptoJs.mode.CBC,
padding: CryptoJs.pad.Pkcs7
})
, r = a.toString(CryptoJs.enc.Utf8);
return r.toString()
}
// t 就是返回的加密数据
console.log(h(t))
直接给上代码。
解密结果
以上。
上面就是这次分析的全部内容了,咱们下次再会~
Love & Share
- 如果技术是一种生命
- ruby学习笔记(2)--类的基本使用
- 域名资讯:四声域名BHHS.com被BHHS公司收购
- ruby学习笔记(1)--初识语法
- 无法启用数据库中的 Service Broker,因为已存在启用的具有相同 ID 的 Service Broker。
- Centos7.2下针对LDAP的完整部署记录
- .NET Core 已经实现了PHP JIT,现在PHP是.NET上的一门开发语言
- 温故而知新:设计模式之适配器模式(Adapter)
- .NET Core RC2/RTM 明确了时间表
- kvm虚拟化关闭虚拟网卡virbr0的方法
- NET开发学习项目资源(2)
- Linux下selinux简单梳理
- 一段oracle中的“复杂”分组统计sql
- 通过Chocolatey软件包管理器安装.NET Core
- 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 数组属性和方法
- vscode .vue文件格式配置 使其与webstorm设置一致
- Go 语言学习之 slice
- koa2实现微信公众号关注自动回复消息
- 两个字数字字符串求和
- 设计模式(二):Android 源码中的工厂模式
- MoveIt!之ROS1Melodic版本发布(MoveItCpp教程)
- 机器学习第1天:线性回归(代码篇)
- PHP二分查找
- OnClick 的另一种书写
- JVM系列之:JIT中的Virtual Call
- 速读原著-UnixLinux基础(五)
- Celery在Django中的简单应用
- 基于数据库Binlog 的业务系统操作日志实现方案(阿里中间件Canal)
- 速读原著-UnixLinux基础(三)
- 手撸实现UDP和TCP通信