#概要 AndroidNetMonitor は、Android デバイスからの詳細で大規模なパケット測定を受動的に監視、収集、分析するためのシステムであり、トラフィック ソースの実際のアプリケーション情報を取得し、携帯電話で送受信されるパケットの簡単な情報を収集するために使用されます。 (つまり、送信元 IP、送信元ポート、宛先 IP、宛先ポート、トランスポート層プロトコル)、ソケットに従って各メッセージがどのモバイル アプリに対応するかを記録します。これらのデータは、携帯電話の SD カード上のファイルに保存されます。
ファイルの各行に記録する必要がある情報には、各ネットワーク ソケットの 5 タプル情報 (つまり、送信元 IP、送信元ポート、宛先 IP、宛先ポート、およびトランスポート層プロトコル)、記録時間、アプリケーション名、および対応する情報が含まれます。イベント (ソケットの作成/破棄など)。
#テクノロジー 1. tcpdump と lsof を Android に適したバイナリに再コンパイルします (arm-linux-androideabi-g++)
2. アダプターを使用して Listview、CheckBox、List<Program (custom class)> をバインドします。
3. 同時に実行してソケットとパケットをキャプチャし、 lsof +c 0 -i -F ctPnf 2>&1
およびtcpdump -v -s -w pcap
コマンドを使用します。
4. /proc/net/tcp, tcp6,udp,udp6
ファイルを読み取って解析し、ソケット i ノードとアプリの pid を使用して、5 タプルとアプリケーション名の取得と対応を確立します。
#実装 (1) アプリの一覧を取得するには、PackageManager を使用してすべてのアプリケーションとデータを取得し、ActivityManager と PackagesInfo を使用して上記で取得したすべてのアプリ名と PID を取得し、リストビュー レイアウトを使用して表示します。
(2) Android で /proc/pid/fd ファイルを読み取って解析するには、runTime.exec(cmd) を使用します。Android では cmd コマンドを実行できるため、これを使用してコマンドの実行後に結果出力を取得できます。 /proc ディレクトリの読み取りと分析には root 権限が必要なため、Android では runTime.exec("su"); を使用して root 権限を抽出します。 次に、 ls -l /proc/(pid)/fd > /sdcard/fdres
を使用して情報を fdres ファイルに保存し、cat /sdcard/fdres を使用して情報を抽出します。これは妥協です。 取得した情報で、正規表現"socket:\S(\d+)\S"
を使用してソケットのすべての i ノード ラベルを抽出し、ArrayList に入れます。
(3) /proc/net/tcp、tcp6、udp、udp6 ファイルの読み取りと解析 (またはlsof +c 0 -i -F ctPnf 2>&1
コマンドを使用) PollData としての tcp、tcp6、udp、udp6 の抽象読み取りクラスでは、Java に付属する Scanner クラスを使用して、/proc/net/tcp などを分析して読み取ります。得られる出力は次のとおりです。
* sl local_address rem_address st tx_queue rx_queue tr tm->when retrnsmt uid ...
* 0: 0100007F:13AD 00000000:0000 0A 00000000:00000000 00:00000000 00000000 0 ...
* 1: 00000000:15B3 00000000:0000 0A 00000000:00000000 00:00000000 00000000 0 ...
* 2: 0F02000A:15B3 0202000A:CE8A 01 00000000:00000000 00:00000000 00000000 0 ...
*
次に、上記で取得したsocket_inodeを使用して、取得した情報の中から該当する特定の情報を探します。これを10進数に変換すると、次のようになります。
1.
2. 46: 010310AC:9C4C 030310AC:1770 01
3. | | | | | |--> connection state
4. | | | | |------> remote TCP port number
5. | | | |-------------> remote IPv4 address
6. | | |--------------------> local TCP port number
7. | |---------------------------> local IPv4 address
8. |----------------------------------> number of entry
9. 00000150:00000000 01:00000019 00000000
10. | | | | |--> number of unrecovered RTO timeouts
11. | | | |----------> number of jiffies until timer expires
12. | | |----------------> timer_active (see below)
13. | |----------------------> receive-queue
14. |-------------------------------> transmit-queue
15. 1000 0 54165785 4 cd1e6040 25 4 27 3 -1
16. | | | | | | | | | |--> slow start size threshold,
17. | | | | | | | | | or -1 if the threshold
18. | | | | | | | | | is >= 0xFFFF
19. | | | | | | | | |----> sending congestion window
20. | | | | | | | |-------> (ack.quick<<1)|ack.pingpong
21. | | | | | | |---------> Predicted tick of soft clock
22. | | | | | | (delayed ACK control data)
23. | | | | | |------------> retransmit timeout
24. | | | | |------------------> location of socket in memory
25. | | | |-----------------------> socket reference count
26. | | |-----------------------------> inode
27. | |----------------------------------> unanswered 0-window probes
28. |---------------------------------------------> uid
(4) クインタプルとアプリケーション名の取得と対応関係を確立する (2)と(3)で共有するソケットの inode とアプリの pid を使用して、クインタプルとアプリケーション名の取得と対応関係を確立します。取得した情報はデフォルトのディレクトリ /sdcard/Android/data/com.xx に保存されます。
"The application name is, pid is, and socket is:"
"number_of_entry "+fields[i+0] + "n";
"local_IPv4_address "+fields[i+1] + "n";
"local_IPv4_address "+hexconvert.hexa2decIpAndPort(fields[i+1]) + "n";
"remote_IPv4_address "+fields[i+2] + "n";
"remote_IPv4_address "+hexconvert.hexa2decIpAndPort(fields[i+2]) + "n";
"connection_state" + fields[i+3] + "n";
"transmit_receive_queue"+ fields[i+4]+ "n";
"timer_active"+fields[i+5]+ "n";
"number_of_unrecovered_RTO_timeouts:"+fields[i+6]+ "n";
"uid: "+fields[i+7]+ "n";
"unanswered_0-window_probes: "+fields[i+8]+ "n";
"inode : "+fields[i+9]+ "n";
"socket_reference_count: "+fields[i+10]+ "n";
"location_of_socket_in_memory: "+fields[i+11]+ "n";
"retransmit_timeout: "+fields[i+12]+ "n";
"predicted_tick_of_soft_clock: "+ fields[i+13]+ "n";
"ack"+ fields[i+14]+ "n";
"sending_congestion_window: "+ fields[i+15]+ "n";
"slowstart: "+ fields[i+16]+ "nn";
(5) サーバーにアップロードし、GT ProgramPython スクリプトを使用して解析します