2014-12-02 37 views
10

简介:我想在Android安全性上创建一个POC,它需要确定是否有任何KeyLogger在Android设备上运行。如果它正在运行或安装在设备上,那么请在我的Android应用程序中禁用它。Android密钥记录器

查询:

1)这是可能创造Android的键盘记录器,其截获键盘事件,并在后台作为服务运行?

2)这是否有可能确定是否有任何后台进程处理键盘事件?

3.)我可以通过我的应用程序代码来阻止任何其他后台服务(不属于我)吗?

请帮助我与适当的链接,如果你有。

+0

您是否找到答案? – 2016-10-21 10:19:39

+0

是的,我已经更新了我的发现作为一个接受的答案,请通过它。 – 2016-10-22 07:33:15

回答

3

经过一整天的研究,我达到了以下结论。

Android不允许您拦截来自后台服务的默认软键盘输入。拦截这些事件的唯一方法是自定义键盘。

我如下总结吧:

在Android的键盘记录键盘事件的后台服务不支持。是某些链接如下:

点1:谷歌Android开发者

软输入法都可以使用输入文本的多重性和创造性的方式,也不能保证一个软键盘上的任意按键会产生一个关键事件:这由IME决定,事实上发送这样的事件是不鼓励的。您绝不应该依赖于在软输入方法中接收KeyEvents的任何键。特别是,默认的软件键盘永远不会将任何关键事件发送到任何目标为Jelly Bean或更高版本的应用程序,并且只会将一些按下删除和返回键的事件发送到目标为冰淇淋三明治或更早版本的应用程序。

http://developer.android.com/reference/android/view/KeyEvent.html

的Android果冻豆是:4.1到4.3.1 的Android冰淇淋三明治:4.0

软输入法主要印刷机不需要触发这个监听器的方法,并且实际上不鼓励这样做。默认的安卓键盘不会触发任何锁定Jelly Bean或更高版本的应用程序的任何键,并且只会将它用于一些按键,用于定位冰淇淋三明治或更早版本的应用程序。

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点:罗曼盖伊 罗曼盖伊(https://stackoverflow.com/users/298575/romain-guy)谁对谷歌的作品也证实了这一点 onKeyDown in a service? (Global Hot Keys)

点4:其他一些参考:

谷歌Android开发人员组:https://groups.google.com/forum/#!topic/android-developers/o--GUWmqXdI

它只能通过使用自定义的键盘进行:get pressed key and throw another key in android

,请发表您的评论,如果你认为我已经错过了什么。

+0

非常感谢你的这份文件。我正在调查类似的东西,并想知道我是否可以回避你的问题?不知道我的电子邮件是否显示在我的个人资料中,但如果您愿意,请发送电子邮件至cgmckeever ... gmail。谢谢! – cgmckeever 2015-01-03 20:14:07

+0

请参阅'Type machine'应用程序。据你说,如果这个ID不可能,那么它是如何工作的? – 2016-10-22 09:29:21

+0

现在我没有太多时间来看看。这是我2年前发现的结果。您可以查看该应用,然后发布您的观看次数。 – 2016-10-22 09:42:54

12

我知道这个问题已经有一个公认的答案,但我不同意接受的答案!
这可以通过可访问性API在android中完成。
在下面的程序看看:

Type Machine

它使用的可访问性的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

加1提到类型的机器,但如何实现这一点?任何代码示例? – 2016-10-21 10:19:13

+0

@ 14bce109:我现在编辑了我的答案以包含示例代码。 – ananth 2016-10-23 15:06:12