如果不重新编译应用程序,用户可以使用xposed to debug / heapdump app使应用程序可调试
当前是否有任何方法(root或非root)来检测应用程序:
或
或
使用
BuildConfig.DEBUG
和ApplicationInfo
,并检查标记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();
}
答案 0 :(得分:4)
boolean isConnected = new Debug()。isDebuggerConnected();
确定当前是否附加了调试器。 Documentation of Debug class
答案 1 :(得分:0)
Afaik无法在没有root的情况下检索该信息。
但是,您可以检查调试器是否已连接。见Debug.isDebuggerConnected()
答案 2 :(得分:0)
而不是依赖BuildConfig.DEBUG
和ApplicationInfo
,因为暴露的模块现在不可靠。
您可以在代码中创建一个全局常量。
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的设备上执行。良好的加固框架也使连接调试器变得非常困难/几乎不可能。