应用的动态调试是Android逆向的大类,而打开可调试开关则是动态调试的第一步,总结一下打开开关的三种方法;
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进程的内存块中是存在这些属性的;
https://github.com/wpvsyou/mprop
https://bbs.pediy.com/thread-215311.htm
https://bbs.pediy.com/thread-246081.htm
http://blog.leanote.com/post/iunknow/%E5%8A%A8%E6%80%81%E8%B0%83%E8%AF%95so
[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
shell@hammerhead:/ $ cat default.prop | grep debug
ro.debuggable=0
shell@hammerhead:/ $ getprop ro.debuggable
0
shell@hammerhead:/ $ cd /data/local/tmp
shell@hammerhead:/data/local/tmp $ su
root@hammerhead:/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 ................
……
root@hammerhead:/ # cat default.prop | grep debug
ro.debuggable=0
root@hammerhead:/ # getprop ro.debuggable
1
在目录下找到指定cpu型号的mprop文件拷贝到设备目录下,然后修改权限为可执行的,然后直接运行三条命令即可:
# 修改init进程中的ro属性判断逻辑
/data/local/tmp# ./mprop
# 然后修改系统调试属性值
/data/local/tmp# setprop ro.debuggable 1
# 恢复init默认逻辑,之后就无法再修改ro属性了
/data/local/tmp# ./mprop -r
http://www.520monkey.com/archives/1283
需要注意,虽然已经修改了内存中的值,但需要重启adbd进程才能重新加载所有应用的连接信息,因为它是adb的守护进程;
重启adbd进程,直接stop;start即可;
root@hammerhead:/data/local/tmp # stop;start
BDOpener
这是一款Xposed的模块,用于修改程序的debugable选项,同时也支持开启备份选项,方便数据转移;
https://security.tencent.com/index.php/opensource/detail/17
下载应用,直接在Xposed中激活,然后重启手机;
验证
使用第二、三种方法都比第一种方法快,但两者优缺点也很明显,第二种方法重启机子后需要重新利用mprop再次修改内存属性值,而第三种方法比较永益,激活模块后重启一次机器,之后可不再担心;
利用DDMS
可以直观看到手机系统中所有已打开应用,含系统应用均可以被调试,也可以使用adb jdwp
来查看所有可调式应用的进程id,发现也有很多;
同时可通过adb shell dumpsys package xxx
来看xxx应用的包信息,flags字段中是没有debuggable属性值的,但这个应用此时是可以被调试的;
原文链接: