© conmajia 2012
本次目标是 www.iboling.com 的 flash 验证码 。 (2014 更新: 这个网站已经挂了。 )
这个网站很新颖 ,用的是 flash 动画 ,随机给出大小球 ,然后让用户用鼠标点击相应的球 ,实现验证码输入 。像这样

本来这是个很不错的思路 ,跳出了 「干扰线」 「扭曲字」 等验证码的思维定势 。但方式新颖并不代表能高枕无忧 。
因为复杂度不够 ,所以反而容易破解 。
有几个缺点:
1. 颜色单一 (很好识别)
2. 下方候选球滚动缓慢 (足够程序识别完再点击)
3. 鼠标悬停 (哪怕机器慢 ,只要控制鼠标悬停 ,就可以让候选球停止滚动)
4. 不能加快速度或取消悬停 (因为这样 「人」 就没法选了)
破解思路:
1. 找到网页中验证码位置和大小 (很容易)
2. 截图采样 (验证码图片和候选球图片)
3. 分别从图像中提取全部色块及其对应的 Rectangle (大约 25x25) ,存入 big 和 small
4. 遍历对比候选球和验证码 ,颜色近似则可认为匹配
5. 根据候选球的 Rectangle ,加上第 2 步里截图的 offset ,计算候选球在屏幕上的绝对位置
6. 编程或用按键精灵在候选球上 click 一下
7. 每次处理一个球 ,然后等等 ,给 flash 一个反应时间 。
下面是破解样本 (数字不准 ,因为有废弃识别被程序过滤掉了)




关于速度
速度的问题大家会很关心 ,但我可以说速度不是问题 。
首先 ,因为候选区是鼠标悬停的 。所以哪怕我机器再烂再慢 ,我可以先悬停 ,让它停止滚动 ,然后再慢慢 「一百遍一百遍」 。
其次 ,就算一直滚动 ,但因为要让人点击 ,所以不可能滚动太快 。在我的 i3 机器上 ,没有优化的识别速度大约 10fps ,优化过后识别率提升到 40~50fps ,远远超过人的反应速度 。也就说这个验证码只要人能点 ,机器就可以点 。
改进意见
1. 使用带图案 ,带纹理的小球
2. 随机改变小球形状
3. 验证码和候选球不需要完全一样 ,只需要人能看懂 「相似」 就行 (比如验证码是数字 「贰」 ,候选球是阿拉伯 「2」 ) ,这样机器基本不太可能识别
4. 增加背景复杂度 ,比如图片背景
暂时想到这么多 ,欢迎各位朋友一起探讨 。
© Conmajia 2012
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?