Python爬蟲進階必備 | X薯中文網加密分析

Python爬蟲進階必備 | X薯中文網加密分析

這次來分析某個小說網站。
aHR0cHM6Ly9nLmhvbmdzaHUuY29tL2NvbnRlbnQvOTM0MTYvMTM4Nzc5MTIuaHRtbA==

分析請求

先來看看頁面的請求【圖1-1】

Python爬蟲進階必備 | X薯中文網加密分析

圖1-1
經過查看請求,並沒有請求的加密參數,但是響應的內容卻不正常,許多文字在響應中都變成了 span 標籤【圖1-2】

Python爬蟲進階必備 | X薯中文網加密分析

圖1-2
這樣的反爬蟲措施,如何分析?

定位加密

既然這裏替換的內容都是 span 那就從它開始入手吧。
可以看到應該顯示在正文的內容顯示在 CSS 的 content 中【圖2-1】。

Python爬蟲進階必備 | X薯中文網加密分析

圖2-1
這個是什麼操作?容我百度一下。

CSS中,::before 創建一個僞元素,其將成爲匹配選中的元素的第一個子元素。常通過 content 屬性來爲一個元素添加修飾性的內容。此元素默認爲行內元素。

這裏附帶一個語法示例【圖2-2】,加深理解:

Python爬蟲進階必備 | X薯中文網加密分析

圖2-2
現在通過上面的實例描述,我們大致清楚原來它是一種 CSS 的隱式寫法。
一般 CSS 樣式我們可以通過點擊右上角的鏈接跳轉到相應的文件位置,但是這裏是無法跳轉的【圖2-3】

Python爬蟲進階必備 | X薯中文網加密分析

圖2-3
我們照着之前的思路,搜索一波看看能不能找到一些蛛絲馬跡。
先試試搜索類名【圖2-4】,找到的是請求頁面的響應內容,並沒有找到有用的信息。
Python爬蟲進階必備 | X薯中文網加密分析


圖2-4
繼續搜索::before,這次找到的同樣是請求頁面的響應內容但是::before在文件的位置值得我們打開看看。【圖2-5】

Python爬蟲進階必備 | X薯中文網加密分析

圖2-5
點開文件再次搜索,在這裏就定位到了疑似加密的地方【圖2-6】,對!只是疑似加密。

Python爬蟲進階必備 | X薯中文網加密分析

圖2-6
你不能因爲代碼長得醜、難理解就懷疑它是加密。
Python爬蟲進階必備 | X薯中文網加密分析

其實這裏也可以全局搜索.context_kw可以找到操作 DOM 的代碼,可以找到操作 DOM 的加密位置,搜索方法大同小異。
這裏就不細說了,我們只要找到加密邏輯的整體位置就行,不妨礙我們分析。
ps : 怕自己找錯可以多試幾次,相關文件都打開看看。

分析與改寫

既然找到一個疑似加密的位置,我們肯定是要分析一波看看是不是我們要找的。
通過大概的梳理,可以看到整個 JS 分爲兩個部分,第一部分 JS 是CryptoJS的加解密的內容,第二部分是經過混淆的內容,根據部分 JS 可以猜測第二部分的 JS 操作了 DOM ,完成了 CSS 相關的解密。【圖3-1】
關於第一部分的CryptoJS沒啥好改的,照着用就好了。
第二部分值得研究一下,因爲是混淆過的內容,照着還原回原來的代碼意義不大且費時費力,需要做的就是不停調試你看不明白的代碼,爭取能明白這個代碼的意思,能理解的代碼越多,去改寫越簡單。
Python爬蟲進階必備 | X薯中文網加密分析



圖3-1
簡單說下代碼的邏輯:

  1. 先取出 _0xa12e這個數組裏面一個加密過的元素,取出後用 AES解密
