Android アプリに関する一般的な質問があります。Android アプリで pcap 機能を使用する必要があります。Javaは生のパケットインジェクションと低層プログラミングの可能性を提供しないため(私の知る限り、間違っている場合は修正してください)、代替手段を探していました。これまでのところ、次のことがわかりました。
- アンドロイド NDK
- JNETPCAP
どちらを使用すべきか、または他の提案がありますか?
JNIソリューション
アプリケーションがJavaでネイティブコードを呼び出せるように、CまたはC ++でlibpcapから必要な呼び出しとロジックをラップし、 (Java Native Interface)を介して基盤となる関数を公開する必要があります。JNI
のドキュメントJNI
はインターネット上でかなり完全であり、このテーマのようなこの主題に関する多くのチュートリアルが存在します。
ネイティブコードをJNIで簡単にラップしたい場合はSwig
、C /C++ネイティブヘッダーに基づいてJNIコードを自動的に生成できるようにするために使用できます。
取得したJNIコードは、Android NDKをダイナミックライブラリ(.so)として使用してコンパイルする必要があります。このライブラリは、アプリケーションパッケージの。の下に配置されますlibs/
。次に、呼び出し System.loadLibrary(path_to_you_dynamic_library)
てライブラリに含まれるすべてのシンボルをロードし、Javaで使用できます。
サードパーティのライブラリを使用する
JNIの使用方法を理解しているときに頭痛がするのが怖い場合は、このライブラリを見てください。このライブラリは大変な作業を行い、Javaでrawソケットを操作するためのAPIを提供します。
libpcap から必要な呼び出しとロジックを C または C++ でラップし、基になる関数を JNI (Java Native Interface) を介して公開して、アプリケーションが Java でネイティブ コードを呼び出せるようにする必要があります。
または、err、umm、jNetPcapなど、既に実行されているライブラリを取得する必要があります。
Android (または Linux カーネルを使用するその他のOS) でパケット キャプチャを実行しようとすると発生する可能性のある問題の 1 つは、デフォルトで、libpcap (ソケット) によって使用される基になるカーネル メカニズムに root 権限が必要なことです。コードをルートとして実行する方法、またはコードと場合によっては特権を与える方法があれば、それを機能させることができるかもしれません。PF_PACKET
CAP_NET_RAW
CAP_NET_ADMIN