前言
這次來講個比較有趣的主題,就是該如何破解網路上那些防止機器人攻擊的圖形驗證碼,談到圖形驗證碼破解,想必各位嘴角一定微微上揚了吧 XD,看來學壞好像都比較有興趣一點,但其實知道破解的原理後,之後要做防範也比較清楚該如何處理了 ← 主因 :P。
在開始破解前先來看一下基本上的破解原理與方法,可以先參考此篇 使用PHP对网站验证码进行破解 文章,文章中提到了破解圖形驗證碼有幾個基本步驟,如下:
- 取出字模
- 二值化
- 計算特徵
- 對照樣本
Step 1 取出字模
首先取出字模就是將要破解的圖形驗證碼先抓取回來,而取得的字模圖片必須要包含所有會出現的文字,例如 0 - 9 的數字圖片,當有了字模後就能夠將字模進行二值化。
Step 2 二值化
二值化是什麼? 二值化就是將數字字模轉換成 0 與 1 的結果,將圖片上數字的部分用 1 替換而 0 則代表背景,例如我有一張數字 3 的圖片,在經過二值化後就會變成以下結果。
000000000000000000000
000000011111100000000
000001110001110000000
000000000000111000000
000000000000110000000
000000011111100000000
000000000000110000000
000000000000111000000
000001110001110000000
000000011111000000000
000000000000000000000
000000011111100000000
000001110001110000000
000000000000111000000
000000000000110000000
000000011111100000000
000000000000110000000
000000000000111000000
000001110001110000000
000000011111000000000
000000000000000000000
Step 3 計算特徵
當我們將圖片數字轉成二值化後,這些二值化的 01 代碼就變成了樣本庫,所以在計算特徵的步驟裡,就是要在產生驗證碼的頁面將驗證碼圖片取得,取得後因為驗證碼可能包含干擾元素,就必須要先去除干擾元素後將圖片二值化取得特徵。
Step 4 對照樣本
最後的步驟就是要將第三步驟二值化的值拿去比對我們的樣本庫,通常在比對的時候一定會產生誤差值,例如以下轉換後的二進值:
000000000000000000000
000000011111100000000
000011110001111000000
000000000000111000000
000000000000110000000
000000011111100000000
000000000000110000000
000000000000111000000
000001110001110000000
000000011111000010000
000000000000000000000
000000011111100000000
000011110001111000000
000000000000111000000
000000000000110000000
000000011111100000000
000000000000110000000
000000000000111000000
000001110001110000000
000000011111000010000
000000000000000000000
可以看到以上二進值紅色的 1 的部分就是所謂的噪點,因為圖片在不同的位置下所產生的圖片像素可能會不一樣,所以我們在對照樣本時可以設定一個允許容忍噪點的範圍,就是有點模糊比對的意思。
沒有留言:
張貼留言