Android APP如何防止二次打包

摘要 “Android APP二次打包”则是盗版正规Android APP,破解后植入恶意代码重新打包。不管从性能、用户体验、外观它都跟正规APP一模一样但是背后它确悄悄运行着可怕的程序,它会在不知不觉中浪费手机电量、流量,恶意扣费、偷窥隐私等等行为。
 

 Android系统的开放性和免费性等特征让开发者和用户趋之若鹜,用户也渐渐习惯了Android应用的这种免费午餐,但在免费的背后却有着巨大的安全阴影。我们可以通过APP检测工具对APP进行检测。

      “Android APP二次打包”则是盗版正规Android APP,破解后植入恶意代码重新打包。不管从性能、用户体验、外观它都跟正规APP一模一样但是背后它却悄悄运行着可怕的程序,它会在不知不觉中浪费手机电量、流量,恶意扣费、偷窥隐私等等行为。

       面对二次打包不少公司都有自己的防范措施,知名公司的APP几乎都是自己在程序内部做过处理防止其APP被二次打包,一旦打包后重新运行则程序自动退出。接下来,我就来详解一下如何防止APP被二次打包。

       要实现代码内部防止APP被二次打包首先得了解APK的机器识别原理,APK的唯一识别是依靠包名和签名来做鉴定的,类似豌豆夹的洗白白、360手机卫士等安全软件对APK的山寨识别,他们就是依赖包名来确定APK,然后通过签名来确定其是否山寨。所以说自己的程序内部在启动的时候可以通过获取APK本身的签名然后和正确的签名做对比来识别自己是否被二次打包。(判断的本质就是签名)

 

1.获取apk自身签名的MD5值

通过PackageManag对象可以获取APK自身的签名,签名分解后得到一串接近20个字节的字符串,这个字符串就是APK签名的MD5值,通过获取的签名MD5值与正确的MD5值进行对比,就可以识别其APK是否被盗版:

public void getSingInfo(){ void getSingInfo(){
        Log.e("2222", "====");    Log.e("2222", "====");
        try {    try {
            PackageInfo packageInfo = getPackageManager().getPackageInfo(        PackageInfo packageInfo = getPackageManager().getPackageInfo(
                    getPackageName(),PackageManager.GET_SIGNATURES);                getPackageName(),PackageManager.GET_SIGNATURES);
            System.out.println("1---packageInfo---"+packageInfo);//获取包信息        System.out.println("1---packageInfo---"+packageInfo);//获取包信息
            
            Signature[] signs = packageInfo.signatures;        Signature[] signs = packageInfo.signatures;
            System.out.println("2---signs---"+signs);//获取签名信息        System.out.println("2---signs---"+signs);//获取签名信息
            
            Signature sign = signs[0];        Signature sign = signs[0];
            System.out.println("3---sign---"+sign);//获取签名数组的第一个元素        System.out.println("3---sign---"+sign);//获取签名数组的第一个元素
            
            parseSignature(sign.toByteArray());//元素变为字节传到方法中处理        parseSignature(sign.toByteArray());//元素变为字节传到方法中处理
            System.out.println("---执行完毕了---");        System.out.println("---执行完毕了---");
        } catch (Exception e) {    } catch (Exception e) {
            e.printStackTrace();        e.printStackTrace();
        }    }
    }}

被上面调用的方法

public void parseSignature(byte[] signature){ void parseSignature(byte[] signature){
        try {    try {
            CertificateFactory certFactory = CertificateFactory.getInstance("X.509");        CertificateFactory certFactory = CertificateFactory.getInstance("X.509");
            System.out.println("4---certFactory---"+certFactory);        System.out.println("4---certFactory---"+certFactory);
            
            X509Certificate cert = (X509Certificate)certFactory.generateCertificate(new ByteArrayInputStream(signature));        X509Certificate cert = (X509Certificate)certFactory.generateCertificate(new ByteArrayInputStream(signature));
            System.out.println("5---cert---"+cert);        System.out.println("5---cert---"+cert);
            
            byte[] buffer = cert.getEncoded();        byte[] buffer = cert.getEncoded();
            System.out.println("6---buffer---"+buffer);//得到签名的哈希码        System.out.println("6---buffer---"+buffer);//得到签名的哈希码
            for(int i=0;i        for(int i=0;i 
              
                System.out.println("---遍历---"+buffer[i]);            System.out.println("---遍历---"+buffer[i]);
            }        }
            
        } catch (Exception e) {    } catch (Exception e) {
            e.printStackTrace();        e.printStackTrace();
        }    }
    }}
 

2. 下面获取的是调试时的签名信息

 Window--->Android--->Build--->MD5 fingerprint 对应的值

Keytool 是安全钥匙与证书的管理工具.它管理一个存储了私有钥匙和验证相应公共钥匙的与它们相关联的X.509 证书链的keystore(相当一个数据库). 

 

你可能感兴趣的:(Android APP如何防止二次打包)