漲姿勢(shì)!資深工程師手把手教你用Python快速破解驗(yàn)證碼

在我看來(lái),基本上可以不負(fù)責(zé)任地認(rèn)為,Python 可以做任何事情。無(wú)論是從入門級(jí)選手到專業(yè)級(jí)選手都在做的爬蟲,還是 Web 程序開(kāi)發(fā)、桌面程序開(kāi)發(fā)還是科學(xué)計(jì)算、圖像處理,Python 都可以勝任?;蛟S是因?yàn)檫@種萬(wàn)能屬性,周圍好更多的小伙伴都開(kāi)始學(xué)習(xí) Python。

那Python 現(xiàn)在到底有多熱呢?

微軟在上個(gè)月開(kāi)啟了一個(gè)針對(duì) Excel 功能的話題,用以收集用戶的反饋。隨后有用戶提議讓 Python 成為 Excel 的一種腳本語(yǔ)言,不僅可以作為 VBA 的替代品,而且也可以作為字段函數(shù)(= SUM(A1:A2))的替代方案。該提議得到了眾多用戶的支持,得票支持率高于排名第二的提議的兩倍。現(xiàn)在,Python 的這把火已經(jīng)燒到了程序員的圈子外。根據(jù)國(guó)務(wù)院《新一代人工智能發(fā)展規(guī)劃的通知》,可以想見(jiàn)人工智能教育往低幼滲透的例子只會(huì)越來(lái)越多。小學(xué)生學(xué) Python 是培養(yǎng)編程興趣和思維,為了你自己的百萬(wàn)年薪和發(fā)展前景,或許你才是最該學(xué) Python 的人。

在這里我還是要推薦下我自己建的web前端開(kāi)發(fā)學(xué)習(xí)群:731669587,群里都是學(xué)web前端開(kāi)發(fā)的,如果你正在學(xué)習(xí)前端 ,小編歡迎你加入,今天分享的這個(gè)案例已經(jīng)上傳到群文件,大家都是軟件開(kāi)發(fā)黨,不定期分享干貨(只有前端軟件開(kāi)發(fā)相關(guān)的),包括我自己整理的一份2018最新的前端進(jìn)階資料和高級(jí)開(kāi)發(fā)教程,歡迎進(jìn)階中和進(jìn)想深入前端的小伙伴。

今天讓我們突破這個(gè)世界上最流行的WordPress驗(yàn)證代碼插件。

阿德里安沒(méi)有訪問(wèn)生成驗(yàn)證代碼圖片的應(yīng)用程序的源代碼。為了破解這個(gè)系統(tǒng),他必須下載數(shù)百個(gè)示例圖像并手動(dòng)回答它們,以訓(xùn)練他的深度學(xué)習(xí)系統(tǒng)。

最好的是,它是開(kāi)源的!因?yàn)槲覀冇猩沈?yàn)證代碼的源代碼,所以它很容易破解。為了讓事情更有挑戰(zhàn)性,讓我們給自己一個(gè)時(shí)間限制。我們能在15分鐘內(nèi)破解這個(gè)驗(yàn)證系統(tǒng)嗎?讓我們?cè)囋嚳矗?/p>

挑戰(zhàn)的開(kāi)始

要?jiǎng)?chuàng)建攻擊計(jì)劃,讓我們看看插件將生成什么類型的圖片。在演示站點(diǎn)上,我們看到了:

好了,驗(yàn)證圖像看起來(lái)是四個(gè)字母。讓我們?cè)赑HP源代碼中驗(yàn)證這一點(diǎn):

是的,它生成四個(gè)字母驗(yàn)證碼,并使用四種不同的隨機(jī)組合字體。如我們所見(jiàn),它從不在代碼中使用“o”或“I”,以避免用戶混淆。這給了我們總共32個(gè)字母和數(shù)字,我們可能需要識(shí)別它們。沒(méi)問(wèn)題!

我們的工具集

在進(jìn)一步討論之前,讓我們討論一下我們將要用來(lái)解決這個(gè)問(wèn)題的工具。

創(chuàng)建數(shù)據(jù)集

為了訓(xùn)練任何機(jī)器學(xué)習(xí)系統(tǒng),我們都需要訓(xùn)練數(shù)據(jù)集。解碼驗(yàn)證系統(tǒng),我們需要訓(xùn)練數(shù)據(jù)如下所示。

因?yàn)槲覀冇蠾ordPress驗(yàn)證代碼插件的源代碼,所以我們可以對(duì)它做一些修改,這樣就可以保存10000個(gè)驗(yàn)證碼和每個(gè)映像的正確答案。

