Какой-нибудь способ обнаружить устройства Android в вашей сети?

Я хочу иметь возможность обнаруживать устройства Android в моей сети и, возможно, получать информацию об этих устройствах. Это очень легко с устройствами Apple, так как они используют службы Bonjour. Тем не менее, я не могу найти подобный сервис, работающий на Android.

Это должно работать без изменения устройства Android, установки какой-либо службы или открытия какого-либо порта. Он предназначен для работы с ванильными устройствами Android таким образом, чтобы Bonjour помог вам найти ванильные устройства Apple. Достаточно будет даже просто проверить, что устройство работает под управлением Android.


Выбранный ответ: Хотя это не самый лучший ответ (пока), пожалуйста, посмотрите на ответ Луиса. Как он упоминает, вы можете использовать поиск DNS (используя ваш локальный DNS-сервер) для обнаружения устройств Android. Я обнаружил, что это имеет 100% успеха, так как Android заставляет устройства использовать имя хоста android-_____. Это, по-видимому, трудно изменить на телефоне, даже если он рутирован. Поэтому я думаю, что это довольно точный метод. Спасибо, Луис!

Example:
$ nslookup 192.168.1.104 192.168.1.1
Server:     192.168.1.1
Address:    192.168.1.1#53

104.1.168.192.in-addr.arpa  name = android-711c129e251f14cf.\001.

Пример кода: Если вы хотите реализовать это на Java (например, для запуска на Android), вы не можете легко использовать getHostName(), потому что он использует внешние DNS-серверы. Например, вы хотите использовать локальный DNS-сервер на своем маршрутизаторе. Ниже Луис упоминает, что вы можете изменить DNS-серверы Wi-Fi-соединения, но это может привести к поломке. Вместо этого я нашел dnsjava библиотека, чтобы быть чрезвычайно полезным для отправки целевых DNS-запросов. Вот пример кода с использованием библиотеки:

        String ipAddress = "104.1.168.192";
        String dnsblDomain = "in-addr.arpa";
        Record[] records;
        Lookup lookup = new Lookup(ipAddress + "." + dnsblDomain, Type.PTR);
        SimpleResolver resolver = new SimpleResolver();
        resolver.setAddress(InetAddress.getByName("192.168.1.1"));
        lookup.setResolver(resolver);
        records = lookup.run();

        if(lookup.getResult() == Lookup.SUCCESSFUL) {
              for (int i = 0; i < records.length; i++) {
                if(records[i] instanceof PTRRecord) {
                  PTRRecord ptr = (PTRRecord) records[i];
                  System.out.println("DNS Record: " + records[0].rdataToString());
                }
              }
        } else {
            System.out.println("Failed lookup");
        }

    } catch(Exception e) { 
        System.out.println("Exception: " + e);
    }

Это дает мне вывод:

DNS Record: android-711c129e251f14cf.\001.

Бинго.

7 ответов

Решение

Существует очень простой подход, который дал мне положительные результаты в нескольких разных устройствах.

Когда устройство подключается к вашему маршрутизатору, оно получает IP (то есть DHCP) и регистрирует имя в DNS. Имя, которое зарегистрировано, кажется, всегда в форме android_nnnnnnnn,

Конечно, вы можете назвать любой компьютер с таким же подходом и обмануть проверку, что приведет к ложным срабатываниям...

Кроме того, я не могу гарантировать, что все поставщики устройств следуют одному и тому же подходу, но я обнаружил, что он корректно работает на нескольких устройствах разных брендов (включая разные уровни SDK), которые я тестировал.

--EDITED--

Как это сделать

Это зависит от того, где вы будете запускать код для обнаружения устройств Android. Предполагая, что вы будете запускать код на устройстве Android:

  1. Сначала найдите устройства, отвечающие на Ping в вашей сети. Вы можете использовать код в моем ответе на этот пост: execComd () для запуска команды ping.
  2. Получить имя отвечающего устройства, используя код:

    InetAddress inetAddress = InetAddress.getByName (string_with_ip_addr);

    String name = inetAddress.getCanonicalHostName ();

- EDIT 2--

Доказательство концепции

Метод, приведенный ниже, является просто идеалом для того, что я написал выше.

