破解拖拽驗證碼,

最近在玩微信,首次在新設備上登陸微信須要驗證,因此就想着怎麼破這鬼東西!

破解方案有不少,我這邊就說說個人方案微信

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]);
    }
相關文章
相關標籤/搜索