二进制格式的AndroidManifest修改

APK重打包后,由于签名不吻合,在包含原程序的手机上是不能覆盖安装的,需要修改包名(packagename)

对于比较简单的APK可以在apktool编译时直接修改AndroidManifest.xml的源文件实现包名篡改,但类似微信这种复杂的程序,想穷尽修改相关的包名就差强人意了。特别是一些包名可能动态生成或在so文件中使用。

行之有效的方法是直接修改重打包APK中包含的二进制格式的AndroidManifest.xml文件。若欲篡改的包名和原始包名长度相同或比原始包名要短时,修改的方法都很容易操作:

  • 解压缩APK
  • 修改包名所在字串,字符串以{长度}{UTF8}{NULL}{NULL}方式存储
  • 重新压缩APK,重新签名即可

但如果有特殊需求,一定要将包名修改为一个比原包名长的名称时(需要修改多个长度字段),必须清楚地理解AndroidManifest.xml的文件格式。虽然格式未公开,但通过一定的逆向分析,已经有比较详细的格式文档供参考了,详见链接

实验时写了一个Python脚本,用于AndroidManifest.xml中包名的替换,代码详见链接

PS:虽然文档中没有提及,但字符数据整体大小需要4字节对齐,我写的代码已经包含了对齐操作

二进制格式的AndroidManifest修改》上有2个想法

  1. 用微信我测试过,用脚本改名后
    AndroidManifest.xml
    只有一个地方改名成功。。。。
    一句话,就是基本的package name 都没有改动。。。

    hhjack 于 2015-03-25 10:20 AM 回复
    是啊,就是改动了二进制格式AndroidManifest.xml中的包名字段才对啊,系统只通过这个识别。

  2. 那这样修改跟直接反编译后修改AndroidManifest.xml 有什么不同?

    hhjack 于 2015-04-18 01:28 AM 回复
    反编译再回编译的方法修改包名的话,需要修改很多地方,不仅仅是AndroidManifest.xml,比如smali文件

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注