Android使用Root权限来实现全局按键和触摸屏事件的后台模拟(类似于按键向导)
有时候,我们需要使用Android在后台模拟系统键,例如调整音量(模拟音量键),在前台关闭正在运行的App(模拟返回键)或模拟触摸屏事件。但是,对于本机Android系统,后台进程将关闭前台进程,甚至模拟用户事件,然后操纵整个系统,这不符合系统安全性原则。如果这种漏洞被病毒或恶意软件利用,将是非常危险的。
由于某些特殊原因,我碰巧需要实现这样的功能,并且没有条件自己编译Android系统(但是我可以使用root权限,因为root权限相对容易获得,并且许多用户已将其Android设备植根。)。我也看到很在互联网上问类似的问题。许已经讨论了很长时间,但是结果是没有解决方案。所以我花了很多精力,终于找到了解决方案。
我在Internet上搜索了很多信息,主要发现了两种方法:Instrumentation和IWindowManager。
使用Instrumentation界面:对于非自编译的Android系统,无法获取系统签名,并且只能在前台而不是在后台模拟密钥。
一种方法是使用仪器接口,该接口最初保留用于软件测试。尝试之后,我发现该界面可以模拟按钮,但前提是应用程序位于前台。当应用程序处于前台时,模拟键基本上不是很有用(模拟键操作应用程序本身似乎没有什么意义)。
当应用程序在后台运行时,此Instrumentation界面将变为无效。在Internet上找到的解释是,要在后台使用此接口,需要系统权限,即在清单中添加android:sharedUserId =“ android.uid.system”。这会导致什么问题呢?已声明系统权限的APK如果具有系统签名(例如,系统附带的电话和短信),则必须具有系统签名才能安装在Android设备上,这些本质上是APK程序,但是这些应用程序具有系统权限。
Anzhuo系统具有一套签名机制,APK只能与数字签名一起安装。通常,Eclipse在调试时默认情况下会自动对其进行签名,并使用Debug签名。发布应用程序时,开发人员使用他自己的唯一数字签名文件对APK进行签名(此文件可以使用Eclipse生成,或者可以通过Eclipse完成签名)。安装新版本的APK时,如果检测到签名不一致,则系统将提示签名不一致,并且仅在卸载旧版本后才能安装旧版本。在某种程度上,这种机制可以防止第三方修改正式发布的APK甚至非法植入病毒(当然,如果用户主动卸载旧版官方应用并安装新版本的非官方APK,也有可能)。具有相同签名的不同应用可以在它们之间共享一些数据。
以及如何获取系统签名?编译Android系统时,由系统签名的数字签名文件将一起编译。对于已编译的系统,或为了适应不同的系统,将不可避免地无法获得此数字签名文件,因此无法对APK进行系统签名。最后,无法安装具有uid.system属性的APK。因此,只有在系统自行编译时,才可以使用在Instrumentation界面的后台模拟击键的方法。

使用反射方法来调用系统IWindowManager隐藏的API:兼容性差,稳定性差且容易出错。此外,在实际编译过程中发生错误,并且原因暂时未知。
Internet上还有另一种方法。 Android系统中有一些隐藏的API,通常使用Java的权限限制来使这些API无法被调用。但是通过反思,您可以突破Java的权限限制。 IWindowManager中隐藏了可以模拟按键和触摸屏事件的API。尝试方法,下载从Android源代码编译的jar文件,将其添加到项目中,然后使用启动器编写一些代码来尝试调用隐藏的API。结果,Eclipse在编译时没有直接响应。可能是因为计算机配置不够,并且jar文件太大。我尝试了几次都没有成功,并且考虑到该方法有很多缺点,并且最后很可能仍然需要系统权限(Internet上的许多文章不太清楚),所以我放弃了此方法。
Android模拟键问题摘要[使用IWindowManager.injectKeyEvent方法]
在Android中使用隐藏的API(很多插图)
JNI调用C程序来模拟按键:这仍然是权限问题。
参考一些资料中提出的可能想法,我发现可以想到的剩余方法是使用JNI来实现,该JNI通过调用C / C ++程序来模拟击键。我对Linux低级编程不熟悉。我在Internet上引用了一些代码,并在Ubuntu下编写了一个按键模拟程序,该程序已成功编译并运行。然后,我开始学习JNI编译方法。首先,我在C程序层中编写了一个简单的加法运算,编译并运行测试并通过,然后粘贴了模拟按钮的代码。我写了Android Java代码,完全期望地编译,下载和执行了该程序,但没有任何效果。
我想看看哪一步出错了,我在C程序中进行了更改,并使用LogCat打印了C程序的返回值。我发现打开钥匙装置时出现错误。看来它一定又是一个权限问题。
尽管系统已经植根并且APK也允许使用root权限,但是root权限无法传递给C程序,并且权限不够,因此无法执行该程序。我搜索了有关Internet上Linux和Android权限的信息,但找不到任何想法。实际上,当时我很困惑。在Linux系统中,Root权限是最高权限,Android也不例外。一篇文章指出,“ root权限”>“系统权限”>“用户权限”。尽管我可以获得Root权限,但无法完成系统权限可以完成的任务。我总是觉得我不应该。
Android密钥向导:可以在没有系统签名的情况下使用Root权限来模拟诸如击键和后台触摸屏之类的事件。
当时我很绝望,我觉得只有自己编译系统才能解决问题。那一刻,我突然想到了按钮向导软件。我以前使用过计算机版本,当我在Android市场上找到它时,也有一个Android版本。下载和使用发现,按钮向导可以在后台模拟按钮操作,这需要Root权限,但是原理不明。我想尝试反编译源代码以进行查看,但是当时存在一些问题,并且反编译没有成功。在Internet上搜索Android按钮向导的原理,除了前两个依赖于源环境使用的API,但未找到结果。但是至少,这表明在不使用系统签名的情况下使用Root权限,实现模拟按键并与大量Android设备兼容是可行的。
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/bofangqi/article-373433-1.html
休渔期结束
看哭了~~~
杨洋