любой способ обнаружить устройства Android в вашей сети?
Я хочу иметь возможность обнаруживать устройства Android в своей сети и, возможно, получить некоторую информацию об устройстве о них. Это очень легко с устройствами Apple, так как они запускают услуги Bonjour. Тем не менее, я не могу найти аналогичную службу, работающую на Android.
это должно работать без изменения устройства Android, установки какой-либо службы или открытия какого-либо порта. Он предназначен для работы с устройствами vanilla Android таким образом, что Bonjour поможет вам найти vanilla 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.1.
Пример Кода: если вы хотите реализовать это на 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.1.
Бинго.
7 ответов
есть очень простой подход, который дал мне положительные результаты в нескольких различных устройств.
когда устройство подключается к маршрутизатору, оно получает IP (т. е. DHCP) и регистрирует имя в DNS. Имя, которое зарегистрировано, кажется, всегда находится в форме android_nnnnnnnn
.
конечно, вы можете назвать любой компьютер с тем же подходом и обмануть проверку, что приводит к ложным срабатываниям ...
кроме того, я не могу гарантировать, что все поставщики устройства такими же подход, но я обнаружил, что он работает правильно на нескольких устройствах разных брендов (включая разные уровни SDK), которые я тестировал.
--редактировать--
как это делается
это зависит от того, где вы будете запускать код для обнаружения устройств android. Предполагая, что вы будете запускать код на устройстве Android:
- Сначала откройте устройства, реагирующие на
Ping
в вашей сети. Вы можете использовать код в мой ответ на этот пост: execComd() для выполнения команды ping. -
получить имя ответивших устройств с помощью кода:
InetAddress inetAddress = InetAddress.getByName (string_with_ip_addr);
имя строки = inetAddress.getCanonicalHostName ();
--EDIT 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;
}
С уважением.
Android не будет так же просто, как iOS. Нет Бонжур эквивалент.
Android 4.0, сэндвич с мороженым, представлен Wi-Fi Direct одноранговая сеть. Сначала я надеялся, что он может быть отсканирован так, как вы думаете, но это помогает устройствам Android общаться без точки доступа, поэтому они на самом деле не "в вашей сети". Кроме того, ICS работает только на части устройств Android.
вместо активного подхода netscan, вы остаетесь с пассивным подходом к мониторингу. Если ваша сеть безопасна, обнюхивание зашифрованного пакета возможно, но неудобно. Вам придется
- поместите свой сетевой интерфейс в режим монитора
- захват 4-этапное рукопожатие
- расшифровать его с помощью сети общий ключ
- это даст вам ключ, необходимый для расшифровки трафика
Если вы хотите увидеть это в действие,Wireshark поддерживает расшифровка WPA.
как только вы сможете просматривать трафик Wi-Fi, вы заметите, что устройства Android, как правило, общаются с определенными серверами Google, и их HTTP-соединения имеют строки агента пользователя, которые могут быть идентифицированы. Это основа для работоспособного пассивного решения.
Tenable Сетевой Безопасности продукты предложения которые кажутся, что принимают этот тип подход.
Еще Одна Идея
@Michelle Cannon упомянул о Libelium Meshlium Xtreme, чей подход не приведет вас туда (не без хороших таблиц диапазона 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 fingerprinting использует точные параметры 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 файлы поддержки. И их преобразование пакета в строку оставляло dhcpvendorcode пустым. Он правильно проанализировал пакеты 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 tablet подключается, эта интересная информация захватывается (отредактировано):
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 устанавливал host_name на android-5c1b97cdffffffff, я не думал спрашивать у маршрутизатора список имен, используя обратные DNS-запросы. Маршрутизатор добавляет имя хоста к DNS-серверу, чтобы вы могли получить доступ к устройству, если его IP-адрес изменится.
имя хоста, как ожидается, останется в списке DNS в течение срока аренды DHCP. Вы можете проверить, присутствует ли устройство по-прежнему пинг его.
один недостаток в зависимости от host_name есть способы изменить это. Для производителя устройства или носителя легко изменить имя хоста (хотя после поиска я не смог найти никаких доказательств, которые у них когда-либо были). Есть приложения для изменения имени хоста, но они требуют root, так что это, самое большее, крайний случай.
наконец-то есть открытое Android Issue 6111: разрешить имя хоста для указания в настоящее время имеет 629 звезд. Неудивительно, что настраиваемое имя хоста в настройках Android в какой-то момент в будущем, возможно, в ближайшее время. Поэтому, если вы начнете в зависимости от имени хоста идентифицировать устройства Android, поймите, что его можно выдернуть из-под вас.
Если вы делаете живое отслеживание, еще одна потенциальная проблема с обратным поиском DNS-это то, как часто нужно сканировать. (Конечно, это не проблема, если вы просто разовый снимок.) Частое сканирование потребляет сетевые ресурсы, нечасто оставляет вас с несвежим данные. Вот как добавление мониторинга DHCP может помочь:
- при запуске используйте обратный поиск DNS для поиска устройств
- Ping устройств, чтобы увидеть, если они все еще активны
- Мониторинг трафика DHCP для обнаружения новых устройств мгновенно
- иногда повторите поиск DNS, чтобы найти устройства, которые вы могли пропустить
- Если вам нужно заметить, что устройства уходят, ping устройства с желаемым разрешением синхронизации
пока это не легко (ни 100% точный), есть несколько методов, которые делают это возможно для обнаружения устройств Android в вашей сети.
AFAIK, система Android не предоставляет никаких zeroconf app / service на встроенном системном стеке app/service. Чтобы включить автоматическое обнаружение на фактическом устройстве, подключенном к локальной сети, вам нужно либо установить стороннее приложение zeroconf, либо разработать собственное приложение / службу и установить его на фактическое устройство, некоторые параметры API:
- JmDNS (для протокола bonjour от Apple)
- прицепиться (для UPnP корпорации Майкрософт протокол)
- Android NSD API (введено с Android 4.1)
Я не совсем понимаю ваши требования, если вы хотите что-то подобное (т. е. автоматическое обнаружение и подключение) на устройствах vanilla Android, вы, вероятно, можете использовать 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, чтобы найти сети wifi, Я думаю, что это похоже
другие идеи
Ну, если мне нужно определить телефоны android в локальной сети, как бы я это сделал. Отсутствие службы dns, работающей у меня есть только пара возможностей
SSID, если он транслируется - не могу сказать мне ничего ip-адрес-android позволяет вам иметь большой контроль над Хостом именование, поэтому я думаю, вы можете определить определенный диапазон ip для ваших устройств android. - не для пользы.
альтернативно позволяет сказать, что я вижу неизвестное устройство в сети, если bluetooth включен, то я транслирую подпись устройства bluetooth SDPP, которую я могу использовать для вывода типа моего устройства.
Если бы я запускал службу, поддерживающую android, и я хотел бы обнаружить определенные устройства android в своей сети, то я мог бы просто зарегистрировать mac-адреса для этих устройств и следите за ними по сети.
кроме этого вам нужно будет запустить bonjour (dns-sd) или upnpp dameon на устройстве.
Обновленный Ответ
Извините, я не правильно понял исходный вопрос. Только ваш комментарий дал мне понять, что вы не хотите устанавливать что-нибудь на целевых устройствах, но вы просто хотите способ обнаружения случайных телефонов в сети.
Я не уверен, что это действительно возможно так, как вы этого хотите. Без наличия службы обнаружения сети, работающей на Android, вы не найдете устройство на первом месте. Конечно, вы можете использовать некоторые низкоуровневые сетевые протоколы, но это даст вам только индикатор того, что есть что-то, но не то, что это (будучи Android-устройством, ПК, все остальное).
наиболее перспективным подходом было бы проверить предустановленные приложения, которые имеют какую-либо сетевую функциональность. Например. Устройства Samsung имеют Kies Air (если пользователь включает его), Motorola использует UPnP для своего медиа-сервера, а у HTC есть что-то свое, если я правильно помню. Тем не менее, нет приложения, которое установлено на всех устройствах Android всех поставщиков и перевозчиков. Таким образом, вы не можете полагаться только на один из них, но вам нужно будет проверить различные службы, используя их конкретные протоколы и поведение, чтобы получить дополнительную информацию об устройстве. И, конечно же, пользователь должен будет включить функциональность, чтобы вы могли ее использовать.
старый ответ
дополнительная альтернатива список yorkw составляет AllJoyn от Qualcomm. Это кросс-платформенное обнаружение с открытым исходным кодом и одноранговая коммуникационная структура, которую я уже использовал в прошлом.
хотя Qualcomm является большим спонсором AllJoyn, это не означает, что вам нужен чипсет Qualcomm в вашем определении. На самом деле AllJoyn работает на любом чипсете, включая Intel и nVidia. Он не требует корневых телефонов или каких-либо других изменений в рамках Android и просто работает "из коробки", используя Wi-Fi и/или Bluetooth в качестве методов сопряжения.
Я многому учусь из этой темы.
существует также что-то, называемое DHCP-отпечатками пальцев, по-видимому, разные устройства действуют по-разному на тип сетевых сканирований, которые мы обсуждали, например, с помощью Nmap Linux scanner. Карты поведения этих зондов доступны на интернет.
http://www.enterasys.com/company/literature/device-profiling-sab.pdf
https://media.defcon.org/dc-19/presentations/Bilodeau/DEFCON-19-Bilodeau-FingerBank.pdf
вот один лайнер, который пингует все машины в сети (если в сети 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 }' | sort | uniq | sed 's/://' | xargs -n 1 host
требует параллельной работы GNU. Вы можете установить это на OSX, используя "brew install parallel"
из этого вы можете просто посмотреть на устройства с именем android-c40a2b8027d663dd.home.
или что-то еще.
затем вы можете попробовать запустить nmap-O на устройстве, чтобы узнать, что еще вы можете выяснить:
sudo nmap -O android-297e7f9fccaa5b5f.home.
но это не настолько плодотворно.