Подтвердить что ты не робот

Любой способ обнаружить устройства 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-серверы Wifi-соединения, но это может привести к нарушению других вещей. Вместо этого я нашел библиотеку 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.

Бинго.

4b9b3361

Ответ 1

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

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

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

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

- EDITED -

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

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

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

    InetAddress inetAddress = InetAddress.getByName(string_with_ip_addr);

    Строковое имя = inetAddress.getCanonicalHostName();

- ИЗМЕНИТЬ 2 -

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

Метод ниже - это просто понятие концепции для того, что я написал выше.

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

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

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;
}

С уважением.

Ответ 2

Android не будет таким простым, как iOS. Нет эквивалента Bonjour.

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

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

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

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

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

Другая идея

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

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

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

Фингерпринт DHCP

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

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

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

Отпечаток пальца DHCP использует точные параметры DHCP, запрошенные устройством, и время. Для этого вам обычно нужна современная база данных отпечатков пальцев, чтобы соответствовать. Сначала это выглядело как fingerbank, заставляя его искать эти данные, но потом я заметил, что их файлы не обновлялись почти год. Со всеми различными типами устройств 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 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 опубликовала отличное решение, которое демонстрирует, насколько проще. Даже после того, как клиент Android DHCP установил имя хоста для android-5c1b97cdffffffff, я не думал, чтобы спросить маршрутизатор для его списка имен, используя обратные DNS-запросы. Маршрутизатор добавляет на сервер DNS-сервер имя хоста, чтобы вы могли получить доступ к устройству, если его IP-адрес изменился.

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

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

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

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

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

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

Ответ 3

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

  • JmDNS (для протокола Apple bonjour)
  • Cling (для протокола Microsoft UPnP)
  • Android NSD API (представленный с Android 4.1)

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

enter image description here

Для поддержки API Wi-Fi Direct API ознакомьтесь с официальным руководством - Подключение устройств Wirelessless.

Ответ 4

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

http://www.libelium.com/smartphones_iphone_android_detection

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

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

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

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

Другие идеи

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

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

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

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

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

Ответ 5

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

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

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

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

Старый ответ

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

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

Ответ 6

Я многому учусь из этой темы.

существует также что-то, называемое отпечатком dhcp, по-видимому, разные устройства действуют по-разному с тем сетевым сканированием, которое мы обсуждали, например с использованием 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/

Ответ 7

Здесь один лайнер, который загружает все компьютеры в вашей сети (при условии, что ваша сеть 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 установить параллель"

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

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

sudo nmap -O android-297e7f9fccaa5b5f.home.

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