郑重声明:本项目的所有代码和相关文章, 仅用于经验技术交流分享,禁止将相关技术应用到不正当途径,因为滥用技术产生的风险与本人无关。
这篇文章是公众号《云爬虫技术研究笔记》的《2019年末逆向复习系列》的第三篇:《百度指数Data加密逆向破解》
本次案例的代码都已上传到Review_Reverse上面,后面会持续更新,大家可以Fork
一波。
逆向背景
大家如果是做行业分析或者用户画像的话,会经常用到XX指数
这个东西,类似于百度指数
,微信指数
,微博指数
等等,这些指数用以反映不同关键词在过去一段时间里的“用户关注度”和“媒体关注度”,反馈面广、覆盖时间长。我们这次分析的是百度指数
,主要是因为它返回的数据是加密的,我们看看如何来分析获得破解之后的数据。
分析流程与逆向破解
我们首先打开百度指数的页面,打开开发者工具->重新选择日期,搜索->查看网络请求。
xhr顺序:index->ptbk->check
数据估计是从index这个api返回的,我们跟进这个请求查看。
uniqid
和data
参数,
uniqid
我们暂时不知道有什么意义,data
参数是加密的,我们需要获取它的解密逻辑。
1. 寻找data解密的逻辑
已知现在这个index请求是个xhr请求,我们就给这个请求下个xhr断点,如图
/api/Searchapi/index
,我们打下断点之后根据之前的逻辑,重选时间,再次请求
n.send(t.getBody())
这里,我们可以看到右侧有Call stack
调用栈列表,说明在达到这个断点之前调用了哪些函数和对象,我们顺着这个调用栈一个个往回追溯。
e.chartData
的结果很像我们刚才看到的index接口返回的数据,从代码上看,应该是首先初始化,然后对部分的数据进行加密,加密的方法是P.a.decrypt
,那么我们就对这个方法下个断点跟进去
decrypt
,里面的代码没有额外的混淆,很好理解逻辑,这个方法有两个参数,e
和t
,下面我们看看这两个参数怎么获得的
2. 加密方法decrypt参数分析
从decrypt的逻辑上看,这两个参数应该是秘钥和秘文
- e参数 和接口中返回的data加密数据类似,判定是加密数据
- token参数
没有很好的判断,我们从network的tab里面搜索一下
我们发现这个字符串出现在网络请求的某个接口中返回的数据里面 我们看看这个接口的构造,这个接口需要一个uniqid
参数 我们继续寻找这个uniqid
参数,发现这个参数是我们一开始请求的index那个接口中返回的一个字段的数据。
我们再重头理清一下思路,根据网络请求的顺序,我们大致可以理出这样一个请求的思路:
到此为止,我们分析好了整个算法的流程,下面我们重写decrypt
算法。
3. 重写decrypt算法
# Js版本
decrypt: function(t, e) {
for (var n = t.split(""), i = e.split(""), a = {}, r = [], o = 0; o < n.length / 2; o++)
a[n[o]] = n[n.length / 2 + o];
for (var s = 0; s < e.length; s++)
r.push(a[i[s]]);
return r.join("")
},
算法比较简单,我们改写成Python
版本
# python版本
def decrypt(t: str, e: str) -> str:
n, i, a, result = list(t), list(e), {}, []
ln = int(len(n)/2)
start, end = n[ln:], n[:ln]
a = dict(zip(end, start))
return ''.join([a[j] for j in e])
4. 总结思路
思路如上面的流程图所示
代码实战
有了上面这个分析流程,我们就可以开始Coding
了,以下是decrypt
解密的流程。
复习要点
从这个复习的案例我们可以总结下思路:
- 当不是参数加密而是结果加密的时候,我们可以从xhr断点入手,分析是在哪个部分加密的。
- 当解密方法中有参数没有头绪的时候,可以在
network
搜搜是不是前后文中返回的 - 我们在分析xhr请求时,可以使用一个快捷的方法取代打xhr断点,如图所示
号主介绍
多年反爬虫破解经验,AKA“逆向小学生”,沉迷数据分析和黑客增长不能自拔,虚名有CSDN博客专家和华为云享专家。
私藏资料
呕心沥血从浩瀚的资料中整理了独家的“私藏资料”,公众号内回复“私藏资料”即可领取爬虫高级逆向教学视频以及多平台的中文数据集
小学生都推荐的好文
