Android Keylogger

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

Запросы

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

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

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

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

Ответ 1

После исследования в течение одного целого дня я пришел к заключению ниже.

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

Я подвел итог следующим образом:

В Android Key logging для событий клавиатуры не поддерживается в фоновых службах. Некоторые из ссылок следующие:

Пункт 1: Разработчик Google Android

Как мягкие методы ввода могут использовать множественные и изобретательные способы ввода текста, нет никакой гарантии, что любое нажатие клавиши на мягкой клавиатуре вызовет ключевое событие: это остается на усмотрение IME, и на самом деле отправка таких событий не рекомендуется. Вы никогда не должны полагаться на получение KeyEvents для любой клавиши по методу мягкого ввода. В частности, клавиатура программного обеспечения по умолчанию никогда не отправит какое-либо ключевое событие в какое-либо приложение, нацеленное на Jelly Bean или новее, и будет отправлять события только для некоторых нажатий клавиш удаления и возврата для приложений, нацеленных на Ice Cream Sandwich или ранее.

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

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

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

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

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

Точка 4: некоторые другие ссылки:

Google android-developers Группа: https://groups.google.com/forum/#!topic/android-developers/o--GUWmqXdI

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

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

Ответ 2

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

Тип машины

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

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