網站建設,網頁設計,網站優化,廣州網絡公司

廣州 | 深圳 | 東莞 | 繁體版 | 搜聯宣傳冊 | 服務熱線︰(020) 87560378
SEO技術論壇

站內搜索︰
網站優化服務介紹
Google優化
google與microsoft
Google推廣-Google排...
Google排名中的補充材...
工具條能幫助網頁被Go...
怎樣進行Google優化
更多>>>
Yahoo優化
雅虎完成搜索引擎擴充...
YAHOO開始采用自有YST...
Yahoo與Google搜索能...
國外英文目錄索引---Y...
Yahoo!英文的基本收錄...
更多>>>
百度優化
百度研究︰如何使你的...
突破百度貼吧的驗證碼...
“百度與站長”更新︰...
剖析百度,優化百度〞...
網站針對baidu如何優...
更多>>>
優化案例
廣州三九禮品有限公司
廣州東奧電器有限公司
廣州市黃埔區譽本機械...
廣州旭海現代辦公設備...
豐美萊豐胸
更多>>>
突破百度貼吧的驗證碼限制
 
發表時間︰2007-03-26 09:11:55 瀏覽人數︰65

百度,作為國內搜索引擎的大戶,為了進一步擴大自己的用戶群,專門開設了“百度貼吧”(2003年11月百度貼吧 (http://post.baidu.com)自從誕生以來逐漸成為世界最大的中文交流平台!當用戶在百度搜索引擎中搜索出需要搜索的關鍵字,點擊“貼吧”即可進入以關鍵字為專題的相應貼吧)的服務。操作簡單而又針對性,這是貼吧火極一時的重要原因,可正因為如此,百度貼吧的安全性又怎麼樣呢?這就是我們今天探討的話題!
    相信大家都有在論壇灌水的經歷吧?但是如果你連續發表統一內容的東西在論壇中,不久論壇的整個板塊就全是你發表的信息了,其他信息全被擠在了後面。假設你發表的信息夠多,版主都刪不完時,那麼這個論壇基本就報廢了!其他的商業論壇也意識到了防止惡意灌水的重要性,紛紛使用了一些防止惡意灌水的措施,有發貼間隔時間的限制、同一IP地址的發貼數限制、內容不能重復等,但是這些都不是今天的重點,由于百度使用的是一個公用發貼表單,允許匿名發帖,需要突破唯一的難點是驗證碼。(為了防止某個黑客對某一個特定注冊用戶用特定程序暴力破解方式進行不斷的登陸嘗試或是防止不斷提交某網絡信息而采用的一種網絡通行方式。隨機生成字符信息放入圖片中,防止計算機直接識別。比如招商銀行的網上個人銀行,騰訊的QQ社區等等)

    這時驗證碼在整個系統中就扮演了了一個至關重要的角色。如果我們能突破它,寫一個自動發布的程序,那麼我們來算一算︰假設每兩秒程序post一次,一分鐘就是30次、 一小時就有30×60=1800次、 一天就有1800×24=43200次!如果我們把發貼程序或是密碼窮舉程序掛在很多肉雞上,進行同時工作,那麼結果可想而知!筆者曾親目睹過國內某著名安全論壇就是驗證碼被人破解,導致被人惡意灌水,最後完全崩潰!當然還有某網絡銀行也因此類原因導致用戶密碼被盜等眾多事件。筆者也作如下聲明︰下文介紹的方法並不是有意針某公司或是某機構,只是作為技術交流,如果部分讀者利用本文介紹的方法進行破壞或是窮舉他人密碼,這已經違法了法律,那麼責任由他自己承擔,與筆者無關!

    好了,我們可以進入正題了(以下出現的代碼為delphi寫的部分源碼,為了防止任意利用,我以介紹方法為主,如果讀者感興趣,可以自己組合編寫完整,在本文附帶的程序中,筆者提供了一個驗證碼參數確定程序(附源碼))。驗證碼分為如下幾類︰數字型、字符型、符號型、綜合型。

    我們看了看百度貼吧的驗證碼如圖︰ 是屬于數字型的!不過其圖片中生成了不少彩色和黑白的噪音點(指驗證圖片上的斑點)。那麼我們應該怎麼去識別呢?傳統的驗證碼識別方式很簡單,由于數字的位置是固定的,所以我們只需要提取每一幅數字的圖片(沒有噪音點的)然後把每一個特殊數字獨有的象素位置記錄下來,然後在網絡上提取需要破解的特征碼,祛除噪音點,對其位置和記錄位置進行比對,那就是麼就能確定相應的數字了。

總結一下傳統的就是︰
 
1.先分析驗證碼,前景顏色是否不定
2.然後把驗證碼的寬度/驗證碼文字個數,比如一驗證碼下載後寬度為60,有4個數字,那麼就60/4=15,然後保存每個字,如果只有數字保存0-9數字到位圖文件,如果英文那更麻煩點,0-9,A-Z都要保存到位圖,位圖的前景色都不變,保持一種顏色,背景隨便你改不改
3.如果前景要變則將文字統一為同種顏色,每個數字0-9的點陣都有個公共點,取該公共點顏色然後把前景全部統一成一種顏色,比如白色{255,255,255},位圖的結構是BGR,而不是RGB
4.然後進行比較,如果驗證碼的一點為白色,第2步保存的位圖同一點也是白色,那麼頻率增加1
5.最後頻率最高的就是驗證碼了!
可是這種傳統的識別方法卻遇到了挑戰!如果圖片數字的位置也是隨機出現,大小也是隨機出現,那麼這種識別方法也就失效了,百度貼吧的就是這樣的驗證碼。
筆者這里向大家引入一個專有名詞︰“hough變換”也許學習計算機圖像學的朋友知道,筆者還是簡要介紹一下︰
直線hough變換︰直線Hough變換利用圖像空間和Hough參數空間的點-線對偶性,把圖像空間中的檢測問題轉換到參數空間。通過在參數空間里進行簡單的累加統計,然後在Hough參數空間尋找累加器峰值的方法檢測直線。例如,圖1(a)中的九條線段對應于如圖1(b)所示的其Hough參數空間的九個累加器峰值。圖1(b)中,Hough參數空間的橫縱坐標分別為直線極坐標方程:ρ=x×cos(θ) + y×sin(θ) 的兩個參數ρ和θ。九個峰值的ρ和θ值唯一的確定其對應線段所在直線的兩個參數。並且線段的長度決定坐標(ρ,θ)處的累加值的大小。
1(a) 
1(b)
沒有明白的讀者可以多讀兩遍(數學啊數學!),還是比較好理解。

其實講通俗一點,就是我們只要利用這個方程ρ=x×cos(θ) + y×sin(θ)統計出ρ出現的次數,就可以確定一條直線,比如說圖片中我們計算出了某個方向(θ的大小)的ρ出現次數的最大值,那麼這就是這個方向最長的直線了!
好了,知道了hough變換檢測直線的原理,那麼我們就來寫段代碼
var
p: PByteArray;
Gray, x, y,i1,i2: Integer;
Bmp: TBitmap;
begin
listbox1.Clear;
listbox2.Clear;
Bmp := TBitmap.Create;
Bmp.Assign(Image2.Picture.Bitmap);
//設置為24位真彩色
Bmp.PixelFormat := pf24Bit;
randomize;
for y := 0 to Bmp.Height - 1 do
begin
p := Bmp.scanline[y];
for x := 0 to Bmp.Width - 1 do
begin
//一個象素點三個字節
Gray := Round(p[x * 3 + 2] * 0.3 + p[x * 3 + 1] * 0.59 + p[x
* 3] * 0.11);
if gray > 128 then //全局閥值128
begin
end
else
begin
i1:=x;//表示檢測的θ為0度
i2:=y; //表示檢測的θ為90度
ListBox1.Items.Add(inttostr(i1));//用于日後算出現的次數,當然也可以用數組!
ListBox2.Items.Add(inttostr(i2));
end;
end;
end;
Image2.Picture.Bitmap.Assign(Bmp);
Bmp.Free;
這段代碼的意思就是檢測圖片0度和90度的直線。

現在我們就說說具體操作了。先得到一幅驗證碼圖片,這個得到的方法有很多,我建議用屏幕指定位置抓圖來實現,然後保存成BMP格式,進行圖像的二值化處理。二值化處理就是把圖片轉換成兩種顏色,不過需要設置一個適當的閥值(由于24位圖的一個點是由RGB3個顏色分量來控制,那麼我們得到這3個分量的值後除以3就是閥值了),這樣才能起到祛除部分噪音的效果。我們假設閥值為128 現在我們看看這段代碼
var
p: PByteArray;
Gray, x, y: Integer;
Bmp: TBitmap;
begin
Bmp := TBitmap.Create;
Bmp.Assign(Image1.Picture.Bitmap);
//設置為24位真彩色
Bmp.PixelFormat := pf24Bit;
randomize;
for y := 0 to Bmp.Height - 1 do
begin
p := Bmp.scanline[y];
for x := 0 to Bmp.Width - 1 do
begin
//一個象素點三個字節
Gray := Round(p[x * 3 + 2] * 0.3 + p[x * 3 + 1] * 0.59 + p[x
* 3] * 0.11);
if gray > 128 then //全局閥值128
begin
p[x * 3] := 255;
p[x * 3 + 1] := 255;
p[x * 3 + 2] := 255;
end
else
begin
p[x * 3] := 0;
p[x * 3 + 1] := 0;
p[x * 3 + 2] := 0;
end;
end;
end;
Image2.Picture.Bitmap.Assign(Bmp);
Bmp.Free;
這樣我們就得到了一幅二值化的BMP。

得到這副圖後,我們需要對圖像進行分割,就是把它變成4個小位圖,分別裝入4個數字。分割算法很簡單,因為驗證碼的數字位置左右跳動幅度不大,源代碼就不再給出。

然後我們要做的就是把這副圖進行幾個方向的hough變換檢測,由控制θ的角度來實現,比如說這個 這是數字3 我們可以看到它有什麼特征沒有?它橫著由三橫組成,豎著由2豎組成!我們就規定 如果橫著有3條直線,豎著有兩條直線,那麼這個數就是3了!所以我們只要用hough算子檢測 0 & 90 度就能確定橫豎有多少直線了,再看這個 這是數字1 我們就規定豎有一條最長的直線,然而橫的直線如果不超過豎直線長的1/2那麼就是1了。其他數以此類推!

當然實際操作當然沒有這麼簡單,因為還是有部分噪音點沒有祛除干淨,但是這的確說明了我們的思想!所以每個數有需要準備幾套特征編碼,如果出現多個數,就看使用編碼數最多的數就是我們要識別的數了。最後就是統計了,統計函數我們現在給出
 
function Repeatcount(s:string;d:string):integer;
var i:integer;
begin
i:=0;
while pos(d,s)>0 do
begin
i:=i+1;
delete(s,pos(d,s),length(d));
end;
result:=i;
end;
利用這個函數,我們就可以確定出現最多的p的次數以及使用編碼最多的次數了!筆者隨文附送了一個檢測0度和90度的檢測器,讀者可以多試幾次就明白了!(如圖)

當然只有這兩度檢測是遠遠不夠的,實際應用中,可以使用0~90度中任意一度檢測,比如說7,它的豎由于不是90度的(直的)所以要用其他的度數來檢測! 這里也總結一下,任意數字,只要我們能得到相應的特征,那麼我們就可以對它進行識別!

總結一下創新的︰
1、 獲得圖片,進行二值化的變換、祛除噪音。
2、 分割圖像,保存成相應的BMP文件。
3、 對其進行幾個方向的HOUGH變換檢測,根據相應的驗證碼來定!
(你也可以做更多的檢測,比如有英文字母就需用到其他算法了!)
4、 對特征進行統計,得出識別結果。

接下來要做的就是做個post程序了,這個太簡單了,代碼你就自己寫吧!不過也要做到如下細節:做成多線程程序進行發貼,不然程序會失去響應的。最好是可以導入大量的代理IP的,然後就是發貼的內容最後加上幾個隨機字符,這樣可以防止重復貼的過濾!最重要的,只是做測試,發貼量不要太多、不要亂發廣告貼!

所以說再安全的驗證碼也有軟肋,我們只要發現就可以找出其中的漏洞!當然不只是針對百度,其他論壇的特征碼同樣能識別!當然網絡安全技術也是雙刃劍,我這里再次強調!這種方法的確能識別很多重要的部門的一些關鍵驗證碼,但是讀者如果使用其方法進行破壞,那已經違反了中華人民共和國的相關法律,是要付刑事責任的!並且與筆者無關!

其實上述方法已經不是只是對驗證碼進行識別了,完全可以用到現實生活中去,比如說手寫體識別、車牌識別等等,但是現實生活中我們還要進行更多的加工,比如說圓形檢測,多邊形檢測等等。所以說從網絡安全技術中,也有很多東西能造福社會,還等待我們繼續創造!

 
合作伙伴
東莞網絡公司 天河網絡公司 廣州網絡公司 深圳網站優化
花都網絡公司 番禺網絡公司 廣州網頁設計 廣州網站優化 廣州網站建設 廣州網絡公司 深圳網絡公司