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

xDr*_*onZ 15 linux security android

无需重新编译应用程序,用户就可以使用xposed to debug/heapdump app来调试应用程序

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

  • 在调试模式下运行

要么

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

要么

  • 应用程序正在堆转储

使用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();
    }
Run Code Online (Sandbox Code Playgroud)

所有应用都是可调试的

小智 8

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

确定当前是否连接了调试器。 Debug类的文档

  • 我真的不知道为什么这不是最佳答案。它是我发现的简单且唯一的解决方法,让我作为开发人员变得懒惰。+1 (2认同)

Rob*_*ert 0

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

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