此次來分析某個小說網站。
aHR0cHM6Ly9nLmhvbmdzaHUuY29tL2NvbnRlbnQvOTM0MTYvMTM4Nzc5MTIuaHRtbA==node
先來看看頁面的請求【圖1-1】數組
圖1-1
通過查看請求,並無請求的加密參數,可是響應的內容卻不正常,許多文字在響應中都變成了 span 標籤【圖1-2】瀏覽器
圖1-2
這樣的反爬蟲措施,如何分析?網絡
既然這裏替換的內容都是 span 那就從它開始入手吧。
能夠看到應該顯示在正文的內容顯示在 CSS 的 content 中【圖2-1】。app
圖2-1
這個是什麼操做?容我百度一下。async
CSS中,::before 建立一個僞元素,其將成爲匹配選中的元素的第一個子元素。常經過 content 屬性來爲一個元素添加修飾性的內容。此元素默認爲行內元素。
這裏附帶一個語法示例【圖2-2】,加深理解:ide
圖2-2
如今經過上面的實例描述,咱們大體清楚原來它是一種 CSS 的隱式寫法。
通常 CSS 樣式咱們能夠經過點擊右上角的連接跳轉到相應的文件位置,可是這裏是沒法跳轉的【圖2-3】學習
圖2-3
咱們照着以前的思路,搜索一波看看能不能找到一些蛛絲馬跡。
先試試搜索類名【圖2-4】,找到的是請求頁面的響應內容,並無找到有用的信息。
網站
圖2-4
繼續搜索::before,此次找到的一樣是請求頁面的響應內容可是::before在文件的位置值得咱們打開看看。【圖2-5】加密
圖2-5
點開文件再次搜索,在這裏就定位到了疑似加密的地方【圖2-6】,對!只是疑似加密。
圖2-6
你不能由於代碼長得醜、難理解就懷疑它是加密。
其實這裏也能夠全局搜索.context_kw能夠找到操做 DOM 的代碼,能夠找到操做 DOM 的加密位置,搜索方法大同小異。
這裏就不細說了,咱們只要找到加密邏輯的總體位置就行,不妨礙咱們分析。
ps : 怕本身找錯能夠多試幾回,相關文件都打開看看。
既然找到一個疑似加密的位置,咱們確定是要分析一波看看是否是咱們要找的。
經過大概的梳理,能夠看到整個 JS 分爲兩個部分,第一部分 JS 是CryptoJS的加解密的內容,第二部分是通過混淆的內容,根據部分 JS 能夠猜想第二部分的 JS 操做了 DOM ,完成了 CSS 相關的解密。【圖3-1】
關於第一部分的CryptoJS沒啥好改的,照着用就行了。
第二部分值得研究一下,由於是混淆過的內容,照着還原回原來的代碼意義不大且費時費力,須要作的就是不停調試你看不明白的代碼,爭取能明白這個代碼的意思,能理解的代碼越多,去改寫越簡單。
圖3-1
簡單說下代碼的邏輯:
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'];
解密後的值放入到secWords中,對secWords中的值遍歷並作了一堆騷操做,將處理事後的值放入到words當中,注意這裏words就已是文字了。
這個 JS 不是很難,從網頁複製的 JS 加上兩個打印直接就可使用,可是在 node 中直接運行發現輸出的字符和實際頁面展示的並不相同。
正確的字符是這樣的【圖3-2】
圖3-2
在 node 中運行輸出的結果是這樣的【圖3-3】
圖3-3
很明顯 node 環境下輸出的結果不是咱們要的,並且字符數也少了兩個,同一份代碼環境不一樣,能夠大體猜到多是代碼裏作了一些對環境屬性的判斷。
這個時候理解代碼的好處就來了,能夠很快定位到下面這行代碼【圖3-4】:
圖3-4
這裏檢測的是當前的 URL ,在瀏覽器中這個判斷條件是不成立的【圖3-5】,因此不執行判斷中代碼。
圖3-5
到了 node 環境下是沒有瀏覽器的window屬性的,因此執行這句會出現異常,執行的是異常處理中的代碼,因此咱們直接把這段if代碼註釋掉。
繼續向下,找找還有沒有相關的代碼,只要是判斷瀏覽器相關屬性的都須要注意一下。
很快看到【圖3-6】這一行的代碼也進行了相關的判斷。
圖3-6
在瀏覽器環境下代碼的結果是這樣的【圖3-7】
圖3-7
可是在 node 環境下是這樣的,計算結果也相應的出現了錯誤【圖3-8】
圖3-8
因此這裏須要作相應的修改,讓結果可以計算正確。
例如:
_0x1532b6[_0xea12('0x26')](_0x490c80, 0x3 * +!('object' === _0xea12('0x27')))
這樣 node 環境下的計算結果就正常了。
將通過處理後的 JS 運用到 Python 爬蟲中,就能夠看到正確的內容了【圖3-9】
圖3-9
這個網站的加密不是很難,不過加密的方法很典型,前段時間有很多讀者朋友在羣裏討論研究,很是值得學習一下。
不過既然是小說網站,這裏也涉及到相關的版權問題,因此但願你們不要搞事,以學習的態度和目的閱讀本文。
Peace~
鹹魚從初一就開始看網絡小說了,能夠算是個老書蟲,當時用攢了好幾個月的生活費買了部 MP4 ,拜託家裏有電腦的同窗幫忙下載小說,就這樣開始了個人追更之旅。當我看小說的設備不斷更新直到今天的智能手機,那些年躲在被窩裏看小說的日子留下的只剩下那些年追更的回憶,還有殘存很少的小說.txt文件。謹以此文,記念過去追更的日子。EOF