Manifest加密

准备工作

  1. 阅读AndroidManifest Ambiguity方案原理及代码,了解原理。
  2. 安装apktool。
  3. 下载源码。按提示操作,得到manifestAmbiguity执行文件,然后把所在目录添加到环境变量里。这样在任何目录下都可以使用manifestAmbiguity命令来修改AXML文件。
  4. 需要加密的APK文件(本文中拿apkdemo.apk进行测试)。

第一步

进入目标apk所在目录,使用unzip命令解压apk文件到指定目录。如下所示,解压apkdemo.apk到output文件夹中。

1
$ unzip -o -d output apkdemo.apk

首先看一下output文件里的目录结构:

修改AndroidManifest.xml防止反编译
箭头所知的AndroidManifest.xml文件是AXML格式的,它是XML格式的二进制格式。我们要做的工作就是修改这个AXML文件,往里面添加一些无意义的字段,从而影响反编译后的重新打包。
使用manifestAmbiguity -p命令打印AndroidManifest.xml文件。
修改AndroidManifest.xml防止反编译

第二步

进入output文件夹,运行manifestAmbiguity -m命令,修改AndroidManifest.xml文件,生成新的xml文件。

1
$ manifestAmbiguity -m AndroidManifest.xml -o out.xml

修改AndroidManifest.xml防止反编译

我们可以看到在output文件夹下出现一个out.xml文件。

修改AndroidManifest.xml防止反编译

使用manifestAmbiguity -p命令打印out.xml文件。结果如下:

修改AndroidManifest.xml防止反编译

红框内就是我们添加的无意义字段。

第三步

删除原来的AndroidManifest.xml文件,将新生成的out.xml文件重命名为AndroidManifest.xml,并且删除META-INF文件夹(签名有关的文件夹)。

1
2
3
$ rm AndroidManifest.xml
$ mv out.xml AndroidManifest.xml
$ rm -rf META-INF/

第四步

在当前目录(此处为output文件夹下)使用zip命令,将所有文件重新打包成一个新的apk。

1
$ zip -9 -r new.apk ./*

修改AndroidManifest.xml防止反编译

第五步

给新生成的apk进行签名。

  • 生成new.keystore签名:
1
$ keytool -genkey -keystore new.keystore -keyalg RSA -validity 10000 -alias new

修改AndroidManifest.xml防止反编译

运行完之后,当前目录下会生成new.keystore签名文件。

修改AndroidManifest.xml防止反编译

  • 为apk签名:
1
$ jarsigner -digestalg SHA1 -sigalg MD5withRSA -verbose -keystore new.keystore -signedjar new-signed.apk new.apk new

我们可以看到目录下新生成new-signed.apk,这个就是我们最终要得到的apk。

修改AndroidManifest.xml防止反编译

第六步

运行安装命令,我们发现new-signed.apk成功安装。

1
$ adb install new-signed.apk

修改AndroidManifest.xml防止反编译
使用apktool对new-signed.apk进行反编译。

1
$ apktool d new-signed.apk

在当前目录下,生成一个new-signed目录,里面是反编译后的文件。

修改AndroidManifest.xml防止反编译

然后使用apktool重新打包。

1
$ apktool b new-signed

重新打包将会失败,错误信息如下:

修改AndroidManifest.xml防止反编译

后续

这种方法安全非常低,破解者只要删除这些无意义的字段,就能重新打包,打包后再次签名,apk就能安装了。所以本文只是验证这种方式的可行性。