破解拖拽验证码,

最近在玩微信,首次在新设备上登陆微信须要验证,因此就想着怎么破这鬼东西!

破解方案有不少,我这边就说说个人方案微信

1. 截取验证页工具

2. 裁剪出缺口发生的区域,并记录裁剪的X,Y坐标(尽量越精准越好,减小计算次数)测试

3.对裁剪出来的区域图片进行反色,ui

4.裁剪出白色区域,记录裁剪的X,Y坐标(为减小计算次数)code

5.设置一个正方形,大小与缺口一致的白色模板图片blog

6.将该模板在裁剪图上进行比对找出匹配度最高的区域xy轴坐标图片

7.根据上面裁剪时的X坐标与匹配出来的X轴找出缺口在主图上X位置,而后就能够根据各类工具进行移动匹配了,我用的是自动化测试工具uiautomatorget

注:it

    目前测试下来成功率有百分之九十多,因为样品较少实际可能会有误差,自动化

不废话上代码

1.截图裁剪

mDevice.takeScreenshot(new File("/sdcard/Pictures/securityImg.png"));
        Bitmap bitmap = BitmapFactory.decodeFile("/sdcard/Pictures/securityImg.png");
        bitmap = Bitmap.createBitmap(bitmap, cut_img_x, cut_img_y, 200, 250);

2.反色

try {
            int w = bitmap.getWidth();
            int h = bitmap.getHeight();
            for (int i = 0; i < w; i++) {
                for (int j = 0; j < h; j++) {
                    int pixel = bitmap.getPixel(i, j);
                    bitmap.setPixel(i, j, 0xFFFFFF - pixel);
                }
            }
            w = bitmap.getWidth();
            h = bitmap.getHeight();
            for (int i = 0; i < w; i++) {
                for (int j = 0; j < h; j++) {
                    int pixel = bitmap.getPixel(i, j);
                    int r = (pixel & 0xff0000) >> 16;
                    int g = (pixel & 0xff00) >> 8;
                    int b = (pixel & 0xff);
                    if (r < 250 && r > 150
                            && g < 250 && g > 150
                            && b < 250 && b > 150) {
                        bitmap.setPixel(i, j, 0xffffff);
                    } else {
                        bitmap.setPixel(i, j, 0x000000);
                    }
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

3.计算匹配

HitMeta maxHit = HitMeta.initHitMeta();
        try {
            int pixel = -1;
            //最大匹配次数
            int maxHMatch = bitmap.getHeight() - MODEL_MATRIX[1] + 1;
            int maxWMatch = bitmap.getWidth() - MODEL_MATRIX[1] + 1;
            for (int i = 0; i < maxWMatch; i++) {
                for (int j = 0; j < maxHMatch; j++) {
                    int[] w = new int[]{i, i + MODEL_MATRIX[0]};
                    int[] h = new int[]{j, j + MODEL_MATRIX[1]};
                    HitMeta hit = doMatch(w, h, pixel, bitmap);
                    if (hit == null) {
                        continue;
                    }
                    if (maxHit == null) {
                        maxHit = hit;
                    }
                    maxHit = maxHit.getHit() < hit.getHit() ? hit : maxHit;
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return maxHit;
private static HitMeta doMatch(int[] w, int[] h, int pixel, Bitmap bitmap) {
        int hit = 0;
        for (int i = w[0]; i < w[1]; i++) {
            for (int j = h[0]; j < h[1]; j++) {
                //匹配上
                if (bitmap.getPixel(i, j) == pixel) {
                    hit++;
                }
            }
        }
        if (hit < min_hit_threshold) {
            return null;
        }
        return new HitMeta(hit, w[0], h[0]);
    }
相关文章
相关标签/搜索