安卓绕过隐藏api限制

2023-10-27

安全设置
出于测试目的,Google 内置了一种在给定 Android 设备上全局禁用隐藏 API 限制的方法。标题为如何启用对非 SDK 接口的访问的问题中链接中的部分。说如下:

您可以通过使用以下 adb 命令更改 API 强制策略来启用对开发设备上的非 SDK 接口的访问:

adb shell settings put global hidden_api_policy_pre_p_apps 1
adb shell settings put global hidden_api_policy_p_apps 1
要将 API 强制策略重置为默认设置,请使用以下命令:

adb shell settings delete global hidden_api_policy_pre_p_apps
adb shell settings delete global hidden_api_policy_p_apps
这些命令不需要有根设备。

您可以将 API 实施策略中的整数设置为以下值之一:

0:禁用所有非SDK接口检测。使用此设置会禁用非 SDK 接口使用的所有日志消息,并阻止您使用 StrictMode API 测试您的应用程序。不推荐此设置。
1:启用对所有非 SDK 接口的访问,但打印带有任何非 SDK 接口使用警告的日志消息。使用此设置还允许您使用 StrictMode API 测试您的应用程序。
2:禁止使用属于黑名单或灰名单且受限于您的目标 API 级别的非 SDK 接口。
3:禁止使用属于黑名单的非SDK接口,但允许使用属于灰名单且针对您的目标API级别受限的接口。
(在 Q beta 上,现在似乎只有一个键:hidden_api_policy.)

(在我的测试中,更改此设置后,您的应用程序需要完全重新启动 - 进程终止 - 才能生效。)

您甚至可以使用Settings.Global.putInt(ContentResolver, String, Int). 但是,它需要应用程序持有该WRITE_SECURE_SETTINGS权限,该权限仅自动授予签名级或特权应用程序。它可以通过 ADB 手动授予。

JNI
所有 API,包括 API 30 及更高版本
前一种方法仅适用于面向 API 29 及以下的应用程序。对于面向 API 30 及更高版本的应用程序,请使用此库:https : //github.com/ChickenHook/RestrictionBypass。

我不完全理解这是如何工作的,但它似乎滥用了 JNI 内部 Java 线程的创建来设置当前应用程序的隐藏 API 豁免策略,以允许访问所有隐藏的 API。

以下是其工作原理的完整说明:https : //androidreverse.wordpress.com/2020/05/02/android-api-restriction-bypass-for-all-android-versions/。

用法很简单。确保您已将 JitPack 添加到您的存储库(在项目级别build.gradle):

allprojects {
repositories {
[…]
maven { url “https://jitpack.io” }
}
}
然后实现库:

implementation ‘com.github.ChickenHook:RestrictionBypass:2.2’
它会自动为您移除 API 限制。

API 29 及更早版本
安全设置方法适用于测试或个人应用程序,但如果您的应用程序旨在分发到您无法控制的设备,那么尝试指导最终用户如何使用 ADB 可能是一场噩梦,即使他们已经知道怎么做,很不方便。

幸运的是,实际上有一种方法可以在本机代码中使用一些巧妙的技巧来禁用应用程序的 API 限制。

在您的JNI_OnLoad()方法中,您可以执行以下操作:

static art::Runtime* runtime = nullptr;

extern “C” jint JNI_OnLoad(JavaVM *vm, void *reserved) {

runtime = reinterpret_castart::JavaVMExt*(vm)->GetRuntime();
runtime->SetHiddenApiEnforcementPolicy(art::hiddenapi::EnforcementPolicy::kNoChecks);


}
这将为您禁用隐藏的 API 检查,无需任何特殊权限。

来源

您还可以使用一个库来为您执行此操作:https : //github.com/tiann/FreeReflection/

纯 Java/Kotlin
JNI 并不适合所有人(包括我)。它还需要您为不同的架构拥有不同版本的应用程序。幸运的是,还有纯 Java 解决方案。

所有 API,包括 API 30 及更高版本
LSPosed 背后的团队是流行的 Xposed 框架的替代品,它提出了一种纯 Java 解决方案,用于绕过针对 API 28 或更高版本的应用程序的隐藏 API 限制。

该库在他们的 GitHub 上结束:https : //github.com/LSPosed/AndroidHiddenApiBypass。

解释是中文的,但它的要点似乎是这样的。该库使用 Java 的 Unsafe API 作为反射的替代方案。然后它的工作方式与 API 29 及更早版本的方法非常相似,允许用户设置隐藏的 API 豁免。

要使用它,只需实现库:

implementation ‘org.lsposed.hiddenapibypass:hiddenapibypass:2.0’
然后在您的应用程序启动时设置隐藏的 API 豁免:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
HiddenApiBypass.addHiddenApiExemptions(“L”);
}
API 29 及更早版本
Android 的隐藏 API 限制仅适用于未由平台签名签名且未手动列入/system/etc/sysconfig/. 这意味着框架(显然)可以访问它想要的任何隐藏方法,这是该方法所利用的。

