MASTG-TEST-0039:测试应用程序是否可调试
已弃用测试
此测试已**弃用**,不应再使用。**原因**:MASTG V2 中提供新版本
请查看以下涵盖此 v1 测试的 MASTG v2 测试
概述¶
静态分析¶
检查 AndroidManifest.xml
以确定是否已设置 android:debuggable
属性,并查找该属性的值
...
<application android:allowBackup="true" android:debuggable="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme">
...
您可以使用 Android SDK 中的 aapt
工具,通过以下命令行快速检查是否存在 android:debuggable="true"
指令
# If the command print 1 then the directive is present
# The regex search for this line: android:debuggable(0x0101000f)=(type 0x12)0xffffffff
$ aapt d xmltree sieve.apk AndroidManifest.xml | grep -Ec "android:debuggable\(0x[0-9a-f]+\)=\(type\s0x[0-9a-f]+\)0xffffffff"
1
对于发布版本,此属性应始终设置为 "false"
(默认值)。
动态分析¶
adb
可用于确定应用程序是否可调试。
使用以下命令
# If the command print a number superior to zero then the application have the debug flag
# The regex search for these lines:
# flags=[ DEBUGGABLE HAS_CODE ALLOW_CLEAR_USER_DATA ALLOW_BACKUP ]
# pkgFlags=[ DEBUGGABLE HAS_CODE ALLOW_CLEAR_USER_DATA ALLOW_BACKUP ]
$ adb shell dumpsys package com.mwr.example.sieve | grep -c "DEBUGGABLE"
2
$ adb shell dumpsys package com.nondebuggableapp | grep -c "DEBUGGABLE"
0
如果应用程序是可调试的,则执行应用程序命令很简单。在 adb
shell 中,通过附加包名称和应用程序命令到二进制名称来执行 run-as
$ run-as com.vulnerable.app id
uid=10084(u0_a84) gid=10084(u0_a84) groups=10083(u0_a83),1004(input),1007(log),1011(adb),1015(sdcard_rw),1028(sdcard_r),3001(net_bt_admin),3002(net_bt),3003(inet),3006(net_bw_stats) context=u:r:untrusted_app:s0:c512,c768
Android Studio 也可用于调试应用程序并验证应用程序的调试激活。
确定应用程序是否可调试的另一种方法是将 jdb
附加到正在运行的进程。如果成功,调试将被激活。
以下过程可用于启动与 jdb
的调试会话
-
使用
adb
和jdwp
,确定要调试的活动应用程序的 PID$ adb jdwp 2355 16346 <== last launched, corresponds to our application
-
通过使用特定的本地端口,使用
adb
在应用程序进程(带有 PID)和您的主机之间创建通信通道# adb forward tcp:[LOCAL_PORT] jdwp:[APPLICATION_PID] $ adb forward tcp:55555 jdwp:16346
-
使用
jdb
,将调试器附加到本地通信通道端口并启动调试会话$ jdb -connect com.sun.jdi.SocketAttach:hostname=localhost,port=55555 Set uncaught java.lang.Throwable Set deferred uncaught java.lang.Throwable Initializing jdb ... > help
关于调试的一些注意事项
- jadx 可用于识别插入断点的有趣位置。
- jdb 的基本命令的用法可以在 Tutorialspoint 找到。
- 如果在将
jdb
绑定到本地通信通道端口时,出现错误提示“与调试器的连接已关闭”,请终止所有 adb 会话并启动一个新的会话。