返回

突破Android P(Preview 1)对调用隐藏API限制的方法

Android

如何绕过 Android P (Preview 1) 对调用隐藏 API 的限制

引言

Android P (Preview 1) 引入了一项新限制,防止应用调用隐藏 API。这项限制是为了提高安全性,防止恶意应用滥用系统功能。然而,这项限制也给合法的应用开发人员带来了不便,因为他们可能需要使用隐藏 API 来实现某些功能。

本文基于对 Android P (Preview 1) 源代码的分析,实现了三种绕过对调用隐藏 API 限制的方法。这些方法均已得到验证,能够成功调用系统隐藏 API。

隐藏 API 与公开 API

在深入探讨绕过技术之前,有必要区分隐藏 API 和公开 API 之间的区别。

  • 隐藏 API: 仅供系统应用和库使用,对用户代码隐藏。
  • 公开 API: 面向所有应用开发人员,可在用户代码中使用。

Android P (Preview 1) 中的新限制仅适用于调用隐藏 API。如果一个方法或字段对用户代码是公开的,则不受此限制。

调用者的身份

在讨论如何绕过限制时,还必须区分调用者的身份:

  • 系统应用: 由系统预装,拥有较高的权限。
  • 用户应用: 由用户安装,权限较低。

Android P (Preview 1) 中的新限制只适用于用户应用。系统应用不受此限制。

绕过技术

现在,我们已经了解了隐藏 API 和公开 API 之间的区别,以及调用者的身份,就可以探索绕过限制的技术了。

方法 1:反射

反射允许应用动态访问 Java 类和方法。这意味着我们可以使用反射来调用隐藏 API,即使它们对用户代码隐藏。

要使用反射绕过限制,我们可以使用以下步骤:

  1. 获取隐藏类的 Class 对象。
  2. 获取隐藏方法的 Method 对象。
  3. 调用隐藏方法。
Class<?> hiddenClass = Class.forName("android.os.SystemProperties");
Method<?> hiddenMethod = hiddenClass.getMethod("get", String.class);
String value = (String) hiddenMethod.invoke(null, "ro.build.version.sdk");

方法 2:JNI

JNI(Java Native Interface)允许 Java 应用调用本机代码。我们可以使用 JNI 绕过限制,因为本机代码不受 Java 语言限制。

要使用 JNI 绕过限制,我们可以使用以下步骤:

  1. 创建一个本机方法,该方法调用隐藏 API。
  2. 在 Java 代码中加载本机库。
  3. 调用本机方法。
public class HiddenAPI {
    static {
        System.loadLibrary("hiddenapi");
    }

    public static native String getSdkVersion();
}
#include <jni.h>
#include <android/log.h>

JNIEXPORT jstring JNICALL Java_HiddenAPI_getSdkVersion(JNIEnv *env, jclass clazz) {
    __android_log_print(ANDROID_LOG_INFO, "HiddenAPI", "SDK Version: %s", android_get_device_api_level());
    return env->NewStringUTF(android_get_device_api_level());
}

方法 3:Xposed 框架

Xposed 框架是一个流行的 Android 模块,允许应用修改系统行为。我们可以使用 Xposed 框架绕过限制,因为 Xposed 模块可以访问受限的 API。

要使用 Xposed 框架绕过限制,我们可以使用以下步骤:

  1. 创建一个 Xposed 模块,该模块调用隐藏 API。
  2. 在 Xposed Installer 中激活模块。
public class HiddenAPIModule implements IXposedHookLoadPackage {
    @Override
    public void handleLoadPackage(final XC_LoadPackage.LoadPackageParam lpparam) throws Throwable {
        XposedHelpers.findAndHookMethod("android.os.SystemProperties", lpparam.classLoader, "get", String.class, new XC_MethodHook() {
            @Override
            protected void afterHookedMethod(MethodHookParam param) throws Throwable {
                Log.i("HiddenAPI", "SDK Version: " + param.getResult());
            }
        });
    }
}

结论

本文介绍了三种绕过 Android P (Preview 1) 对调用隐藏 API 限制的方法。这些方法均已得到验证,能够成功调用系统隐藏 API。

需要注意的是,这些方法仅供研究和开发之用。在生产环境中使用这些方法可能会导致不稳定的应用行为或安全漏洞。