这里的解决方案是使用双重反射(或“元反射”,正如翻译的源代码所称的那样)。这是一个检索隐藏方法的示例(在 Kotlin 中):

val getDeclaredMethod = Class::class.java.getDeclaredMethod(“getDeclaredMethod”, String::class.java, arrayOf<Class<*>>()::class.java)

val someHiddenMethod = getDeclaredMethod.invoke(SomeClass::class.java, “someHiddenMethod”, Param1::class.java, Param2::class.java)

val result = someHiddenMethod.invoke(someClassInstance, param1, param2)
现在,这本身可以作为一个足够好的解决方案,但它可以更进一步。该类dalvik.system.VMRuntime有一个方法:setHiddenApiExemptions(vararg methods: String). 简单地传递"L"给这个方法将免除所有隐藏的 API,我们可以通过双重反射来做到这一点。

val forName = Class::class.java.getDeclaredMethod(“forName”, String::class.java)
val getDeclaredMethod = Class::class.java.getDeclaredMethod(“getDeclaredMethod”, String::class.java, arrayOf<Class<*>>()::class.java)

val vmRuntimeClass = forName.invoke(null, “dalvik.system.VMRuntime”) as Class<*>
val getRuntime = getDeclaredMethod.invoke(vmRuntimeClass, “getRuntime”, null) as Method
val setHiddenApiExemptions = getDeclaredMethod.invoke(vmRuntimeClass, “setHiddenApiExemptions”, arrayOf(arrayOf()::class.java)) as Method

val vmRuntime = getRuntime.invoke(null)

setHiddenApiExemptions.invoke(vmRuntime, arrayOf(“L”))
onCreate()例如,将该代码放在您的 Application 类的方法中,然后您就可以像平常一样使用隐藏的 API。

有关这方面的完整 Java 示例,请查看 JNI 部分中链接的 FreeReflection 库,或遵循以下源代码。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

安卓绕过隐藏api限制 的相关文章