這是我不會(huì)給你的代碼中唯一的一部分。我們這樣做是為了教育,我不希望你真的去黑WordPress網(wǎng)站。不過(guò),我會(huì)給你我的最后10000個(gè)圖像,以便你可以重復(fù)我的結(jié)果。

簡(jiǎn)化

現(xiàn)在我們有了訓(xùn)練數(shù)據(jù),我們可以直接用它來(lái)訓(xùn)練神經(jīng)網(wǎng)絡(luò)。

有了足夠的訓(xùn)練數(shù)據(jù),這種方法粗略,甚至可行,但我們可以使它更容易解決問(wèn)題。問(wèn)題越簡(jiǎn)單,訓(xùn)練數(shù)據(jù)越少,計(jì)算資源消耗越少。畢竟,我們只有15分鐘!

我沒(méi)有時(shí)間去瀏覽10000個(gè)訓(xùn)練圖像和手動(dòng)分為單獨(dú)的圖像在PS圖象處理軟件。需要幾天時(shí)間,我只剩下10分鐘了。

每個(gè)圖像中的字母都是隨機(jī)放置的,這使得分割圖像更加困難。

幸運(yùn)的是,我們?nèi)匀豢梢宰詣?dòng)執(zhí)行此操作。在圖像處理中,我們經(jīng)常需要檢測(cè)具有相同顏色的像素。這些連續(xù)像素周圍的邊界稱為等高線。OpenCV有一個(gè)內(nèi)置的findcontours()函數(shù),可以用來(lái)檢測(cè)這些連續(xù)的區(qū)域。

然后,我們將圖像轉(zhuǎn)換為純黑白(這稱為閾值設(shè)置),這樣就很容易找到一個(gè)連續(xù)的區(qū)域:

接下來(lái),我們將使用findcontours OpenCV()檢測(cè)每個(gè)連續(xù)的簇包含圖像中相同顏色的像素功能。

然后只需要將每個(gè)區(qū)域保存為單獨(dú)的映像文件。因?yàn)槲覀冎烂總€(gè)圖像應(yīng)該包含四個(gè)字母,從左到右,我們可以用這些知識(shí)來(lái)標(biāo)記字母。只要我們按順序保存它們,就可以用正確的字母名稱保存每個(gè)字母圖像。

這意味著我們最終會(huì)找到兩個(gè)字母拼在一起的區(qū)域:

如果我們不處理這個(gè)問(wèn)題,我們最終會(huì)造成糟糕的培訓(xùn)數(shù)據(jù)。我們需要解決這個(gè)問(wèn)題,這樣我們就不會(huì)小心讓機(jī)器把這兩個(gè)字母看成一個(gè)字母。

我們將把比高度高的任何區(qū)域的寬度分開(kāi),并將其用作兩個(gè)字母。這是非常粗糙的,但這種處理仍然是可行的,以確定驗(yàn)證碼。

現(xiàn)在我們有一個(gè)方法來(lái)提取的一封信,讓我們對(duì)所有的驗(yàn)證碼圖像運(yùn)行它。我們的目標(biāo)是收集每個(gè)字母的不同變化。我們可以把每個(gè)字母保存在自己的文件夾里。

從我們的10000個(gè)驗(yàn)證圖像中提取的一些“W”字母。我總共得到了1147張不同的“W”圖像。

神經(jīng)網(wǎng)絡(luò)的創(chuàng)建與訓(xùn)練

由于我們只需要識(shí)別一個(gè)字母和一些圖像,所以我們不需要一個(gè)非常復(fù)雜的神經(jīng)網(wǎng)絡(luò)體系結(jié)構(gòu)。識(shí)別字母比識(shí)別復(fù)雜的圖像更容易,比如貓和狗的照片。

如果你想知道更多關(guān)于卷積神經(jīng)網(wǎng)絡(luò)如何工作,為什么他們被用作圖像識(shí)別是理想的,看看阿德里安的書或我以前的文章。

現(xiàn)在,我們可以開(kāi)始訓(xùn)練它了!

訓(xùn)練數(shù)據(jù)集經(jīng)過(guò)10次訓(xùn)練后,達(dá)到了100%的精度?,F(xiàn)在,只要我們認(rèn)為,我們應(yīng)該能夠自動(dòng)繞過(guò)這個(gè)驗(yàn)證碼!我們做到了!

利用訓(xùn)練模型破解驗(yàn)證碼

現(xiàn)在,我們有了一個(gè)訓(xùn)練有素的神經(jīng)網(wǎng)絡(luò),用它來(lái)破解真正的驗(yàn)證代碼是非常簡(jiǎn)單的。

或者從命令行

試試!

如果你想親自嘗試,你可以在這里得到代碼。它包括10000個(gè)示例圖像和本文中每一步的所有代碼??磖eadme.md文件里面看看如何運(yùn)行它。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容