最近想玩下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 | >>> 签名者 |
至此, 这个包已经可以拿来用了, 只是签名发生了变化, 和签名挂钩的各种验证就过不了了, 但是截个帧绰绰有余.
使用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 | cd com.hello/ |
然后是同样的签名过程, 创建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 | > ./aapt list -v -a result_OK.apk | grep debuggable |
emmmm, 用力过猛塞进去一个raw string? 具体原理探究起来可能时间开销比较大, 于是我就放弃了, 还好有一个方法可以用. 害, 当然也可能是我使用方法出错了, 常有的事儿, 如果有知情的朋友欢迎批评, 感谢指教!