检测Android应用程序是否在调试模式下运行

时间:2016-08-22 14:49:45

标签: android linux security

如果不重新编译应用程序,用户可以使用xposed to debug / heapdump app使应用程序可调试

当前是否有任何方法(root或非root)来检测应用程序:

  • 以调试模式运行

  • 应用程序在zygote
  • 中使用debuggable标志启动

  • App正在堆转储
  

使用BuildConfig.DEBUGApplicationInfo,并检查标记   FLAG_DEBUGGABLE 的字段,因为应用程序由zygote直接启动调试标记

以下是挂钩流程类的代码

    try {
        Method start = Process.class.getMethod(
                "start", String.class, String.class, Integer.TYPE, Integer.TYPE, int[].class,
                Integer.TYPE, Integer.TYPE, Integer.TYPE, String.class, String[].class);
        XposedBridge.log("start hook, appInfo: " + loadPackageParam.appInfo);
        XposedBridge.hookMethod(start, new XC_MethodHook() {
            @Override
            protected void beforeHookedMethod(MethodHookParam methodHookParam) throws Throwable {
                    int id = 5;
                    int flags = (Integer) methodHookParam.args[id];
                    if ((flags & 0x1) == 0) {
                        flags |= 0x1;
                    }
                    methodHookParam.args[id] = flags;
                    }
            }
        });
    } catch (NoSuchMethodException e) {
        e.printStackTrace();
    }

all apps is debuggable

4 个答案:

答案 0 :(得分:4)

  

boolean isConnected = new Debug()。isDebuggerConnected();

确定当前是否附加了调试器。 Documentation of Debug class

答案 1 :(得分:0)

Afaik无法在没有root的情况下检索该信息。

但是,您可以检查调试器是否已连接。见Debug.isDebuggerConnected()

答案 2 :(得分:0)

而不是依赖BuildConfig.DEBUGApplicationInfo,因为暴露的模块现在不可靠。 您可以在代码中创建一个全局常量。

public class DebugMode{
    public static final boolean ENABLED = true;
}

在您的发行版中,您将其设置为true,并将调试版本设置为false。您也可以使用different source sets for buildflavours。所以你不必手动更改它们。

如果DebugMode.ENABLED为真,您知道您的应用处于调试模式,否则它处于发布模式。如果DebugMode.ENABLED为false,并且BuildConfig.DEBUG为true,则表示有人正在篡改调试标志。如果您知道这一点,则可以关闭应用程序,或采取其他措施来防止堆转储。

答案 3 :(得分:0)

在安装了Xposed的设备上,您无法阻止任何内容或依赖于您的应用程序在Java / dex代码中处理的任何数据。 Xposed可以修改任何东西。

因此,唯一的方法是通过添加本机代码来强化您的应用程序,以阻止在安装了Xposed的设备上执行。良好的加固框架也使连接调试器变得非常困难/几乎不可能。

相关问题