Android: программно определить список приложений с открытым TCP-соединением - PullRequest
3 голосов
/ 09 июля 2011

Хотелось бы узнать, какие приложения на моем андроиде подключаются к каким IP-адресам.По сути, я хотел бы знать, что эти приложения делают в фоновом режиме, без моего разрешения.

Я попытался вызвать ОС netstat в моем приложении для мониторинга, которое уже дает мне открытые соединения и подключенные IP-адреса, ноэто не имя процесса, pid или uid, которые позволили бы мне сопоставить соединение с конкретным приложением.«netstat -p», по-видимому, не предоставляет информацию о процессе.

Ответы [ 4 ]

8 голосов
/ 10 июля 2011

Если вы читаете исходный код для 'netstat', он на самом деле считывает данные из / proc / net / tcp, который содержит дамп таблицы сокетов TCP, эти данные будут выглядеть ниже.

sl  local_address rem_address   st tx_queue rx_queue tr tm->when retrnsmt   uid  timeout inode
 0: 0100007F:13AD 00000000:0000 0A 00000000:00000000 00:00000000 00000000     0        0 517 1 cbf19b40 300 0 0 2 -1

youобнаружит, что в каждом соединении есть идентификатор пользователя, поскольку ОС Android запускает каждое приложение с учетной записью пользователя, что означает наличие уникального идентификатора пользователя, это поможет сопоставить каждое соединение с одним процессом.

Надеюсь, эта информация поможет.

2 голосов
/ 06 ноября 2014

На некоторых android 4.x я видел подлинные соединения IPv4 с адресами IPv4-mapped-IPv6 в / proc / net / tcp6 вместо простого v4, например:

    sl  local_address                         remote_address                        st tx_queue rx_queue tr tm->when retrnsmt   uid  timeout inode
   0: 0000000000000000FFFF00000100007F:99FC 00000000000000000000000000000000:0000 0A 00000000:00000000 00:00000000 00000000 10071        0 32037 1 00000000 300 0 0 2 -1
   1: 0000000000000000FFFF00005EE9A8C0:9BB0 0000000000000000FFFF000007E6AB45:01BB 08 00000000:00000001 00:00000000 00000000 10071        0 32270 1 00000000 22 4 6 6 -1

Так чтоКажется, вам также следует проверить udp6 / tcp6.

1 голос
/ 14 июля 2011

Я думаю, что есть две возможные причины.

  1. Это происходит из-за проблем с разрешениями, поскольку в некоторых версиях дистрибутива Android более ограничены параметры разрешений, вам следует попробовать прочитать данные из / proc /% pid% / net / tcp (% pid% замените на PID для вашего приложение).

  2. система работает на IPv6, вам нужно проверить «/ proc /% pid% / net / tcp6» вместо «/ proc /% pid% / net / tcp», его ip нужно будет конвертировать от IPv6 к IPv4.

0 голосов
/ 02 августа 2013

Используйте команду busybox для получения информации о процессе

busybox netstat -tp
...