天天看點

極驗驗證的滑動驗證碼破解

後來研究了下覺得要破解這個驗證碼有這麼幾個問題:

無法直接通過發送url請求來實作滑鼠拖動的動作;

實際的背景圖檔是亂的,并不是我們實際肉眼看到的圖像,如下圖;

“開創行為判别算法,利用資料挖掘和機器學習,提取超過200多個行為判别特征,建立堅若磐石的多元驗證防禦體系。”這是官網的描述,聽上去就已經很高大上,查了些資料也都說拖動軌迹的識别是geetest的核心内容而無過多的表述,那麼這也應該是主要的難點了。 

後面我也就基于了以上的問題去一步一步研究如何實作模拟這一操作: 

在github中clone出最新Demo項目:

安裝GeetestSDK:

安裝Django,要注意的是最新的Django-1.10.1和目前的GeetestSDK是有相容性問題的,要用Django-1.8.14:

後面就可以直接運作了:

這裡要實作滑鼠拖動的動作靠直接發送url請求是無法實作的,需要有個真的浏覽器再去模拟滑鼠拖動的動作。根據參考的内容使用了Selenium(也有python版本的)可以實作這一操作。

上面的移動位置我寫了一個固定的值,實際情況這個值是不固定的,需要根據背景圖檔的缺口來算出這個偏移量。然而要計算缺口的偏移量還要先還原圖檔。 

如上圖,原始的圖檔是亂的,但是我們可以在html裡面可以看到把同一個圖檔的位置進行重新組合就可以看到還原後的圖檔了: 

代碼如下:

通過python的PIL.ImageChops可以計算出兩個圖檔不同地方的位置,方法如下:

但是這在我們這裡并不适用。因為我們得到的兩個圖檔是通過拼接而成的,并且兩張原圖在背景上也還是稍有差別的,而difference方法計算得過于精确,是以這裡得到的位置并不會是我們要的缺口的位置。這裡我借用的參考内容的方法:兩張原始圖的大小都是相同的260*116,那就通過兩個for循環依次對比每個像素點的RGB值,如果相差超過50則就認為找到了缺口的位置:

如果我們直接把上面算出來的缺口位置放到前面腳本裡,你會發現即使移動的位置正确了,提示卻是“怪物吃了餅圖”,驗證不通過。很顯然,geetest識别出了這個動作并不是人的行為。這我們就需要去檢視自然人滑動滑鼠和我們代碼實作的滑動在軌迹上有什麼不同。 

geetest目前版本用戶端最核心的是geetest.5.5.36.js,我們可以把它複制出來加以改造。首先找個工具把原代碼格式化一下,然後再加入以下的内容:

index.html頁面的上直接調用的是gt.js,再由gt.js去調用geetest.5.5.36.js。我用的土辦法是自己搭建一個簡易的web server,并在host裡面把static.geetest.com域名指向到我自己的web server,然後再把頁面上要調用的static.geetest.com裡的内容都放到我自己搭建的web server上,當然geetest.5.5.36.js是要用我剛才改造過的那個。

static.geetest.com裡面隻要static目錄裡的内容即可,pictures裡面的圖檔找不到會自動指向到他們備用的網站的。我用的簡易web server是HTTP File Server,可以在下載下傳。

如此一來,我們每次滑動滑鼠包括代碼實作的滑動操作在浏覽器裡都能顯示出滑動的軌迹: 

這裡我總結了一下差别(一個{x,y,z}是一個軌迹記錄點,x代表x軸,y代表y軸,z代表累計時間毫秒): 

1.時間不宜太長又或者太短,最好能控制在1-5秒之内,另外兩個相鄰的記錄點的時間也最好能控制在50ms以内,并且間隔的時間也不宜相同; 

2.鄉鄰的x值內插補點也不宜太大,最好控制在以5内,并且內插補點也不要是一層不變的; 

3.geetest雖然是橫向拖動的,不會涉及到縱向移動,是以這部分很容易是被忽略的:y軸的值要控制在[-5,5]範圍内,不能過大。而且上下抖動的頻率不能高,要平緩一點。我試下來最好的辦法就是平穩固定的0上,也不要上下抖動了。

完整代碼如下:

運作結果:

1.最為重要的就是代碼注釋裡說的y軸的高度問題,我試了PhantomJS,Chrome和Firefox三個浏覽器,每一種渲染出來的高度都是不一樣的,一定要保證最終的結果是拖動球高度的一半(一般都是22); 

2.版權相容性(以下是我驗證過可行的): 

selenium (2.53.6)===>PhantomJS 2.1 

selenium (2.53.6)===>Chrome 52 

selenium (2.53.6)===>Firefox 45(注意不要用48,有相容問題) 

3.webdriver的cookie問題: 

有的時候我們需要帶入cookie進行驗證,那就有了cookie的問題了。Chrome和Firefox都可以通過webdriver.add_cookie來實作,但是經我試下來這個方法和PhantomJS有相容性問題,我是這樣解決的:

再如此調用就可以解決cookie的相容性問題了:

4.PhantomJS浏覽器解析出來的圖檔url是不帶引号的,而Firefox和Chrome解析出來的是帶引号的,這裡正則過濾的時候要注意一下的。 

我最終使用的是selenium+Firefox。我實際運作的環境是centos,PhantomJS确實是個不錯的選擇,直接在shell裡運作就可以了,不需要配置圖形界面。但是使用下來破解的成功率不高,因為沒有界面,也看不出運作的情況。Chrome在centos6.5裡面沒有現成的安裝包,安裝使用比較複雜。最終也就隻有Firefox了。

centos配置firefox方法如下:

注意不要純shell環境下運作,要在圖形界面的運作。運作init 5可以從字元界面切換到圖形界面。

本文轉自 yntmdr 51CTO部落格,原文連結:http://blog.51cto.com/yntmdr/1905966,如需轉載請自行聯系原作者