主要內容是覆盤知乎搜尋頁的js逆向的具體流程。
第一步 找到傳遞資料的連結操作:進入知乎搜尋頁,搜尋”書籍“,按F12調出開發者工具。
下圖可以看到,這個連結傳遞了我們需要的資料:
可以從請求的URL看到,知乎請求資料是用GET的方式,請求連結格式如下:
https://www.zhihu.com/api/v4/search_v3?t=general&q=xxx
不過直接GET是拿不到資料的,因此需要進行JS逆向查詢資料。
CSDN這篇博文中主要說了,透過API抓取知乎搜尋頁內容,需要在請求頭加入正確的x-zse-86才能拿到資料。
x-zse-86是經過js加密而來,x-zst-81是用於翻頁的,同一個請求是相同的,請求加不加這個引數都可以。
第三步 解密x-zse-86前面說了,x-zse-86是由js加密得到的,因此我們現在得到知乎網站的js資料夾中找一下。
看看x-zse-86是在哪一個js檔案中生成的。
注意:最下面的可以對js檔案進行規範化顯示,方便閱覽。
可以看到,x-zse-86主要是根據p這個自變數進行變化的,而 p = f.signature。
因此我們找到f函式的話就可以。
據原博文作者分析,f是由x-zse-83 + 資料包的url去掉https://www.zhihu.com後 + referer+cookie中的d_c0的值所得。(都是我們可以直接拿到的資料)
因此現在只需要搞清楚傳遞進去的引數是怎麼解密的。
第四步 找到解密函式從下面的函式可以看到,f經過了
H()跟W()
兩個函式的傳遞。其中H()只是進行了簡單的md5加密,用python是可以直接完成的,因此我們只需要找
W()(H()(f))
呼叫的就是下面這個函式:
接下來我們就需要將這個函式有關的js程式碼複製,放入g_encrypt.js檔案。
第五步 找到js程式碼在函式所在行打上斷點,注意得選擇第二個小方塊,而不是return前面這一個方塊。
其他步驟g_encrypt.js檔案,加上如下處理:
const jsdom = require("jsdom");
const { JSDOM } = jsdom;
const dom = new JSDOM(`<!DOCTYPE html><p>Hello world</p>`);
window = dom.window;
document = window.document;
XMLHttpRequest = window.XMLHttpRequest;