名词及协议
1.UDP
UDP是面向无连接的通讯协议,UDP数据包括目的端口号和源端口号信息,由于通讯不需要连接,所以可以实现广播发送。
UDP通讯时不需要接收方确认,属于不可靠的传输,可能会出现丢包现象,实际应用中要求程序员编程验证。
UDP与TCP位于同一层,但它不管数据包的顺序、错误或重发。因此,UDP不被应用于那些使用虚电路的面向连接的服务,UDP主要用于那些面向查询---应答的服务,例如NFS。相对于FTP或Telnet,这些服务需要交换的信息量较小。使用UDP的服务包括NTP(网络时间协议)和DNS(DNS也使用TCP)。
欺骗UDP包比欺骗TCP包更容易,因为UDP没有建立初始化连接(也可以称为握手)(因为在两个系统间没有虚电路),也就是说,与UDP相关的服务面临着更大的危险。
2.NETBIOS
NetBIOS是网络的基本输入输出系统。
NetBIOS 定义了一种软件接口以及在应用程序和连接介质之间提供通信接口的标准方法。NetBIOS 是一种会话层协议,应用于各种 LAN (Ethernet、Token Ring 等)和 WAN 环境,诸如 TCP/IP、PPP 和 X.25 网络。
NetBIOS 使得应用程序无需了解包括差错恢复(会话模式)在内的网络细节。NetBIOS 请求以网络控制块(NCB:Network Control Block)的形式提供,NCB 中包含了信息存放位置和目标名称等信息。
NetBIOS 提供开放系统互联(OSI)模型中的会话层和传输层服务,但不支持标准帧或数据格式的传输。NetBIOS 扩展用户接口(NetBEUI)支持标准帧格式,它为 NetBIOS 提供网络层和传输层服务支持。
NetBIOS 支持两种通信模式:会话(session)或数据报(datagram)。会话模式是指两台计算机为“对话”建立一个连接,允许处理大量信息,并支持差错监测和恢复功能。数据报模式面向“无连接”(信息独立发送)操作,发送的信息较小,由应用程序提供差错监测和恢复功能。此外数据报模式也支持将信息广播到局域网中的每台计算机上。
3.ARP
地址解析协议,即ARP(Address Resolution Protocol),是根据IP地址获取物理地址的一个TCP/IP协议。主机发送信息时将包含目标IP地址的ARP请求广播到网络上的所有主机,并接收返回消息,以此确定目标的物理地址;收到返回消息后将该IP地址和物理地址存入本机ARP缓存中并保留一定时间,下次请求时直接查询ARP缓存以节约资源。地址解析协议是建立在网络中各个主机互相信任的基础上的,网络上的主机可以自主发送ARP应答消息,其他主机收到应答报文时不会检测该报文的真实性就会将其记入本机ARP缓存;由此攻击者就可以向某一主机发送伪ARP应答报文,使其发送的信息无法到达预期的主机或到达错误的主机,这就构成了一个ARP欺骗。ARP命令可用于查询本机ARP缓存中IP地址和MAC地址的对应关系、添加或删除静态对应关系等。相关协议有RARP、代理ARP。NDP用于在IPv6中代替地址解析协议。
4.子网掩码
子网掩码(subnet mask)又叫网络掩码、地址掩码、子网络遮罩,它是一种用来指明一个IP地址的哪些位标识的是主机所在的子网,以及哪些位标识的是主机的位掩码。子网掩码不能单独存在,它必须结合IP地址一起使用。子网掩码只有一个作用,就是将某个IP地址划分成网络地址和主机地址两部分。
子网掩码是一个32位地址,用于屏蔽IP地址的一部分以区别网络标识和主机标识,并说明该IP地址是在局域网上,不是在远程网上。
UDP 获取 MAC 原理
1. ARP获取 MAC
局域网中的设备互相通信是依靠 MAC 地址定向传输的,所以设备 A 要想给设备 B 发送数据,需要先通过发送ARP命令来获取B的MAC地址,并将B的MAC地址缓存在ARP缓存在列表中(有效时间为两分钟),再将需要发送的数据进行封包加上B设备的MAC地址等发送出去。即如果A设备想知道B设备的mac地址,只需要通过B设备的 IP 发送ARP数据包解析返回数据包就可以得到B设备的 IP 地址。
综上所述及根据实测情况,在android中获取设备mac地址有三种方式:
- 由于并没有对java层开放ARP接口,所以需要JNI来实现ARP发送和接受,根据收到的数据自行解析MAC地址
- 在java层对需要获取mac地址的目标设备发送广播,促使系统发送ARP来查询更新发起设备的ARP缓存,然后读取解析缓存列表获取 MAC 地址。ARP缓存目录
/proc/net/arp
- 通过NETBIOS服务获取,这种方式需要目标设备支持NETBIOS服务, 根据返回值可以解析出目标设备的 MAC、NETBISO信息、计算机名等。测试发现android、ios 系统普遍禁用了应用监听NETBIOS服务端口,不能获取到android、ios设备的 MAC 地址,只能获取到电脑的 MAC 地址。
子网段获取
根据本机IP和子网掩码或者子网掩码位 可以计算确定该局域网的子网段
android获取子网掩码位
private static final int BUF = 8 * 1024;
private static final String CMD_IP = " -f inet addr show %s";
private static final String PTN_IP1 = "\\s*inet [0-9\\.]+\\/([0-9]+) brd [0-9\\.]+ scope global %s$";
private static final String PTN_IP2 = "\\s*inet [0-9\\.]+ peer [0-9\\.]+\\/([0-9]+) scope global %s$";
private static final String PTN_IF = "^%s: ip [0-9\\.]+ mask ([0-9\\.]+) flags.*";
private static String intf = "eth0";
public static int getIpmask() {
int mask = 24;
String match;
try {
if ((match = runCommand("/system/xbin/ip", String.format(CMD_IP, intf), String.format(PTN_IP1, intf))) != null) {
mask = Integer.parseInt(match);
} else if ((match = runCommand("/system/xbin/ip", String.format(CMD_IP, intf), String.format(PTN_IP2, intf))) != null) {
mask = Integer.parseInt(match);
} else if ((match = runCommand("/system/bin/ifconfig", " " + intf, String.format(PTN_IF, intf))) != null) {
double sum = -2;
String[] part = match.split("\\.");
for (String p : part) {
sum += 256D - Double.parseDouble(p);
}
mask = 32 - (int) (Math.log(sum) / Math.log(2d));
}
} catch (NumberFormatException e) {
e.printStackTrace();
}
return mask;
}
网友评论