名詞及協(xié)議
1.UDP
UDP是面向無連接的通訊協(xié)議组贺,UDP數(shù)據(jù)包括目的端口號(hào)和源端口號(hào)信息,由于通訊不需要連接祖娘,所以可以實(shí)現(xiàn)廣播發(fā)送失尖。
UDP通訊時(shí)不需要接收方確認(rèn),屬于不可靠的傳輸渐苏,可能會(huì)出現(xiàn)丟包現(xiàn)象掀潮,實(shí)際應(yīng)用中要求程序員編程驗(yàn)證。
UDP與TCP位于同一層琼富,但它不管數(shù)據(jù)包的順序仪吧、錯(cuò)誤或重發(fā)。因此公黑,UDP不被應(yīng)用于那些使用虛電路的面向連接的服務(wù)邑商,UDP主要用于那些面向查詢---應(yīng)答的服務(wù)摄咆,例如NFS凡蚜。相對(duì)于FTP或Telnet,這些服務(wù)需要交換的信息量較小吭从。使用UDP的服務(wù)包括NTP(網(wǎng)絡(luò)時(shí)間協(xié)議)和DNS(DNS也使用TCP)朝蜘。
欺騙UDP包比欺騙TCP包更容易,因?yàn)閁DP沒有建立初始化連接(也可以稱為握手)(因?yàn)樵趦蓚€(gè)系統(tǒng)間沒有虛電路)涩金,也就是說谱醇,與UDP相關(guān)的服務(wù)面臨著更大的危險(xiǎn)暇仲。
2.NETBIOS
NetBIOS是網(wǎng)絡(luò)的基本輸入輸出系統(tǒng)。
NetBIOS 定義了一種軟件接口以及在應(yīng)用程序和連接介質(zhì)之間提供通信接口的標(biāo)準(zhǔn)方法副渴。NetBIOS 是一種會(huì)話層協(xié)議奈附,應(yīng)用于各種 LAN (Ethernet、Token Ring 等)和 WAN 環(huán)境煮剧,諸如 TCP/IP斥滤、PPP 和 X.25 網(wǎng)絡(luò)。
NetBIOS 使得應(yīng)用程序無需了解包括差錯(cuò)恢復(fù)(會(huì)話模式)在內(nèi)的網(wǎng)絡(luò)細(xì)節(jié)勉盅。NetBIOS 請(qǐng)求以網(wǎng)絡(luò)控制塊(NCB:Network Control Block)的形式提供佑颇,NCB 中包含了信息存放位置和目標(biāo)名稱等信息。
NetBIOS 提供開放系統(tǒng)互聯(lián)(OSI)模型中的會(huì)話層和傳輸層服務(wù)草娜,但不支持標(biāo)準(zhǔn)幀或數(shù)據(jù)格式的傳輸挑胸。NetBIOS 擴(kuò)展用戶接口(NetBEUI)支持標(biāo)準(zhǔn)幀格式,它為 NetBIOS 提供網(wǎng)絡(luò)層和傳輸層服務(wù)支持宰闰。
NetBIOS 支持兩種通信模式:會(huì)話(session)或數(shù)據(jù)報(bào)(datagram)茬贵。會(huì)話模式是指兩臺(tái)計(jì)算機(jī)為“對(duì)話”建立一個(gè)連接,允許處理大量信息移袍,并支持差錯(cuò)監(jiān)測(cè)和恢復(fù)功能闷沥。數(shù)據(jù)報(bào)模式面向“無連接”(信息獨(dú)立發(fā)送)操作,發(fā)送的信息較小咐容,由應(yīng)用程序提供差錯(cuò)監(jiān)測(cè)和恢復(fù)功能舆逃。此外數(shù)據(jù)報(bào)模式也支持將信息廣播到局域網(wǎng)中的每臺(tái)計(jì)算機(jī)上。
3.ARP
地址解析協(xié)議戳粒,即ARP(Address Resolution Protocol)路狮,是根據(jù)IP地址獲取物理地址的一個(gè)TCP/IP協(xié)議。主機(jī)發(fā)送信息時(shí)將包含目標(biāo)IP地址的ARP請(qǐng)求廣播到網(wǎng)絡(luò)上的所有主機(jī)蔚约,并接收返回消息奄妨,以此確定目標(biāo)的物理地址;收到返回消息后將該IP地址和物理地址存入本機(jī)ARP緩存中并保留一定時(shí)間苹祟,下次請(qǐng)求時(shí)直接查詢ARP緩存以節(jié)約資源砸抛。地址解析協(xié)議是建立在網(wǎng)絡(luò)中各個(gè)主機(jī)互相信任的基礎(chǔ)上的,網(wǎng)絡(luò)上的主機(jī)可以自主發(fā)送ARP應(yīng)答消息树枫,其他主機(jī)收到應(yīng)答報(bào)文時(shí)不會(huì)檢測(cè)該報(bào)文的真實(shí)性就會(huì)將其記入本機(jī)ARP緩存直焙;由此攻擊者就可以向某一主機(jī)發(fā)送偽ARP應(yīng)答報(bào)文,使其發(fā)送的信息無法到達(dá)預(yù)期的主機(jī)或到達(dá)錯(cuò)誤的主機(jī)砂轻,這就構(gòu)成了一個(gè)ARP欺騙奔誓。ARP命令可用于查詢本機(jī)ARP緩存中IP地址和MAC地址的對(duì)應(yīng)關(guān)系、添加或刪除靜態(tài)對(duì)應(yīng)關(guān)系等搔涝。相關(guān)協(xié)議有RARP厨喂、代理ARP和措。NDP用于在IPv6中代替地址解析協(xié)議。
4.子網(wǎng)掩碼
子網(wǎng)掩碼(subnet mask)又叫網(wǎng)絡(luò)掩碼蜕煌、地址掩碼派阱、子網(wǎng)絡(luò)遮罩,它是一種用來指明一個(gè)IP地址的哪些位標(biāo)識(shí)的是主機(jī)所在的子網(wǎng)斜纪,以及哪些位標(biāo)識(shí)的是主機(jī)的位掩碼颁褂。子網(wǎng)掩碼不能單獨(dú)存在,它必須結(jié)合IP地址一起使用傀广。子網(wǎng)掩碼只有一個(gè)作用颁独,就是將某個(gè)IP地址劃分成網(wǎng)絡(luò)地址和主機(jī)地址兩部分。
子網(wǎng)掩碼是一個(gè)32位地址伪冰,用于屏蔽IP地址的一部分以區(qū)別網(wǎng)絡(luò)標(biāo)識(shí)和主機(jī)標(biāo)識(shí)誓酒,并說明該IP地址是在局域網(wǎng)上,不是在遠(yuǎn)程網(wǎng)上贮聂。
UDP 獲取 MAC 原理
1. ARP獲取 MAC
局域網(wǎng)中的設(shè)備互相通信是依靠 MAC 地址定向傳輸?shù)目扛蹋栽O(shè)備 A 要想給設(shè)備 B 發(fā)送數(shù)據(jù),需要先通過發(fā)送ARP命令來獲取B的MAC地址吓懈,并將B的MAC地址緩存在ARP緩存在列表中(有效時(shí)間為兩分鐘)歼冰,再將需要發(fā)送的數(shù)據(jù)進(jìn)行封包加上B設(shè)備的MAC地址等發(fā)送出去。即如果A設(shè)備想知道B設(shè)備的mac地址耻警,只需要通過B設(shè)備的 IP 發(fā)送ARP數(shù)據(jù)包解析返回?cái)?shù)據(jù)包就可以得到B設(shè)備的 IP 地址隔嫡。
綜上所述及根據(jù)實(shí)測(cè)情況,在android中獲取設(shè)備mac地址有三種方式:
- 由于并沒有對(duì)java層開放ARP接口甘穿,所以需要JNI來實(shí)現(xiàn)ARP發(fā)送和接受腮恩,根據(jù)收到的數(shù)據(jù)自行解析MAC地址
- 在java層對(duì)需要獲取mac地址的目標(biāo)設(shè)備發(fā)送廣播,促使系統(tǒng)發(fā)送ARP來查詢更新發(fā)起設(shè)備的ARP緩存温兼,然后讀取解析緩存列表獲取 MAC 地址秸滴。ARP緩存目錄
/proc/net/arp
- 通過NETBIOS服務(wù)獲取,這種方式需要目標(biāo)設(shè)備支持NETBIOS服務(wù), 根據(jù)返回值可以解析出目標(biāo)設(shè)備的 MAC募判、NETBISO信息荡含、計(jì)算機(jī)名等。測(cè)試發(fā)現(xiàn)android届垫、ios 系統(tǒng)普遍禁用了應(yīng)用監(jiān)聽NETBIOS服務(wù)端口释液,不能獲取到android、ios設(shè)備的 MAC 地址敦腔,只能獲取到電腦的 MAC 地址均澳。
子網(wǎng)段獲取
根據(jù)本機(jī)IP和子網(wǎng)掩碼或者子網(wǎng)掩碼位 可以計(jì)算確定該局域網(wǎng)的子網(wǎng)段
android獲取子網(wǎng)掩碼位
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;
}