最近在玩微信,首次在新设备上登陆微信须要验证,因此就想着怎么破这鬼东西!
破解方案有不少,我这边就说说个人方案微信
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]); }