焕杰的博客

apk修改debuggable

2020/11/26

最近想玩下RenderDoc, 用Mac版的软件自动patch debuggable时不知为何失败了, 于是想问强哥要个debug包, 未遂. 强哥表示我可以自力更生, 倒也没错就是了(悲). 思路大致有这么三个:

  • 可以通过反编译再回编译的方式修改AndroidManifest.xml

  • 或者用AXMLEditor这个工具直接修改apk中的二进制AndroidManifest.xml

  • 再或者直接上Magisk, 开启全局可调式.

第三种方法由于咱不太懂搞机, 搞不定手头这个红米Note7Pro, 所以单留一个参考链接, 暂且搁置. 这里在Mac上尝试下前两个方法.

本文中涉及的内容比较简单, 没有拆dex, 没有看java源码, 我也就是拆开包来加了两行垃圾, 又给他打包起来了. 水得很.


反编译+回编译

注意: 这个方法前提是程序没有加固, 加固了的先去脱个壳先.

1. 装个apktool先

下载地址内包含了Mac的安装步骤, 也就是拷贝到bin下改成可执行, 这里就不提了.

2. 拆开

1
apktool d com.hello.apk

成功后会在当前目录下生成一个和包同名的目录.

3. 修改AndroidManifest.xml

找到applicaion, 在属性中修改android:debuggable="true", 如果没有这个属性手动添加就可以了.

1
<applicaion android:debuggable="true">

4. 打包

1
apktool b com.hello.apk/

成功后会在目标目录下生成dist目录, 其中就有我们需要的apk.

5. 生成一个keystore

如果有现成的那这一步可以跳过, 注意-keystore的参数和-alias的参数一定要一致, 不然会找不到有效密钥(其实就是自签名证书啦, 搞一个正经的证书太麻烦).

1
keytool -genkey -keystore test.keystore -keyalg RSA -validity 10000 -alias test.keystore

过程中会需要输入各种东西, 记住最开始自己输入的那个密码就可以了.

6. 重新签名

1
jarsigner -verbose -keystore test.keystore -signedjar result.apk com.hello.apk test.keystore

过程中会要上一步生成keystore时的密码, 大致当看到这样的输出时就成功了:

1
2
3
4
5
6
7
8
>>> 签名者
X.509, CN=..., OU=..., O=..., L=..., ST=..., C=...
[可信证书]

jar 已签名。

警告:
签名者证书为自签名证书。

至此, 这个包已经可以拿来用了, 只是签名发生了变化, 和签名挂钩的各种验证就过不了了, 但是截个帧绰绰有余.


使用AXMLEditor修改AndroidManifest

如果反编译+回编译可以搞定问题是最好的, 不行的话再试下面这个方法, 因为个人感觉可能有坑, 文章末尾会说为什么.

而某些apk反编译破解后无法成功回编译, 于是有了这样一个工具, 可以直接修改二进制文件, 无需繁琐的反编译、回编译过程, 厉害得很.

1. 装个AXMLEditor先

1
git clone git@github.com:fourbrother/AXMLEditor.git

啊, 实际上这个git仓库的readme上已经写了如何操作了, 下面只需要踩着脚印走一遍就可以了.

2. 解压 & 修改

首先把apk的内容unzip出来, 我这里直接用了unzip, 导致文件全都出现在当前目录了

1
unzip -n -d com.hello com.hello.apk

可以看到AndroidManifest.xml是个二进制文件, 内容无法理解. 尝试使用AXMLEditor对其进行修改.

1
java -jar AXMLEditor/AXMLEditor.jar -attr -m application 标签唯一标识 debuggable true com.hello/AndroidManifest.xml com.hello/AndroidManifest_out.xml

这里顺带提一下, 看工具源码中这个位置对manifest和application标签跳过了标签唯一标识的判断, 所以上面那个位置写啥都行, 甚至不用改.

最后用输出的文件覆盖原本的输入文件:

1
mv com.hello/AndroidManifest_out.xml com.hello/AndroidManifest.xml

3. 压缩 & 二次签名

这样一来就成功在application上添加了debuggable=true属性了, 需要重新把文件打包起来.

重要: 因为需要二次签名, 所以要先删掉META-INF, 否则后面jarsigner会出问题.

这里给它原汁原味地还原一下, 注意不要把文件夹给打包进去了:

1
2
3
4
cd com.hello/
rm -rf META-INF
zip -r ../com.hello_new.apk ./
cd ..

然后是同样的签名过程, 创建keystore请去上面的内容找:

1
jarsigner -verbose -keystore test.keystore -signedjar result.apk com.hello_new.apk test.keystore

到这里就算搞定了, 这个result.apk就已经是debuggable的了. 可以尝试下adb install, 如果签名有问题的话会安装失败的.

撒, 开始快乐的截帧吧.


坑?

咱尝试了两种方法, 发现后者输出的apk并不能正常debug, 于是用aapt查看包体的各项属性, 发现:

1
2
3
4
> ./aapt list -v -a result_OK.apk | grep debuggable
A: android:debuggable(0x0101000f)=(type 0x12)0xffffffff
> ./aapt list -v -a result_GG.apk | grep debuggable
A: android:debuggable=(type 0x12)0x1 (Raw: "true")

emmmm, 用力过猛塞进去一个raw string? 具体原理探究起来可能时间开销比较大, 于是我就放弃了, 还好有一个方法可以用. 害, 当然也可能是我使用方法出错了, 常有的事儿, 如果有知情的朋友欢迎批评, 感谢指教!


参考&感谢

【Android测试工具】03. ApkTool在Mac上的安装和使用

关于keystore的简单介绍

Android 8.0 以上开启全局可调式

Android中利用AXMLEditor工具不进行反编译就篡改apk文件