# 2018-09-20更新
* 新增对腾讯滑动验证码`https://007.qq.com/online.html?ADTAG=capt.slide`的支持,本地测试通过率70左右,有待优化中,
主要失败在计算距离上,大家有好的想法欢迎提出。
* Run with [TencentCrawler.java](https://github.com/wycm/selenium-geetest-crack/blob/master/src/main/java/com/github/wycm/TencentCrawler.java)
* 腾讯滑动验证码破解的思路和极验滑动验证码略微不同,腾讯只会返回一张完整图片,导致没法通过两张图片比对的方式来计算移动距离。
所以只能通过一张图来计算距离,这里计算的方式是通过`y轴上至少找到一条长度为30px的白线`。另外此处直接通过http请求的方式来下载的原图,这么做有两个原因
1. 截图的方式会对那条关键白线的像素点有所干扰,计算的时候不太方便
2. 返回到前端的图片并没有像极验那样对图片做混淆
# 2018-09-18更新
* 更新移动轨迹算法,成功率90左右,感谢[Ouyang-Wenbin](https://github.com/Ouyang-Wenbin/ "Ouyang-Wenbin")提供的代码。
# 2018-09-08更新
* 页面改版,导致截图拿到的两张图片一样。
* 另外原有的移动轨迹算法成功率有所下降,目前本地测试成功率50%左右。
# 2018-06-12更新
* 17年8月份初次分享出来的时候还是可用的,在极验后台更新以后。成功率急剧下降。
* 再加上威锋网也更新了,之前的demo也不可用了。个人原因也一直没有更新。
* 现在是极验官网作为demo。
* 现在的破解思路和之前大致相同,不过也省了很多事。之前版本其实有点麻烦弯路,不知道selenium提供了截图的api。导致自己通过css去还原图片,比较麻烦。现在极验也是通过canvas的方式对图片做的还原,没有以前那么容易还原了。所以当前版本直接采用截图的形式。
* 另外需要注意的是selenium截图的一个坑,不确定是否由我自己环境导致的,我当前测试环境是mac pro。具体表现网页截图分辨率大小和网页原本的分辨率大小不一致,这种情况可能导致在取某个element时拿不到想要的元素。
* 最核心的依然是移动轨迹的算法,这次采用的一种看起来很简单的轨迹,就是一个像素点的移动。本地测试了10次,通过了10次,测试通过率100%。
## Quick Start
1. 修改GeetestCrawlerV2中自己环境的ChromeDriver地址。
2. Run with GeetestCrawlerV2.java
## 最后
* github地址:https://github.com/wycm/selenium-geetest-crack
* 如果觉得不错,请给个star。
## 分割线以下是原文
---
## 摘要
分析验证码素材图片混淆原理,并采用selenium模拟人拖动滑块过程,进而破解验证码。
## 人工验证的过程
1. 打开威锋网注册页面(https://passport.feng.com/?r=user/register)
2. 移动鼠标至小滑块,一张完整的图片会出现(如下图1)<br>
![image](http://upload-images.jianshu.io/upload_images/5830895-7c3640f1b35893ed.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
3. 点击鼠标左键,图片中间会出现一个缺块(如下图2)<br>
![image](http://upload-images.jianshu.io/upload_images/5830895-ffa3e67915d5a0c3.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
4. 移动小滑块正上方图案至缺块处
5. 验证通过
## selenium模拟验证的过程
1. 加载威锋网注册页面(https://passport.feng.com/?r=user/register)
2. 下载图片1和缺块图片2
3. 根据两张图片的差异计算平移的距离x
4. 模拟鼠标点击事件,点击小滑块向右移动x
5. 验证通过
## 详细分析
1. 打开chrome浏览器控制台,会发现图1所示的验证码图片并不是极验后台返回的原图。而是由多个div拼接而成(如下图3)<br>
![image](http://upload-images.jianshu.io/upload_images/5830895-dc07867df90cca3d.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
通过图片显示div的style属性可知,极验后台把图片进行切割加错位处理。把素材图片切割成10 * 58大小的52张小图,再进行错位处理。在网页上显示的时候,再通过css的background-position属性对图片进行还原。以上的图1和图2都是经过了这种处理。在这种情况下,使用selenium模拟验证是需要对下载的验证码图片进行还原。如上图3的第一个div.gt_cut_fullbg_slice标签,它的大小为10px * 58px,其中style属性为```background-image: url("http://static.geetest.com/pictures/gt/969ffa43c/969ffa43c.webp"); background-position: -157px -58px;```会把该属性对应url的图片进行一个平移操作,以左上角为参考,向左平移157px,向上平移58px,图片超出部分不会显示。所以上图1所示图片是由26 * 2个10px * 58px大小的div组成(如下图4)。每一个小方块的大小58 * 10<br>
![image](http://upload-images.jianshu.io/upload_images/5830895-4880ad3ed5b1aef4.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
2. 下载图片并还原,上一步骤分析了图片具体的混淆逻辑,具体还原图片的代码实现如下,主要逻辑是把原图裁剪为52张小图,然后拼接成一张完整的图。<br>
```
/**
*还原图片
* @param type
*/
private static void restoreImage(String type) throws IOException {
//把图片裁剪为2 * 26份
for(int i = 0; i < 52; i++){
cutPic(basePath + type +".jpg"
,basePath + "result/" + type + i + ".jpg", -moveArray[i][0], -moveArray[i][1], 10, 58);
}
//拼接图片
String[] b = new String[26];
for(int i = 0; i < 26; i++){
b[i] = String.format(basePath + "result/" + type + "%d.jpg", i);
}
mergeImage(b, 1, basePath + "result/" + type + "result1.jpg");
//拼接图片
String[] c = new String[26];
for(int i = 0; i < 26; i++){
c[i] = String.format(basePath + "result/" + type + "%d.jpg", i + 26);
}
mergeImage(c, 1, basePath + "result/" + type + "result2.jpg");
mergeImage(new String[]{basePath + "result/" + type + "result1.jpg",
basePath + "result/" + type + "result2.jpg"}, 2, basePath + "result/" + type + "result3.jpg");
//删除产生的中间图片
for(int i = 0; i < 52; i++){
new File(basePath + "result/" + type + i + ".jpg").deleteOnExit();
}
new File(basePath + "result/" + type + "result1.jpg").deleteOnExit();
new File(basePath + "result/" + type + "result2.jpg").deleteOnExit();
}
```
还原过程需要注意的是,后台返回错位的图片是312 * 116大小的。而网页上图片div的大小是260 * 116。
3. 计算平移距离,遍历图片的每一个像素点,当两张图的R、G、B之差的和大于255,说明该点的差异过大,很有可能就是需要平移到该位置的那个点,代码如下。
```
BufferedImage fullBI = ImageIO.read(new File(basePath + "result/" + FULL_IMAGE_NAME + "result3.jpg"));
BufferedImage bgBI = ImageIO.read(new File(basePath + "result/" + BG_IMAGE_NAME + "result3.jpg"));
for (int i = 0; i < bgBI.getWidth(); i++){
for (int j = 0; j < bgBI.getHeight(); j++) {
int[] fullRgb = new int[3];
fullRgb[0] = (fullBI.getRGB(i, j) & 0xff0000) >> 16;
fullRgb[1] = (fullBI.getRGB(i, j) & 0xff00) >> 8;
fullRgb[2] = (fullBI.getRGB(i, j) & 0xff);
int[] bgRgb = new int[3];
bgRgb[0] = (bgBI.getRGB(i, j) & 0xff0000) >> 16;
bgRgb[1] = (bgBI.getRGB(i, j) & 0xff00) >> 8;
bgRgb[2] = (bgBI.getRGB(i, j) & 0xff);
if(difference(fullRgb, bgRgb) > 255){
return i;
}
}
}
```
4. 模拟鼠标移动事件,这一步骤是最关键的步骤,�
滑块验证码
需积分: 49 69 浏览量
2018-12-17
15:24:02
上传
评论
收藏 1.13MB ZIP 举报
无事饮茶丫
- 粉丝: 0
- 资源: 1
最新资源
- 纸板缺陷检测数据集VOC+YOLO格式1055张1类别.7z
- 基于CarNet实现裂缝检测python源码+文档说明+数据+图片(课程设计)
- 课程设计-基于耐火材料裂缝剥落检测python源码+课件
- 基于OpenCV的视频道路车道检测python源码+文档说明+实验演示+图片+使用方法(高分毕业设计)
- 基于OpenCV的案例:图像边缘、角点和轮廓检测,图像分割,图像增强;图片拼接;运动目标检测,颜色直方图比较,三帧帧差法,抠图
- SmartPlug-html大一笔记
- SmartPlug-proteusdemo
- Preliminary Findings on Handmade Rattan Baby Crib andBassinet Designs Regarding.zip
- aveebfq_v1.2.83_downyi.com.apk
- 基于有机发光二极管(OLED)的建模优化算法的matlab仿真源码+数据+文档说明+项目说明(高分课程设计)
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