я использую isReachable() метод для генерации запроса ICMP, о котором говорится во многих публикациях, который работает только с корневыми устройствами, что относится к устройству, используемому для его тестирования. Тем не менее, я не давал root-права для приложения, выполняющего этот код, поэтому я считаю, что он не может установить бит SIUD, что является причиной, почему некоторые утверждают, что этот метод не работает. Я хотел бы получить от кого-то, кто тестирует его на некорневом устройстве.

Для звонка используйте:

ArrayList<String> hosts = scanSubNet("192.168.1.");

Возвращается в hostsсписок имен устройств, отвечающих на запрос ping.

private ArrayList<String> scanSubNet(String subnet){
    ArrayList<String> hosts = new ArrayList<String>();

    InetAddress inetAddress = null;
    for(int i=1; i<10; i++){
        Log.d(TAG, "Trying: " + subnet + String.valueOf(i));
        try {
            inetAddress = InetAddress.getByName(subnet + String.valueOf(i));
            if(inetAddress.isReachable(1000)){
                hosts.add(inetAddress.getHostName());
                Log.d(TAG, inetAddress.getHostName());
            }
        } catch (UnknownHostException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    return hosts;
}

С уважением.

Android не будет таким простым, как iOS. Бонжурного эквивалента не существует.

Android 4.0, Ice Cream Sandwich, представил Wi-Fi Direct Peer to Peer. Сначала я надеялся, что его можно будет отсканировать так, как вы думаете, но это помогает устройствам Android общаться без точки доступа, поэтому они на самом деле не "в вашей сети". Кроме того, ICS работает только на части устройств Android.

Вместо активного подхода netscan у вас остается пассивный подход к мониторингу. Если ваша сеть безопасна, прослушивание зашифрованного пакета возможно, но неудобно. Вам придется

  • переведите сетевой интерфейс в режим мониторинга
  • захватить рукопожатие с 4 путями
  • расшифровать его с помощью предварительного общего ключа сети
  • это даст вам ключ, необходимый для расшифровки трафика

Если вы хотите увидеть это в действии, Wireshark поддерживает дешифрование WPA.

Как только вы сможете просматривать трафик Wi-Fi, вы заметите, что устройства Android имеют тенденцию связываться с определенными серверами Google, и их HTTP-соединения имеют строки User Agent, которые можно идентифицировать. Это основа для работоспособного пассивного решения.

Компания Tenable Network Security предлагает продукты, которые, похоже, используют этот тип подхода.

Другая идея

@Michelle Cannon упомянула Meshlium Xtreme от Libelium, чей подход не поможет вам в этом (не без современных таблиц диапазонов MAC-адресов). Но это может быть частью достижения меньшей цели. Вы можете:

  • Обнаружить все беспроводные устройства
  • Удалите устройства Apple с помощью уникального организационного идентификатора MAC (OUI)
  • Скажите, что это мобильное устройство, отслеживая уровень сигнала, чтобы определить его движение (и мобильные устройства будут появляться и исчезать)
  • Вы можете быть в состоянии использовать MAC OUI в качестве подсказки, что это Android
  • Вы можете использовать MAC OUI как подсказку, что это не Android (но ноутбук или беспроводная карта и т. Д.).

Это может быть работоспособным, если вы хотите обнаружить устройства, которые, вероятно, Android.

Отпечатки DHCP

@Michelle Cannon предложила сделать дактилоскопию DHCP. Сначала я не был уверен, но должен поблагодарить его за то, что он предложил, как выглядит лучшая ставка для простого пассивного сканирования. В качестве предостерегающего хвоста я хотел бы объяснить, почему я опоздал на вечеринку.

Есть вещи, которые мы знаем, думаем, что не знаем, и вещи, которые мы думаем, что знаем, но не правы.

Во многих отношениях хорошо, что Android использует ядро ​​Linux. Но это не хорошо, если вы хотите обнаружить устройства Android в вашей сети. Стек TCP/IP для Android - это то, что для Linux устройства Android будут выглядеть как устройства Linux или, как я думал вначале. Но потом я понял, что в Linux много параметров конфигурации сборки, поэтому в Android может быть что-то особенное, если смотреть по сети, но что?

Снятие отпечатков DHCP использует точные параметры DHCP, запрошенные устройством, плюс время. Чтобы это работало, вам, как правило, нужна современная база данных отпечатков пальцев, с которой можно сравнивать. Сначала это выглядело так, словно фингербанк был заполнен этими данными, но потом я заметил, что их файлы не обновлялись почти год. Я не думаю, что со всеми различными типами устройств Android целесообразно хранить обновленные отпечатки пальцев для одного проекта.

Но затем я посмотрел на фактические подписи DHCP для Android, и я заметил это:

Android 1.0:     dhcpvendorcode=dhcpcd 4.0.0-beta9
Android 1.5-2.1: dhcpvendorcode=dhcpcd 4.0.1
Android 2.2:     dhcpvendorcode=dhcpcd 4.0.15
Android 3.0:     dhcpvendorcode=dhcpcd-5.2.10 

Linux обычно использует dhclient в качестве своего DHCP-клиента, но Android использует dhcpcd. Android имеет сильное предпочтение использовать программное обеспечение, лицензированное в стиле BSD, где это возможно, а dhcpcd использует лицензию BSD. Казалось бы, код dhcpvendorcode можно использовать как сильный индикатор того, что мобильное устройство работает под управлением Android.

Мониторинг DHCP

Клиент использует DHCP для получения IP-адреса при подключении к сети, поэтому он запускается без IP-адреса. Эта проблема решается путем использования широковещательных рассылок UDP для первоначального обмена. На Wi-Fi, даже с WPA, широковещательный трафик не шифруется. Таким образом, вы можете просто прослушивать UDP-порт 67 для трафика клиент-сервер и 68 для обратного. Вам даже не нужно переводить сетевой интерфейс в беспорядочный режим. Вы можете легко отслеживать этот трафик, используя анализатор протоколов, такой как Wireshark.

Я предпочел написать код для мониторинга трафика и решил использовать Python. Я выбрал pydhcplib для обработки деталей DHCP. Мой опыт работы с этой библиотекой не был гладким. Мне нужно было вручную загрузить и разместить файлы поддержки IN.py и TYPES.py. И их преобразование пакета в строку оставляло код dhcpvendor пустым. Он правильно проанализировал DHCP-пакеты, поэтому я просто написал свой собственный код для печати.

Вот код, который контролирует трафик DHCP от клиента к серверу:

#!/usr/bin/python
from pydhcplib.dhcp_packet import *
from pydhcplib.dhcp_network import *
from pydhcplib.dhcp_constants import *


netopt = {
    'client_listen_port':"68",
    'server_listen_port':"67",
    'listen_address':"0.0.0.0"
}

class Server(DhcpServer):
    def __init__(self, options):
        DhcpServer.__init__(
            self,options["listen_address"],
            options["client_listen_port"],
            options["server_listen_port"])

    def PrintOptions(self, packet, options=['vendor_class', 'host_name', 'chaddr']):

        # uncomment next line to print full details
        # print packet.str()

        for option in options:
            # chaddr is not really and option, it's in the fixed header
            if option == 'chaddr':
                begin = DhcpFields[option][0]
                end = begin+6
                opdata = packet.packet_data[begin:end]
                hex = ['0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f']
                print option+':', ':'.join([(hex[i/16]+hex[i%16]) for i in opdata])
            else:
                opdata = packet.options_data.get(option)
                if opdata:
                    print option+':', ''.join([chr(i) for i in opdata if i != 0])
        print

    def HandleDhcpDiscover(self, packet):
        print "DHCP DISCOVER"
        self.PrintOptions(packet)
    def HandleDhcpRequest(self, packet):
        print "DHCP REQUEST"
        self.PrintOptions(packet)

    ##  def HandleDhcpDecline(self, packet):
    ##      self.PrintOptions(packet)
    ##  def HandleDhcpRelease(self, packet):
    ##      self.PrintOptions(packet)
    ##  def HandleDhcpInform(self, packet):
    ##      self.PrintOptions(packet)


server = Server(netopt)

while True :
    server.GetNextDhcpPacket()

Этот код основан на примере сервера pydhcplib, потому что он слушает запросы клиентов, как сервер.

Когда подключается мой планшет Nexus 7 Android 4.2, эта интересная информация записывается (редактируется):

DHCP REQUEST
vendor_class: dhcpcd-5.5.6
host_name: android-5c1b97cdffffffff
chaddr: 10:bf:48:ff:ff:ff

DHCP DISCOVER
vendor_class: dhcpcd-5.5.6
host_name: android-5c1b97cdffffffff
chaddr: 10:bf:48:ff:ff:ff

Кажется, имя хоста имеет фиксированный формат и легко анализируется. Если вам нужен IP-адрес, вы можете отслеживать трафик с сервера на клиент. Примечание: транслируется только начальный обмен, когда новый клиент впервые появляется без IP-адреса. Будущие продления аренды и т. Д. Не транслируются.

Обратный поиск DNS

@Luis опубликовал отличное решение, которое демонстрирует, как проще, тем лучше. Даже после того, как DHCP-клиент Android установил имя_хоста на android-5c1b97cdffffffff, я не подумал спросить у маршрутизатора список имен с использованием обратного поиска DNS. Маршрутизатор добавляет имя_хоста к своему DNS-серверу, чтобы вы могли получить доступ к устройству при изменении его IP-адреса.

Ожидается, что имя_хоста останется в списке DNS в течение срока аренды DHCP. Вы можете проверить, если устройство все еще присутствует, проверяя его.

Один недостаток зависимости от имени_хоста состоит в том, что есть способы, которыми это можно изменить. Производителю устройства или оператору связи легко изменить имя хоста (хотя после поиска я не смог найти никаких доказательств, которые у них когда-либо были). Существуют приложения для изменения имени хоста, но они требуют root, так что это, в большинстве случаев, крайний случай.

Наконец, есть открытая проблема Android 6111: разрешить указание имени хоста, которое в настоящее время имеет 629 звездочек. Не удивительно, что когда-нибудь в будущем, возможно, скоро появится настраиваемое имя_хоста в настройках Android. Поэтому, если вы начнете использовать имя_хоста для идентификации устройств Android, осознайте, что его можно вырвать из-под себя.

Если вы выполняете отслеживание в реальном времени, еще одна потенциальная проблема с обратным просмотром DNS - вы должны решить, как часто сканировать. (Конечно, это не проблема, если вы делаете одноразовый снимок.) Частое сканирование потребляет сетевые ресурсы, а нечастое оставляет устаревшие данные. Вот как может помочь добавление мониторинга DHCP:

  • При запуске используйте Reverse DNS Lookup, чтобы найти устройства
  • Устройства Ping, чтобы увидеть, все ли они активны
  • Мониторинг трафика DHCP для мгновенного обнаружения новых устройств
  • Иногда перезапускайте DNS Lookup, чтобы найти устройства, которые вы могли пропустить
  • Если вам нужно заметить, что устройства уходят, пропингуйте устройства с желаемым разрешением

Хотя это нелегко (и не на 100% точно), есть несколько методов, которые позволяют обнаруживать устройства Android в вашей сети.

AFAIK, система Android не предоставляет никаких приложений / сервисов zeroconf для своего встроенного системного стека приложений / сервисов. Чтобы включить автообнаружение на фактическом устройстве, подключенном к локальной сети, вам нужно либо установить какое-либо стороннее приложение zeroconf, либо разработать собственное приложение / службу и установить его на фактическое устройство. Вот некоторые параметры API:

Я не совсем понимаю ваши требования: если вы хотите что-то подобное (например, автообнаружение и подключение) на устройствах Android vanilla, вы, вероятно, можете использовать Wi-Fi direct, который теперь доступен на некоторых более поздних устройствах под управлением Android 4.0, однако для этого требуется оба устройства поддерживают Wi-Fi Direct и создают только одноранговое P2P-соединение с отключенным Wi-Fi, как и Bluetooth-соединение с большей дальностью:

Информацию о поддержке Wi-Fi Direct API можно найти в официальном руководстве - Беспроводное подключение устройств.

Я смотрю на это мышление

http://www.libelium.com/smartphones_iphone_android_detection

обратите особое внимание на это

Нужно ли пользователям устанавливать конкретное приложение или как-то взаимодействовать, чтобы его можно было обнаружить?

Нет, сканирование выполняется бесшумно, Meshlium просто обнаруживает "кадры маяка", создаваемые радиомодулями Wifi и Bluetooth, встроенными в смартфоны. Пользователям просто нужно включить хотя бы один из двух беспроводных интерфейсов.

Давным-давно я использую приложение под названием stumbler на моем Mac для поиска сетей Wi-Fi, я думаю, что это похоже

Другие идеи

Хорошо, если мне нужно определить телефоны Android в локальной сети, как бы я это сделал. Отсутствие работающей службы DNS У меня есть только пара возможностей

SSID, если он транслируется - не может мне ничего сказать. IP-адрес - android позволяет вам иметь большой контроль над именами хостов, поэтому, я думаю, вы могли бы определить конкретный диапазон ip для ваших устройств Android. -не полезно.

В качестве альтернативы, скажем, я вижу неизвестное устройство в сети, если Bluetooth включен, то я передаю подпись устройства Bluetooth SDPP, которую я могу использовать для определения типа моего устройства.

Если у меня был сервис, который поддерживал android, и я хотел бы обнаружить конкретные устройства android в своей сети, то я мог бы просто зарегистрировать mac-адреса для этих устройств и наблюдать за ними в сети.

Кроме этого вам нужно будет запустить на устройстве или Bonjour (dns-sd), или upnpp dameon.

Я многому учусь на эту тему.

есть также что-то, называемое dhcp fingerprinting, очевидно, что разные устройства работают по-разному в зависимости от вида сетевого сканирования, который мы обсуждали, например, с использованием NMAP сканера linux. Карты поведения с этих зондов доступны в интернете.

http://www.enterasys.com/company/literature/device-profiling-sab.pdf

https://media.defcon.org/dc-19/presentations/Bilodeau/DEFCON-19-Bilodeau-FingerBank.pdf

http://community.arubanetworks.com/t5/ArubaOS-and-Mobility-Controllers/COTD-DHCP-Fingerprinting-how-to-ArubaOS-6-0-1-0-and-above/td-p/11164

http://myweb.cableone.net/xnih/

Обновленный ответ

Извините, я не правильно понял исходный вопрос. Только ваш комментарий дал мне понять, что вам не нужно устанавливать что-либо на целевые устройства, но вы просто хотите найти случайные телефоны в своей сети.

Я не уверен, что это действительно возможно так, как вы этого хотите. Без какой-либо службы обнаружения сети, работающей на Android, вы не найдете устройство на первом месте. Конечно, вы можете использовать некоторые низкоуровневые сетевые протоколы, но это только даст вам индикатор того, что есть что-то, а не то, чем оно является (быть устройством Android, ПК или чем-то еще).

Наиболее многообещающим подходом является проверка предустановленных приложений, которые имеют какую-либо сетевую функциональность. Например, на устройствах Samsung есть Kies Air (если пользователь его включает), Motorola использует UPnP для своего медиасервера, а у HTC тоже есть что-то свое, если я правильно помню. Тем не менее, нет приложений, которые установлены на всех устройствах Android всех производителей и операторов. Таким образом, вы не можете полагаться только на один из них, но для получения дополнительной информации об устройстве потребуется проверить различные сервисы, используя их конкретные протоколы и поведение. И, конечно же, пользователь должен был бы включить эту функцию, чтобы вы могли ее использовать.

Старый ответ

Дополнительной альтернативой списку yorkw является AllJoyn от Qualcomm. Это кроссплатформенный фреймворк с открытым исходным кодом и одноранговая коммуникация, который я уже использовал в прошлом.

Хотя Qualcomm является крупным спонсором AllJoyn, это не значит, что вам нужен чипсет Qualcomm в вашем определении. На самом деле AllJoyn работает на любом чипсете, включая Intel и nVidia. Он не требует рутованных телефонов или каких-либо других модификаций платформы Android и просто работает "из коробки", используя Wi-Fi и / или Bluetooth в качестве методов сопряжения.

Вот один лайнер, который пингует все машины в вашей сети (при условии, что ваша сеть 192.168.1.x) и делает обратный поиск по их именам:

for i in {1..255}; do echo ping -t 4 192.168.1.${i} ; done | parallel -j 0 --no-notice 2> /dev/null | awk '/ttl/ { print $4 }' | sort | uniq | sed 's/://' | xargs -n 1 host 

Требует параллельной работы GNU. Вы можете установить это на OSX, используя "brew install parallel"

Из этого вы можете просто посмотреть на устройства под названием android-c40a2b8027d663dd.home. или что угодно.

Затем вы можете попробовать запустить nmap -O на устройстве, чтобы увидеть, что еще вы можете выяснить:

sudo nmap -O android-297e7f9fccaa5b5f.home.

Но это не так уж и плодотворно.

Другие вопросы по тегам