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參數逆向分析

相關文章
相關標籤/搜索