是否可以获得wifi热点范围内的客户端设备的mac地址?
Posted
技术标签:
【中文标题】是否可以获得wifi热点范围内的客户端设备的mac地址?【英文标题】:Is it possible to get the mac address of client devices which are within wifi hotspot range? 【发布时间】:2017-09-14 04:20:10 【问题描述】:我想获取 Wifi 热点范围内的所有设备(打开了 wifi)的列表。但是,它可能会或可能不会连接到热点。 我正在使用this 库获取已连接设备的列表,但我不确定是否可以获得未连接到 wifi 热点且仅在其范围内的设备。如果有人能澄清它的可能性,那就太好了。谢谢。
【问题讨论】:
【参考方案1】:获取所有连接到Wi-Fi的设备列表并不难,例如ping
您网络中所有可能的主机,然后读取ARP缓存表以获取设备的mac地址。 Here 是一个应用程序。困难的部分是打开Wi-Fi的未连接设备,这在一般的android手机上几乎是不可能的(顺便说一句,带有适当无线适配器的Linux最适合做这样的事情)但也有一些例外,理论上是你的手机将继续发送探测请求(active scanning),其中包含 BSSID、SSID(指定已知网络,如果有)和您手机的 MAC 地址以更新可用的 WiFi 列表以供以后连接,例如,下面是我捕获的探测请求数据包:
Frame 15: 290 bytes on wire (2320 bits), 290 bytes captured (2320 bits)
Radiotap Header v0, Length 25
802.11 radio information
IEEE 802.11 Beacon frame, Flags: ........C
Type/Subtype: Beacon frame (0x0008)
Frame Control Field: 0x8000
.000 0000 0000 0000 = Duration: 0 microseconds
Receiver address: ff:ff:ff:ff:ff:ff
Destination address: ff:ff:ff:ff:ff:ff
Transmitter address: f4:6a:92:23:30:c0
Source address: f4:ff:92:23:30:c0
BSS Id: f4:fa:92:23:30:c0
.... .... .... 0000 = Fragment number: 0
1010 0011 1101 .... = Sequence number: 2621
Frame check sequence: 0x7037cad2 [correct]
[FCS Status: Good]
IEEE 802.11 wireless LAN management frame
Fixed parameters (12 bytes)
Tagged parameters (225 bytes)
Tag: SSID parameter set: someSSID
Tag: Supported Rates 1(B), 2(B), 5.5(B), 11(B), 6, 9, 12, 18, [Mbit/sec]
Tag: DS Parameter set: Current Channel: 11
Tag: Traffic Indication Map (TIM): DTIM 0 of 0 bitmap
Tag: ERP Information
Tag: Extended Supported Rates 24, 36, 48, 54, [Mbit/sec]
Tag: HT Capabilities (802.11n D1.10)
Tag: HT Information (802.11n D1.10)
Tag: RSN Information
Tag: Vendor Specific: 00:50:f2: WPA Information Element
Tag: Vendor Specific: 00:50:f2: WMM/WME: Parameter Element
Tag: Vendor Specific: 00:0a:eb
Tag: Vendor Specific: 00:50:f2: WPS
要捕获这些数据包,您的 WiFi 适配器需要支持monitor mode,这在 Android 上很少见,但并非没有,请参阅此project 以了解支持的设备以及如何使用。请注意,为了应对这些隐私侵犯,一些操作系统(Andord 6+、ios 8+ AFAIK)已经实现了 MAC 地址随机化的不同变体。
【讨论】:
【参考方案2】:是的,可以列出 WiFi AP 范围内的 WiFi 设备。我不确定我们如何在 Android 中做到这一点,但您可以查看 Aircrack-ng 应用程序。您可以列出所有附近的设备,因为每个无线设备都会搜索它们已经连接的 AP,并且当时它们正在提供它们的 MAC 地址(可能是)。看看 Aircrack-ng 的 github account 会对你有所帮助。
【讨论】:
【参考方案3】:WifiManager wifiManager=(WifiManager)getSystemService(Context.WIFI_SERVIE); WifiInfo wInfo = wifiManager.getConnectionInfo();
字符串 macAddress = wInfo.getMacAddress();
【讨论】:
还添加这是可能的。你可以检查 https://github.com/rorist/android-network-discovery
【讨论】:
感谢您的回答!这个库几乎没有文档记录,请您告诉如何将这个库集成到项目中以及如何使用它的一些示例代码将非常有帮助。 这个库看起来像是一个旧的 Eclipse 项目。您可以将其升级到 maven/gradle 配置并创建一个 aar。请记住,如果项目太旧,它可能无法正常工作。 使用上面的库是不可能的。【参考方案5】:不,这是不可能的,查看未连接设备的唯一方法是进入盒子的管理面板(您只会看到以前连接的设备)。因此,如果您不是该框的管理员,您将无法看到它们。
此外,我建议您查看nmap tool 以发现网络的所有客户端。您在 Android 上也有 Fing,这是一个非常好的工具。
【讨论】:
抱歉,我想要一个基于 android 的程序化解决方案。 好吧,看起来您已经有一个可用于连接客户端的工作库...所以很抱歉告诉您,Android 手机无法实现您想要做的事情,请采取看看这个帖子:serverfault.com/questions/482825/… 你问是否可以检测到未连接的设备,我回答你没有。你不必仅仅因为你想要一个“是”就投反对票;) 我很高兴知道答案是“是”,但正确的“否”答案不能迫使我投反对票。其他人反对它:) 不幸的是,它不是这样工作的,它是单向的!查看en.wikipedia.org/wiki/Beacon_frame了解更多信息【参考方案6】:请试试这个。
WifiManager wm = (WifiManager) getSystemService(Context.WIFI_SERVICE);
wm.startScan();
List<ScanResult> scanResult = wm.getScanResults();
for (ScanResult result : scanResult)
System.out.println("Access Point MacAddr:" + result.BSSID);
【讨论】:
请正确阅读问题。它说获取热点范围内的设备列表而不是范围内的可用wifi列表。以上是关于是否可以获得wifi热点范围内的客户端设备的mac地址?的主要内容,如果未能解决你的问题,请参考以下文章
是否可以通过 iOS/Android 上的应用程序控制 WiFi/热点/BT 功能