APK重打包后,由于签名不吻合,在包含原程序的手机上是不能覆盖安装的,需要修改包名(packagename)
对于比较简单的APK可以在apktool编译时直接修改AndroidManifest.xml的源文件实现包名篡改,但类似微信这种复杂的程序,想穷尽修改相关的包名就差强人意了。特别是一些包名可能动态生成或在so文件中使用。
行之有效的方法是直接修改重打包APK中包含的二进制格式的AndroidManifest.xml文件。若欲篡改的包名和原始包名长度相同或比原始包名要短时,修改的方法都很容易操作:
- 解压缩APK
- 修改包名所在字串,字符串以{长度}{UTF8}{NULL}{NULL}方式存储
- 重新压缩APK,重新签名即可
但如果有特殊需求,一定要将包名修改为一个比原包名长的名称时(需要修改多个长度字段),必须清楚地理解AndroidManifest.xml的文件格式。虽然格式未公开,但通过一定的逆向分析,已经有比较详细的格式文档供参考了,详见链接
实验时写了一个Python脚本,用于AndroidManifest.xml中包名的替换,代码详见链接
PS:虽然文档中没有提及,但字符数据整体大小需要4字节对齐,我写的代码已经包含了对齐操作
用微信我测试过,用脚本改名后
AndroidManifest.xml
只有一个地方改名成功。。。。
一句话,就是基本的package name 都没有改动。。。
那这样修改跟直接反编译后修改AndroidManifest.xml 有什么不同?