Crossday Discuz! Board(簡稱 Discuz!)是北京康盛新創(chuàng)科技有限責任公司推出的一套通用的社區(qū)論壇軟件系統(tǒng)
官方網站:
中國內有相當數(shù)量的論壇是采用的 Discuz 的程序,一般在注冊,發(fā)帖的時候都會有圖片的驗證碼,如果我們要通過編寫程序來批量注冊論壇賬號、批量發(fā)帖那就必須得用到這個驗證碼的識別功能。
這編文章只是告訴大家一個原理,至于如何用代碼去實現(xiàn)就需要大家自已去動手了。
Gif動畫驗證碼破解
1、分析Gif動畫,得到總幀數(shù),和每幀的相關信息
2、取出延遲時間最長的那一幀
test_pro0" alt="" src="/up/2012-9/2012090511294879164.png" width="160" height="60"/>
3、用第一行的每個像素顏色來去除背景(要限制去除范圍,不然可能去掉文字)
4、使用Closing降噪、閥值處理得到比較整潔的黑白驗證碼
5、利用字符間空白分割字符
6、提取樣例特征進行機器學習
7、樣例200個的情況下,識別率可以達到>80%,如果繼續(xù)學習,識別率可以更高。
復雜背景的驗證碼破解
首先我們要去除它的背景,對于這樣稍微復雜的背景,用過去的方法很難做到,上圖的例子還不是很明顯,我發(fā)現(xiàn)很多圖片背景色和字母色近似,而且字母顏色是不斷變化的,背景也是不斷變化的
那我初始的想法是找到圖片中使用顏色最多的方法,于是我們用HSL表示各點顏色,接著進行統(tǒng)計,得到最大的幾個峰值,這里便是圖片中幾個最豐富的顏色的L值得累加值
其余的都可以認為是噪音,我們對每個峰值進行分割,得到如下圖片
你看這樣就把單個顏色圖片分割出來了,接下來就是找到圖片中除去黑色和白色后的圖片
然后進行灰化處理,閥值處理,降噪,得到
接著根據(jù)邊界檢測出來的最左側x位置,來排序字母順序
接下來的事情就輕車熟路了,把圖片轉成標準模板,通過少量學習就達到了95%以上的識別率
c:15 j:8 8:7 t:9 9:4 x:7 4:6 2:4 h:7 f:8 e:18 b:5 y:3 k:4 w:3 g:5 3:5 7:6 r:2 m:3 q:4 v:2 p:3 6:2
以上數(shù)據(jù)表示 c學習15次 j學習8次…
只要字符不粘連,大部分驗證碼干擾技術都是可以有辦法,所以為什么google驗證碼看起來很簡單,但是沒有人能夠很好的破解它得原因。
補充,
rise在留言中發(fā)現(xiàn)有一些字符加入雜點的問題,由于這種驗證碼不是很普遍,稍微做了研究
CY3E 這個圖片3字中有雜點,其他沒有,按照文章中介紹的辦法,怎么知道這個3不是像其他顏色雜點一樣的圖片呢?
我覺得需要加入一個步驟,就是對每次過濾顏色生成出來的圖片,進行填充
找到3的雜點原圖:
然后我們進行算法填充
這個圖片與其他全部是雜點的圖片之間的差別進行過濾,我考慮可以通過以下方法:
1、連貫點的寬度
2、連貫點的個數(shù)
這樣剩下的就只剩下CY3E的過濾后的圖片
至于字符傾斜的問題,我覺得完全可以在機器學習過程中,我們自己旋轉正在學習的圖片一定角度,例如從-10到+10度,只不過這樣的學習庫會大一些,但是就10個數(shù)字的驗證碼來說,這點性能損失應該可以忽略不計。