実行中のアクティビティにタッチスクリーンイベントを挿入できるサービスをバックグラウンドで実行するアプリケーションを作成しようとしています。を呼び出すことで、アプリケーションの一部であるアクティビティにイベントを挿入できますが、アプリケーションInstrumentation.sendPointerSync(motionEvent);
のアクティビティを実行せずにこれを実行しようとすると、INJECT_EVENTS権限がないという権限エラーが発生します。この権限をマニフェストに次のように追加しました。<uses-permission android:name="android.permission.INJECT_EVENTS"></uses-permission>
ただし、それでも同じ権限例外がスローされます。少し検索したところ、INJECT_EVENTS権限を取得するには、システムが署名されているのと同じ署名でアプリに署名する必要があるという回答が得られました。しかし、これが正確に何を意味するのかはわかりません。カスタムROMを見つけてビルドし、アプリケーションが署名されているのと同じ署名で署名する必要があります。次に、カスタムROMをデバイスにインストールしてから、アプリをインストールすると、タッチイベントを正しく挿入できますか?この場合は、このページのような、すでにまとめられているカスタムROMから始める方がよいでしょう。それとも、Androidプロジェクトのgitコピーを取得して、myslef全体をビルドする必要がある状況ですか?そして、どちらの方法でも、これを実現するために正しい方向に私を働かせることができる場所を誰かが知っていますか?
8 に答える
イベントを別のプロセスに挿入するには、アプリを/ system / appにインストールし、APKにシステム証明書で署名する必要があります。
1.アプリマニフェストに権限を追加します
<uses-permission android:name="android.permission.INJECT_EVENTS"/>
2.システム証明書を使用してAPKに署名します
これには、電話で実行されるシステムの構築に使用されるgoogleキーを使用してキーストアを構築するために、AOSPソースが必要です。
AOSPディレクトリがある場合、@ Eliは、「keytool-importkeypair」と呼ばれる優れたスクリプトを使用してキーストアを構築する方法を示す優れた仕事をします。
例としてIntelliJを使用して、[ビルド]メニューから[署名付きAPKの生成..]を選択します。上で作成したキーストアを見つけ、指定されたパスワード(androidなど)を入力し、必要に応じてキーに同じパスワードを指定します。署名されたapkは、通常の場所(./out/production //)ではなく、プロジェクトルート(!)に書き込まれることに注意してください。
3. / system /app/にインストールします
adb root
adb remount
adb push MyApp.apk /system/app
「インストール」は自動的に行われます。ただし、通常のアプリのインストールプロセスとは異なり、APK内のネイティブライブラリは/ system /lib/にコピーされないことに注意してください。NDKを使用して独自のネイティブライブラリをビルドおよび呼び出す場合は、手動で行う必要があります。
実際、これはルート化されたデバイスでは非常に簡単です。/ systemで実行されているアプリは、必要な権限にアクセスできると思います。したがって、アプリを/ systemに手動でインストールするだけです(ここで説明されているようにhttp://androidforums.com/droid-all-things-root/64603-installing-apk-system-app-directory.html):
ターミナルエミュレータで次のコマンドを実行して、/ systemディレクトリを読み取り/書き込みとして再マウントし、アプリケーションをSDCARDから/ system/appディレクトリにインストールします。
su
mount -o remount,rw -t yaffs2 /dev/block/mtdblock3 /system
cp /sdcard/APP.apk /system/app
コンピューターからadbを使用する場合は、次のコマンドを実行します。
adb remount
adb shell cp /sdcard/APP.apk /system/app
このプロセスを簡素化するために、何人かのユーザーがGoogleマーケットプレイスのrootExplorerを利用しています。
または、これをチェックしてください:システム権限でAndroidアプリケーションをコンパイルする方法
タッチイベントの使用:
ROMが署名されているのと同じ署名でアプリケーションに署名します
これを行うには、keytool-importkeypairをダウンロードします
platform.pk8 + platform.x509.pemを検索します:{Androidソース} / build / target / product / security
次に、証明書を生成します。
./keytool-importkeypair -k google_certificate.keystore -p android -pk8 platform.pk8 -cert platform.x509.pem -alias platform
次に、Eclipseからアプリをエクスポートし、生成した新しい証明書で署名します
ROMのビルド、デバイスへのフラッシュ、アプリのインストール
API 18以降、ユーザーのアクセス許可にバインドされていないUiAutomationクラスがあります。
詳細については、http://developer.android.com/reference/android/app/Instrumentation.html#getUiAutomation()を参照してください。
誰かがこの署名レベルの権限をバイパスする解決策を探していて、タッチイベントを作成したい場合。
ソースをC++レベルまで調べました。ここでは、アプリがタッチイベントを作成できるかどうかが実際にチェックされています。以下は、アプリが許可されるべきかどうかを実際にチェックする関数です。
bool InputDispatcher::hasInjectionPermission(int32_t injectorPid, int32_t injectorUid) {
return injectorUid == 0
|| mPolicy->checkInjectEventsPermissionNonReentrant(injectorPid, injectorUid);
}
したがって、この関数は、アプリのユーザーIDが0に設定されている場合にtrueを返します。
ここで、ファイルを編集して、アプリのuidを0に変更しました/data/system/packages.xml
。このファイルには、すべてのアプリに割り当てられたuidが含まれています。userId
アプリに対応する属性を0に設定して、このファイルを編集します。
これで必要なのは、アプリを強制的に閉じて再起動することだけです。INJECT_EVENTS
許可をバイパスすることができます。
私も以前にこれと同じ問題を抱えています。以下の方法で私はKEY_INJECT_EVENT_PERMISSION
問題を解決します。
ステップ1:デバイスROMの署名(私にとってはファイル名はsignapk)を取得する必要があります。
ステップ2:次に、platform.pk8ファイルとplatform.x509.pemファイルを取得する必要があります。
ステップ3:アプリケーションのデバッグapkを生成します。
ステップ4:上記のすべてのファイルを1つのフォルダーに配置します。
ステップ5:上記のファイルをすべて取得したら、以下に示すコマンドを実行します。
java -jar signapk.jar platform.x509.pem platform.pk8 your_debug_app.apk customname.apk
ステップ6:この後、同じフォルダーに署名されたapk(customname.apk)を取得できます。取得したら、以下のコマンドを実行します。
adb install -r app-release-signed.apk
ステップ7:これでInject_Event_Permisson
が有効になります。
以下のリンクを参照してください。
https://steveandro.blogspot.com/2019/09/key-injection-android.html
物理的なSamsungデバイスを使用している場合、デバイス設定でナビゲーションタイプをスワイプジェスチャからボタンに変更すると、この問題が解決するようです。
了解しました。ついにこれを手に入れました。私がこれを言うとき私を信じてください、あなたがそれをそれと呼ぶことができるならば、これはおそらく最悪の解決策です。これにはrootが必要であり、システム全体のすべてのパッケージの署名検証が無効になります。これにより、危険なアプリが通常のアプリに置き換わる一連の攻撃にさらされる可能性があります。
とにかく、それが邪魔にならないように、ここに行きます:
- Xposedをインストールします
- Xposed用のXInstallerモジュールをインストールします
- XInstallerオプションで、[インストール]という名前のメニューに移動し、[署名の確認]と[アプリの確認]のチェックボックスをオンにします
再起動後に行ってもよいはずです。アプリをシステムとしてインストールする必要はありません。ユーザースペースで実行できるようになりました。これにより、/ system / appにコピーする必要がなくなるため、開発が容易になると思います。