最近在玩微信,首次在新設備上登陸微信須要驗證,因此就想着怎麼破這鬼東西!
破解方案有不少,我這邊就說說個人方案微信
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]); }