var _0xa12e = ['appendChild', 'fromCharCode', 'ifLSL', 'undefined', 'mPDrG', 'DWwdv', 'styleSheets', 'addRule', '::before', '.context_kw', '::before{content:\x20\x22', 'c***ules', 'pad', 'clamp', 'sigBytes', 'YEawH', 'yUSXm', 'PwMPi', 'pLCFG', 'ErKUI', 'OtZki', 'prototype', 'endWith', 'test', '8RHz0u9wbbrXYJjUcstWoRU1SmEIvQZQJtdHeU9/KpK/nBtFWIzLveG63e81APFLLiBBbevCCbRPdingQfzOAFPNPBw4UJCsqrDmVXFe6+LK2CSp26aUL4S+AgWjtrByjZqnYm9H3XEWW+gLx763OGfifuNUB8AgXB7/pnNTwoLjeKDrLKzomC+pXHMGYgQJegLVezvshTGgyVrDXfw4eGSVDa3c/FpDtban34QpS3I=', 'enc', 'Latin1', 'parse', 'window', 'location', 'href', '146385F634C9CB00', 'decrypt', 'ZeroPadding', 'toString', 'split', 'length', 'style', 'type', 'setAttribute', 'async', 'getElementsByTagName', 'NOyra', 'fgQCW', 'nCjZv', 'parentNode', 'insertBefore', 'head'];
  1. 解密後的值放入到secWords中,對secWords中的值遍歷並做了一堆騷操作,將處理過後的值放入到words當中,注意這裏words就已經是文字了。

  2. 最後在 JS 的最後操作 DOM 進行替換

    部分解析

    這個 JS 不是很難,從網頁複製的 JS 加上兩個打印直接就可以使用,但是在 node 中直接運行發現輸出的字符和實際頁面展現的並不相同。
    正確的字符是這樣的【圖3-2】

Python爬蟲進階必備 | X薯中文網加密分析

圖3-2
在 node 中運行輸出的結果是這樣的【圖3-3】
Python爬蟲進階必備 | X薯中文網加密分析

圖3-3
很明顯 node 環境下輸出的結果不是我們要的,而且字符數也少了兩個,同一份代碼環境不同,可以大致猜到可能是代碼裏做了一些對環境屬性的判斷。
這個時候理解代碼的好處就來了,可以很快定位到下面這行代碼【圖3-4】:

Python爬蟲進階必備 | X薯中文網加密分析

圖3-4
這裏檢測的是當前的 URL ,在瀏覽器中這個判斷條件是不成立的【圖3-5】,所以不執行判斷中代碼。
Python爬蟲進階必備 | X薯中文網加密分析

圖3-5
到了 node 環境下是沒有瀏覽器的window屬性的,所以執行這句會出現異常,執行的是異常處理中的代碼,所以我們直接把這段if代碼註釋掉。
繼續向下,找找還有沒有相關的代碼,只要是判斷瀏覽器相關屬性的都需要注意一下。
很快看到【圖3-6】這一行的代碼也進行了相關的判斷。


Python爬蟲進階必備 | X薯中文網加密分析

圖3-6
在瀏覽器環境下代碼的結果是這樣的【圖3-7】

Python爬蟲進階必備 | X薯中文網加密分析

圖3-7
但是在 node 環境下是這樣的,計算結果也相應的出現了錯誤【圖3-8】
Python爬蟲進階必備 | X薯中文網加密分析

圖3-8
所以這裏需要做相應的修改,讓結果能夠計算正確。
例如:

_0x1532b6[_0xea12('0x26')](_0x490c80, 0x3 * +!('object' === _0xea12('0x27')))

這樣 node 環境下的計算結果就正常了。
將經過處理後的 JS 運用到 Python 爬蟲中,就可以看到正確的內容了【圖3-9】

Python爬蟲進階必備 | X薯中文網加密分析

圖3-9

總結

這個網站的加密不是很難,不過加密的方法很典型,前段時間有不少讀者朋友在羣裏討論研究,非常值得學習一下。
不過既然是小說網站,這裏也涉及到相關的版權問題,所以希望大家不要搞事,以學習的態度和目的閱讀本文。
Peace~

Python爬蟲進階必備 | X薯中文網加密分析

魚說閒話

鹹魚從初一就開始看網絡小說了,可以算是個老書蟲,當時用攢了好幾個月的生活費買了部 MP4 ,拜託家裏有電腦的同學幫忙下載小說,就這樣開始了我的追更之旅。
當我看小說的設備不斷更新直到今天的智能手機,那些年躲在被窩裏看小說的日子留下的只剩下那些年追更的回憶,還有殘存不多的小說.txt文件。
謹以此文,紀念過去追更的日子。
EOF


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章