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

題記——毛主席教導我們一切帝國主義都是紙老虎

極驗驗證(http://www.geetest.com)是目前比較前沿新穎的一種驗證方式,相比傳統的字元型驗證碼更加人性化,使用者驗證的時間更短,更具互動性,同時也減少了網站的使用者流失。該網站號稱“超過200種人機行為特徵檢測,全面監控可疑機器攻擊,快到每30分鐘全網特徵動態更新,迅速應對突發情況,多達5層異構安全模型濾網
,360度保護網站安全”。博主最近在寫爬蟲時目標網站用的就是極驗驗證的驗證,順帶著就破解了一下(就是這麼霸氣,哈哈)

我們先看一下極驗驗證是什麼。極驗驗證的驗證方式是給你一幅圖,隨機扣掉一塊,讓使用者滑動滑塊把圖拼上,就能驗證通過。

如圖所示

開始時會給你一張原始圖片

當滑鼠點住滑塊時,會出現拼圖

\

使用者把滑塊拖到拼圖缺失位置時,驗證就會通過(圖配錯了,不過沒關係,意思大家都懂 ^_^ )

第一步:模擬瀏覽器

這裡我用的是selenium+phantomjs的組合,這兩個元件估計搞測試的童鞋們應該不會陌生吧,selenium是是一個自動化測試工具,我用它來實現滑鼠的操作,phantomjs可以理解為一個無介面瀏覽器。在寫破解程式之前,先把該寫的都寫了,該偽裝的都偽裝了,讓對面伺服器認為這就是一個普通的使用者,這一點有過爬蟲經驗的童鞋都瞭解,就不再多說了。同時selenium的滑鼠操作也不說了,直接挑乾的說,進入下一步。

第二步:找到拼圖的位置

首先先通過selenium phantomjs的截圖的功能獲得原始圖片

再將滑鼠點選住滑塊(clickandhold),等待幾秒,截圖獲得拼圖的圖片

我是通過比較畫素點的方法找到缺失位置的的,當畫素點差異過了一定範圍,這時在比較該點附近的一些點來比較,確定是不是拼圖的邊界。附近的比較點有很大的說道,網上一些人說的橫向比較(x軸)和豎向比較(y軸)考慮的都不太全面,要考慮拼圖上的凸起和凹陷的情況

為什麼不能直接通過差異來確定拼圖缺失塊邊界呢。原因是對比的兩張圖是截圖得來的,或多或少會有一些差異,保不齊就有一兩個點被程式認為是目標位置的邊界。同時也有可能對拼圖的陰影位置誤判。

第三步:滑動軌跡

前面幾步我們知道了滑塊應該滑到的位置,當我們讓程式滑動時會出現下圖的情況

如圖所示,我們將滑塊滑到了正確的位置,卻提示拼圖讓小怪物吃了,其實是被懷疑是機器人了。應該是人機特徵不通過吧。沒辦法,機器學習的問題就用機器學習的方式來辦吧。先到官網的產品體驗模組,收集了自己的滑動資料三十組(博主當時比較沒底,畢竟號稱200多種人機互動特徵,再加上比較懶,就沒收集太多),之後用資料做了個線性迴歸,沒想到竟然過了。

(鑑於不斷有人私信問迴歸怎麼做的,博主在這說一下思路。2017.2.21)

迴歸演算法的缺點大家都知道,是需要嚴格的假設的,我做這個之前先抽取幾組資料做 時間-位移的折線圖,發現速度軌跡其實是先快,接近目標點後開始慢的。之後博主取個巧把函式近似看成兩個一元一次函式的組合,分別作迴歸。至於怎麼分的函式,很簡單,對每組資料點的 速度 做一個聚類。

後記:網上有人說要用神經網路,其實沒那麼邪乎,並不是什麼都要往深度學習上靠,有時簡單經典的演算法更加實用。本文寫的不是特別詳細,一些關鍵之處都是一帶而過。因為極驗驗證是一個非常好的產品,它把使用者從無聊糟糕的字元驗證碼中解脫出來,創造一件精美的瓷器可能需要長年累月的時間,而摧毀它只在鬆手的一剎那。希望極驗驗證越辦越好。