准备工作
- 阅读AndroidManifest Ambiguity方案原理及代码,了解原理。
- 安装apktool。
- 下载源码。按提示操作,得到manifestAmbiguity执行文件,然后把所在目录添加到环境变量里。这样在任何目录下都可以使用manifestAmbiguity命令来修改AXML文件。
- 需要加密的APK文件(本文中拿apkdemo.apk进行测试)。
第一步
进入目标apk所在目录,使用unzip命令解压apk文件到指定目录。如下所示,解压apkdemo.apk到output文件夹中。
1 | $ unzip -o -d output apkdemo.apk |
首先看一下output文件里的目录结构:
箭头所知的AndroidManifest.xml文件是AXML格式的,它是XML格式的二进制格式。我们要做的工作就是修改这个AXML文件,往里面添加一些无意义的字段,从而影响反编译后的重新打包。
使用manifestAmbiguity -p命令打印AndroidManifest.xml文件。
第二步
进入output文件夹,运行manifestAmbiguity -m命令,修改AndroidManifest.xml文件,生成新的xml文件。
1 | $ manifestAmbiguity -m AndroidManifest.xml -o out.xml |
我们可以看到在output文件夹下出现一个out.xml文件。
使用manifestAmbiguity -p命令打印out.xml文件。结果如下:
红框内就是我们添加的无意义字段。
第三步
删除原来的AndroidManifest.xml文件,将新生成的out.xml文件重命名为AndroidManifest.xml,并且删除META-INF文件夹(签名有关的文件夹)。
1 | $ rm AndroidManifest.xml |
第四步
在当前目录(此处为output文件夹下)使用zip命令,将所有文件重新打包成一个新的apk。
1 | $ zip -9 -r new.apk ./* |
第五步
给新生成的apk进行签名。
- 生成new.keystore签名:
1 | $ keytool -genkey -keystore new.keystore -keyalg RSA -validity 10000 -alias new |
运行完之后,当前目录下会生成new.keystore签名文件。
- 为apk签名:
1 | $ jarsigner -digestalg SHA1 -sigalg MD5withRSA -verbose -keystore new.keystore -signedjar new-signed.apk new.apk new |
我们可以看到目录下新生成new-signed.apk,这个就是我们最终要得到的apk。
第六步
运行安装命令,我们发现new-signed.apk成功安装。
1 | $ adb install new-signed.apk |
使用apktool对new-signed.apk进行反编译。
1 | $ apktool d new-signed.apk |
在当前目录下,生成一个new-signed目录,里面是反编译后的文件。
然后使用apktool重新打包。
1 | $ apktool b new-signed |
重新打包将会失败,错误信息如下:
后续
这种方法安全非常低,破解者只要删除这些无意义的字段,就能重新打包,打包后再次签名,apk就能安装了。所以本文只是验证这种方式的可行性。