2019年末逆向复习系列之百度指数Data加密逆向破解

763 阅读5分钟

郑重声明:本项目的所有代码和相关文章, 仅用于经验技术交流分享,禁止将相关技术应用到不正当途径,因为滥用技术产生的风险与本人无关。

这篇文章是公众号《云爬虫技术研究笔记》的《2019年末逆向复习系列》的第三篇:《百度指数Data加密逆向破解》

本次案例的代码都已上传到Review_Reverse上面,后面会持续更新,大家可以Fork一波。

逆向背景

大家如果是做行业分析或者用户画像的话,会经常用到XX指数这个东西,类似于百度指数,微信指数,微博指数等等,这些指数用以反映不同关键词在过去一段时间里的“用户关注度”和“媒体关注度”,反馈面广、覆盖时间长。我们这次分析的是百度指数,主要是因为它返回的数据是加密的,我们看看如何来分析获得破解之后的数据。

分析流程与逆向破解

我们首先打开百度指数的页面,打开开发者工具->重新选择日期,搜索->查看网络请求。

我们可以看到整个网络请求的逻辑

xhr顺序:index->ptbk->check

数据估计是从index这个api返回的,我们跟进这个请求查看。

我们首先观察这个请求的结果,主要有两个地方我们需要注意,uniqiddata参数, uniqid我们暂时不知道有什么意义,data参数是加密的,我们需要获取它的解密逻辑。

1. 寻找data解密的逻辑

已知现在这个index请求是个xhr请求,我们就给这个请求下个xhr断点,如图

我们从这里,也就是initiator跟进去(PS:initiator是说明从哪个对象和这进程发起请求的)
在右侧Xhr/fetch BP下个断点,断点的值就是我们这个index请求的部分地址/api/Searchapi/index,我们打下断点之后根据之前的逻辑,重选时间,再次请求
我们可以看到断点打在 n.send(t.getBody())这里,我们可以看到右侧有Call stack调用栈列表,说明在达到这个断点之前调用了哪些函数和对象,我们顺着这个调用栈一个个往回追溯。
我们首先看到前几个调用栈的对象,如果做过前端开发的话,很容易理解是前框框架做的一些封装,针对每一个请求/响应进行处理,我们接着往下看
这个调用很明显,从这个方法的名字很容易看出,我们接着好好看看这个方法的代码逻辑
很好理解的代码逻辑,我们可以看到e.chartData的结果很像我们刚才看到的index接口返回的数据,从代码上看,应该是首先初始化,然后对部分的数据进行加密,加密的方法是P.a.decrypt,那么我们就对这个方法下个断点跟进去
断点已经下好,接着跟进去
我们可以看到decrypt,里面的代码没有额外的混淆,很好理解逻辑,这个方法有两个参数,et,下面我们看看这两个参数怎么获得的

2. 加密方法decrypt参数分析

从decrypt的逻辑上看,这两个参数应该是秘钥和秘文

  1. e参数 和接口中返回的data加密数据类似,判定是加密数据
  2. 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解密的流程。

最后我们把整个请求流程写好

复习要点

从这个复习的案例我们可以总结下思路:

  1. 当不是参数加密而是结果加密的时候,我们可以从xhr断点入手,分析是在哪个部分加密的。
  2. 当解密方法中有参数没有头绪的时候,可以在network搜搜是不是前后文中返回的
  3. 我们在分析xhr请求时,可以使用一个快捷的方法取代打xhr断点,如图所示

号主介绍

多年反爬虫破解经验,AKA“逆向小学生”,沉迷数据分析和黑客增长不能自拔,虚名有CSDN博客专家和华为云享专家。

私藏资料

呕心沥血从浩瀚的资料中整理了独家的“私藏资料”,公众号内回复“私藏资料”即可领取爬虫高级逆向教学视频以及多平台的中文数据集

小学生都推荐的好文

2019年末逆向复习系列之努比亚Cookie生成逆向分析

2019年末逆向复习系列之淘宝M站Sign参数逆向分析