最近12306订票助手之类的软件很火,搞得XX部“专家”很抓狂。搞技术的人都知道,实现一个自动订票其实并非难事,不过是几个HTTP(S)操作,提交几个表单罢了。
但是最为关键的是表单中有一项是需要人工输入的,也就是验证码,验证码使用的初衷就是为了防止机器攻击。可惜XX部设计的验证码质量太差,攻破它实在不费多大劲。
【第一版本】
最开始XX部只设计了一种验证码,用于登录页面和订票页面,下面是笔者早期提取的样本:
分析一下其弱点:
1 背景太简单,可以轻易的二值化得到良好的二值图像
2 字体单一,没有做任何变形,只是位置有些变化
我们来看一下二值化的效果,固定阈值就够了:
要破解它只需要先找到字体,然后到验证码图像上匹配,得到最佳匹配位置和对应字母即可,具体情况代码中有。
【第二版本】
后来XX部在背景上做了点文章,看上去复杂了一点:
背景上多了两条固定颜色的线,看上去情况麻烦了,其实不然,用photoshop观察一下发现其实线与字的亮度是有明显差异的,可以大致过滤掉。
当然这时候不像原来处理得那么干净了。
【第三版本】
再后来,XX部增加了一种新的字体,两种验证码交替使用,以期防御攻击。唉,拿这么多钱就知道偷懒,光换字体不升级算法是不行的。当我发现自己的自动登录失效后,只用了两小时更新字体,代码稍作修改就搞定了。
下面贴张识别效果,总体识别率 > 90%
源码下载地址:
1 CSDN :
http://download.csdn.net/detail/renyou_hust/5014935
2 Google code:
svn checkout http://hack-12306.googlecode.com/svn/trunk/