随机推荐

  • Kubernetes详解(二十)——ReplicaSet控制器

    今天继续给大家介绍Linux运维相关知识 本文主要内容是ReplicaSet控制器 一 ReplicaSet控制器概述 ReplicaSet控制器是Pod类控制器的一种实现 该控制器用于确保其管控的Pod对象副本数量在任意时刻都能够满足用户
  • XXE-lab(全踩坑)实录

    在bWAPP中有一关是XML External Entity Attacks XXE 传送门 比较简单的了解了一下XXE 师傅的博客 浅谈XML实体注入漏洞 XXE漏洞全称XML External Entity Injection即xml外
  • 解决Windows系统下VNC Viewer无法连接到远程主机上的VNC Server的问题

    问题如下 笔记本 IP 10 100 172 194 上装了VNC Viewer 台机 IP 10 100 100 103 上装了VNC Server 原本笔记本连接无线网 可以通过VNC远程连接到办公网的台机的桌面 自从台机重装了系统后
  • 去掉suse里ls默认显示隐藏文件的特性

    以root权限suse终端时 执行ls命令 隐藏文件 文件名以 开头 也都显示出来了 这一点 我是不太喜欢 既然是隐藏文件 一般情况下就不要出现 尤其是 root目录 一堆隐藏文件 很影响我查找文件 要去掉这个特性 先执行alias命令 一
  • arxiv文章下载很慢怎么办?

    对于我们这样的深度学习屌丝来说 没钱 没资源 没数据 没时间 只能看看别人的论文生存了 经常会到arxiv上下载一些文章 比如cvpr的文章 但是 由于国内封锁 下载很慢 甚至接连几天打不开arxiv的网站 咋办 强烈推荐使用中科院arxi
  • usb描述符以及传输方式

    lsusb命令 Bus 002 表示第2个usb主控制器 Device 002 表示系统给usb鼠标分配的设备号 ID 8087 8002 Intel Corp 表示usb设备的ID 这个ID由芯片制造商设置 可以唯一表示该设备 8087
  • 洛谷P5731 【深基5.习6】蛇形方阵

    include
  • 电脑itunes,iTunes

    Music TV and podcasts take center stage iTunes forever changed the way people experienced music movies TV shows and podc
  • 内存管理之分段与分页

    内存管理之分段与分页 转载自多名技术分享者 仅供参考 第一篇 要理解分段和分页 那么得理解为什么会出现分段和分页的技术 首先 这两个技术都是为了利用和管理好计算机的资源 内存 在分段这个技术还没有出现之前 程序运行是需要从内存中分配出足够多
  • 【Verilog】Verilog定义二维数组(2D Array)

    目录 定义的种类 第一种 赋值方法 第二种 赋值方法 第三种 赋值方法 定义的种类 首先看几组定义类型 第一种 定义一个位宽为8的 data1 reg 和 data2 wire 的变量 reg 7 0 data1 wire 7 0 data
  • java.io.IOException: InvalidResourceRequestException: Invalid resource request

    1 背景 做一次kylin计算选择mr进行计算cube 但是报错 首先是 这一报错 报错打开是 yarn上的原因为 2019 05 09 15 07 38 495 ERROR Thread 52 org apache hadoop mapr
  • R文本挖掘之五情感分析

    本文是转载 原文地址 CSDN R语言做文本挖掘 Part5情感分析 Part5情感分析 这是这个系列里面最后一篇文章了 其实这里文本挖掘每一个部分单拎出来都是值得深究和仔细研究的 我还处于初级研究阶段 用R里面现成的算法 来实现自己的需求
  • java 多线程 并发实例_java编程多线程并发处理实例解析

    本文主要是通过一个银行用户取钱的实例 演示java编程多线程并发处理场景 具体如下 从一个例子入手 实现一个银行账户取钱场景的实例代码 第一个类 Account java 账户类 package cn edu byr test public
  • ctfshow-Misc入门 图片篇(50-60)

    八神出的misc入门系列 misc57 59做的比较晚了 本来想着等解了misc61一块发wp的 忙着比赛和推免就忘了 今天看到群里有人用g4 的工具一把梭了才想起来这个事 misc61等能把原理讲清楚了再发 图片篇 图片篇 颜色通道 mi
  • 经典运放电路详细分析(模拟电子技术)

    运放电路 何为运放电路 由运算放大器组成的电路 简称为运放电路 这些电路可以说是五花八门 是我们学习模拟电子技术的一个重要内容 更是一个电子工程师必须掌握的电路之一 运放电路有多种类型 是不是我们把它们牢牢记住就行了呢 显然不是啦 作为知识
  • Excel打开csv文件时中文内容显示为乱码或问号的解决办法

    有同事遇到这样一个问题 就是打开csv文件后 里面的中文显示乱码或者问号 网上找了很久 没有找到有效的解决方法 改非Unicode编码 windows显示语言 office显示语言都没有用 随后自己研究了一下 发现只要改一个地方就可以正常显
  • JWT校验

    JWT JSON Web Token 的缩写 由三部分组成 Header 头部 Payload 负载 Signature 签名 随着技术的发展 分布式web应用的普及 通过session管理用户登录状态成本越来越高 因此慢慢发展成为toke
  • 特征选择和特征理解

    特征选择和特征理解 特征选择 排序 对于数据科学家 机器学习从业者来说非常重要 好的特征选择能够提升模型的性能 更能帮助我们理解数据的特点 底层结构 这对进一步改善模型 算法都有着重要作用 特征选择主要有两个功能 减少特征数量 降维 使模型
  • Java List与ArrayList

    目录 List的介绍 什么是List List的使用 ArrayList与顺序表 ArrayList简介 ArrayList的使用 ArrayList的常见操作 ArrayList的扩容机制 ArrayList的模拟实现 List的介绍 什
  • 安卓绕过隐藏api限制

    安全设置 出于测试目的 Google 内置了一种在给定 Android 设备上全局禁用隐藏 API 限制的方法 标题为如何启用对非 SDK 接口的访问的问题中链接中的部分 说如下 您可以通过使用以下 adb 命令更改 API 强制策略来启用