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

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

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

本次案例的代码都已上传到Review_Reverse上面,后面会持续更新,你们能够Fork一波。 git

逆向背景

你们若是是作行业分析或者用户画像的话,会常常用到XX指数这个东西,相似于百度指数,微信指数,微博指数等等,这些指数用以反映不一样关键词在过去一段时间里的“用户关注度”和“媒体关注度”,反馈面广、覆盖时间长。咱们此次分析的是百度指数,主要是由于它返回的数据是加密的,咱们看看如何来分析得到破解以后的数据。 github

分析流程与逆向破解

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

咱们能够看到整个网络请求的逻辑

xhr顺序:index->ptbk->checkapi

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

咱们首先观察这个请求的结果,主要有两个地方咱们须要注意, 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参数逆向分析

相关文章
相关标签/搜索