跳过内容

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 的调试会话

  1. 使用 adbjdwp,确定要调试的活动应用程序的 PID

    $ adb jdwp
    2355
    16346  <== last launched, corresponds to our application
    
  2. 通过使用特定的本地端口,使用 adb 在应用程序进程(带有 PID)和您的主机之间创建通信通道

    # adb forward tcp:[LOCAL_PORT] jdwp:[APPLICATION_PID]
    $ adb forward tcp:55555 jdwp:16346
    
  3. 使用 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 会话并启动一个新的会话。