圖形驗證碼的破解

圖形驗證碼的破解
2008-03-20 21:33
從網上看到的,感覺思想不錯,拿來跟大家分享一下……

圖形驗證碼爲區分計算機和人而設,一般用來防止系統被機器濫用,如自動註冊電子郵件帳號發送垃圾郵件、自動發送廣告帖等。圖形驗證碼最先爲雅虎所採用,現在很多網站都加上了驗證碼功能。但是其中相當多的驗證碼都是不堪一擊的,尤其是那些固定字體、固定背景色、前景後景對比度高的。更有甚者,有人使用文本框裏的文字作爲驗證碼,不知道他要防的是人還是機器。

既然有了驗證碼,就會有人想着去破解。很多驗證碼的破解都相當簡單,只需要簡單的幾步就能達到目的了。具體的步驟如下:

1.獲取足夠的樣本數量,建立樣本庫,每個字符擁有數十個樣本應該是比較合適的。對於一些直接在白色背景上放置文字、固定大小、看起來和普通文字幾乎沒有差別的驗證碼,甚至可以每個字符只用一個或者幾個樣本。

2.獲取目標驗證碼圖片,將圖片和樣本庫裏的樣本逐個比較,差別最小的即可斷定爲相應的字符。

 

圖片的具體處理:

1.二值化。即將彩色圖片轉換爲黑白圖片,圖片上所有背景色都變爲黑色,文字部分則設置爲白色(反過來也一樣)。具體哪些顏色變黑,哪些變白,視具體情況而定,可以使用顏色提取工具或者photoshop之類的提取顏色進行嘗試。

2.去雜點。由於很多驗證碼都加入了雜點,二值化後的圖片難免也會有些雜點。去雜點的思想很簡單,就是對於某個點,其周圍一定範圍內相同顏色的點數少於某個值,即判爲雜點。對於已找出的雜點,可以用背景色填充消除掉。

3.提取單個字符。這裏處理的是橫向上無重疊字符的情形,所以還是相當簡單。從左到右掃描每列,記錄每個字符的左邊界和右邊界,將左右邊界之間的部分剪裁出來,再對於每個切片檢測上下邊界,再次剪裁,得到一個個小圖片。每張小圖片僅包含一個字符,圖片的邊沿即爲字符的邊沿。

 

關於使用的編程語言

理論上說,任何能夠方便處理圖像的語言都能夠作爲破解程序的編程語言,如PHP、.net, Java、C/C++都是能夠勝任的。但是驗證碼的破解需要進行很多次的循環比較,腳本語言運行效率方面的弱點就體現出來了,因此編譯性的程序更爲合適。C/C++無疑是效率最高的,但是由於其對於圖形的處理過程較爲複雜,因而不太適合快速開發。.net和Java對於圖形處理都提供了很好的支持,無論選擇哪個都是比較合適的,如果更注重效率,.net也許更適合,如果注重跨平臺性,則Java更適合。

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