对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软件安全与逆向分析》。