如何检测同一网络内主机的操作系统(含Android客户端实现)
Android客户端环境下的可行方案
你已经通过ARP表拿到了IP、MAC、厂商和主机名,这能帮你缩小范围,结合下面这些方法就能实现OS检测:
- 轻量TCP指纹探测(注意权限):在Android上做简化版的TCP指纹识别。可以试着给目标的常见端口(80、443、22)发SYN包,抓响应的TCP头部信息(TTL、窗口大小),再和预定义的OS特征库匹配。不过要注意:非root的Android没法直接发原始TCP包,你可以用Java的
Socket建连接,通过getInputStream()拿间接的响应特征,或者用封装好的第三方网络库简化操作。 - ICMP TTL初步判断:用ICMP echo请求的TTL值做初步筛选。比如响应TTL接近128的大概率是Windows,接近64的可能是Linux/macOS。Android上可以用
InetAddress.isReachable()方法,但这个方法拿不到TTL,要精准获取可能需要root权限,或者用native代码实现ICMP包的收发解析。 - 结合已有信息辅助推断:
- 主机名:带
DESKTOP-前缀的基本是Windows设备,MacBook-或iMac-前缀的是苹果设备; - MAC厂商:比如苹果的MAC前缀(像
00:16:CB、00:24:9B)对应iOS/macOS,微软的前缀对应Windows设备,用厂商信息缩小范围后,再结合探测结果准确性更高。
- 主机名:带
- mDNS/NetBIOS服务探测:
- mDNS:苹果设备和部分Linux默认开mDNS服务,你在Android上用
MulticastSocket发mDNS查询包,收到响应的话大概率是苹果或开了mDNS的Linux设备; - NetBIOS:Windows默认开NetBIOS服务,发NetBIOS名称查询包,收到响应就能判定是Windows系统。这俩方法都不需要root,只要申请
CHANGE_WIFI_MULTICAST_STATE和INTERNET权限就行。
- mDNS:苹果设备和部分Linux默认开mDNS服务,你在Android上用
内容的提问来源于stack exchange,提问作者vbp
相关产品推荐
相关产品推荐

