apk 反编译与预防


对apk防止反编译和防止二次打包是很重要的, 辛辛苦苦开发出来的AA系统被别人替换了字符串和图片二次打包,AA系统就变成了"XX系统",如果不法分子“技艺高超”,可以阅读并且修改混淆之后的smali代码,那么还可能植入一些广告或者恶意的逻辑。下面描述一下对miuilite.apk的二次打包的过程,并提出一种防止二次打包的方法。

1.1 反编译miuilite.apk替换资源文件并二次打包

    (1) apktool 反编译出资源文件和smali代码到miuilite

         apktool d MiuiLite_2.3.0_1000.apk  ~/miuilite

    (2) 替换字符串资源和图片资源,比如把application_name 和icon替换

    (3) 重新打包,这个过程中可能会报错,只要把报错的attr从style.xml中删除即可

         apktool b miuilite   miuilite_2.3.apk 

    (4) android只能install 有签名的apk,下面对miuilite_2.3.apk 签名并生成签名后的miuilite_2.3_signed.apk

         keytool -genkey -v -keystore mylite.keystore -alias mylite.keystore -keyalg RSA -validity 20000  #生成自己的mylite.keystore

         jarsigner -verbose -keystore mylite.keystore -signedjar miuilite_2.3_signed.apk miuilite_2.3.apk  mylite.keystore

    经过上述步骤就可以把AA系统安装到手机的就变成xx系统了。

 1.2 反编译miuilite.apk修改代码逻辑

      下面的方法即使不懂smali也可以修改源apk逻辑执行恶意代码或者添加广告

      (1)apktool 反编译apk文件,得到反编译后文件夹(assets(项目原始的assets),smali,res(项目原始res),AndroidManifest.xml(项目原始manifest文件))
      (2)创建一个新的android项目,实现相关的类(尽量不去使用xml,所有需要用到的内容用代码实现),并生成apk文件
      (3)使用apktool反编译2中生成的apk文件,得到smali文件夹
      (4)将3中得到的smali文件夹加入1中的smali文件夹,并修改1中的AndroidManifest.xml,比如说设置应用从2的MainActivity启动,执行恶意代码后再跳转至原始应用的启动页
      (5)使用apktool对处理完的文件夹进行编译,得到apk文件(未签名),然后再进行签名,得到已签名apk文件

1.3 防止反编译

1. 如果反编译的人不懂smali的修改,就可以通过下面这个方法来预防。当发现apk的签名不是自己公司的签名的时候退出进程即可。

    public void getSignedInfo(){

            PackageInfo info = this.getPackageManager().getPackageInfo(this.getPackageName(), PackageManager.GET_SIGNATURES);
            Signature[] signs = info.signatures;
            Signature sign = signs[0];
            String txt = sign.toCharsString();
            pareseSignature(sign.toByteArray());
    }
    private void pareseSignature(byte[] byteArray) throws GeneralSecurityException {
        CertificateFactory fac = CertificateFactory.getInstance("X.509");
        X509Certificate cert = (X509Certificate) fac.generateCertificate(new ByteArrayInputStream(byteArray));
        Log.d(TAG,"cert.getSubjectDN().getName()="+cert.getSubjectDN().getName());#当发现apk的签名不是小米公司的签名的时候退出进程即可
    }

2.如果反编译的人懂smali源码的话,他完全可以把我们上面的逻辑去掉,即使我们使用proguard.flags来混淆代码,还是有可能被破解。目前市场上有几个比较成熟的apk加密的提供商,比如爱加密、梆梆加固等,基本原理就是dex文件加壳,把加壳dex和原始dex合并,然后在加壳apk中通过DexClassLoader动态加载原始apk,说起来容易做起来难,方案实施的时候还是会有很多问题。分享一篇文章,http://blog.csdn.net/androidsecurity/article/details/8678399  ,博主提供了具体的代码实现,有时间可以亲自实现一下。推荐一本介绍android安全攻防的书《android软件安全与逆向分析》。


你可能感兴趣的:(apk 反编译与预防)