AndroidManifest.xml

最常规的方法,拿到一个应用后,直接反编译,在AndroidManifest.xml的application中添加android:debuggable="true"字段,在回编译、签名、安装、然后进行动态调试;

<application android:allowBackup="true" android:debuggable="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme">

mprop

修改系统调试的总开关字段,由于系统文件只可读,强制修改重新编译镜像再刷入设备又很复杂还不安全,这里可以注入init进程,修改内存中的ro.debuggable字段数据为1【默认为0,即不启用】;

因为Android系统初始化时,init进程会解析系统属性文件【ro.debuggable在/default.prop文件中】,然后将其保存到内存中去,以便给所有应用提供服务,所以在init进程的内存块中是存在这些属性的;

之前有师傅写了一款工具,针对arm v7 v8均有适配:mprop

[Go0s]: ~/Security/_Tools/Android/mprop/armeabi-v7a ✗ master*
➜  adb push mprop /data/local/tmp              
mprop: 1 file pushed. 1.6 MB/s (17712 bytes in 0.011s)
[Go0s]: ~ 
➜  adb shell
[email protected]:/ $ cat default.prop | grep debug                             
ro.debuggable=0
[email protected]:/ $ getprop ro.debuggable
0
[email protected]:/ $ cd /data/local/tmp
[email protected]:/data/local/tmp $ su
[email protected]:/data/local/tmp # ./mprop ro.debuggable 1   
properties map area: b6f7a000-b6f9a000
00000000  08 8d 00 00 19 01 00 00 50 52 4f 50 ab d0 6e fc  ........PROP??n?
00000010  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
……
[email protected]:/ # cat default.prop | grep debug                              
ro.debuggable=0
[email protected]:/ # getprop ro.debuggable                                      
1

需要注意,虽然已经修改了内存中的值,但需要重启adbd进程才能重新加载所有应用的连接信息,因为它是adb的守护进程;

重启adbd进程,直接stop;start即可;

[email protected]:/data/local/tmp # stop;start

BDOpener

这是一款Xposed的模块,用于修改程序的debugable选项,同时也支持开启备份选项,方便数据转移;

工具下载:BDOpener

下载应用,直接在Xposed中激活,然后重启手机;

2942160957

验证

使用第二、三种方法都比第一种方法快,但两者优缺点也很明显,第二种方法重启机子后需要重新利用mprop再次修改内存属性值,而第三种方法比较永益,激活模块后重启一次机器,之后可不再担心;

利用DDMS可以直观看到手机系统中所有已打开应用,含系统应用均可以被调试,也可以使用adb jdwp来查看所有可调式应用的进程id,发现也有很多;

同时可通过adb shell dumpsys package xxx来看xxx应用的包信息,flags字段中是没有debuggable属性值的,但这个应用此时是可以被调试的;