arp協議(全稱:addressresolutionprotocol,中文名稱:位址解析協議)是乙個通過解析網路層位址來找尋資料鏈路層位址的網路傳輸協議(通過 ip 位址找到 mac位址)。
arp 協議作為乙個重要的定址協議,只要是執行在乙太網上的主機,都必定不會遮蔽它,因此 arp 是乙個掃瞄區域網行之有效的辦法,它比 ping掃瞄效率更高,結果更準確。
###[ ethernet ]###
dst= e4:d3:
32:d2:
3b:cc
src= b8:
08:cf:b4:ba:e5
type
= arp
###[ arp ]###
hwtype=
0x1 ptype= ipv4
hwlen=
none
plen=
none
op= who-has
hwsrc= b8:
08:cf:b4:ba:e5 # 源mac位址
psrc=
192.168
.0.109
# 源ip位址
hwdst=00:
00:00:
00:00:
00# 目的mac位址
pdst=
0.0.0
.0# 目的ip位址
**注意:**由於windows和linux對於程序的管理方式不同,因此該程式不能在windows系統上執行,否則會出現記憶體溢位的狀況!
import ipaddress
import logging
import time
from multiprocessing import queue, process
from scapy.layers.l2 import ether, arp
from scapy.sendrecv import srp
logging.getlogger(
"scapy.runtime"
).setlevel(logging.error)
defscapy_arp_requests
(host, queue=
none
, ifname=
"eth0"):
""" 構造arp包進行掃瞄
:param host: 需要掃瞄的主機
:param queue: 儲存資料的佇列
:param ifname: 網絡卡名稱
:return: 無佇列時返回 ip 和 mac 位址,否則返回 none
"""# 構造arp包
result_raw = srp(ether(dst=
"ff:ff:ff:ff:ff:ff"
)/ arp(op=
1, hwdst=
"00:00:00:00:00:00"
, pdst=host)
, timeout=
1, iface=ifname, verbose=
false
)try
:# 取出成功響應的arp包資料
result_list = result_raw[0]
.res
if queue ==
none
:return result_list[0]
[1].getlayer(arp)
.fields[
'hwsrc'
]else
:# 將資料加入佇列
queue.put(
(host, result_list[0]
[1].getlayer(arp)
.fields[
'hwsrc'])
)except
:return
defscan
(network, func)
:"""
掃瞄主機
:param network: 掃瞄的網段
:param func: 掃瞄呼叫的函式
:return:
"""queue = queue(
) net = ipaddress.ip_network(network)
for ip in net:
ip =
str(ip)
arp = process(target=func, args=
(ip, queue)
)# 建立程序
arp.start(
)# 開始程序
time.sleep(3)
successful_mac_list =
while
not queue.empty():
ip, mac = queue.get(
)(ip, mac)
)return successful_mac_list
if __name__ ==
'__main__'
: network =
input
("please enter the network segment to be scanned:"
) start = time.time(
)print
("start scanning ..."
) active_ip = scan(network, scapy_arp_requests)
print
("scan complete!"
)print
("the hosts successfully scanned are:"
)for i,
(ip, mac)
inenumerate
(active_ip)
:print
("{}: ip:{} -- mac:{}"
.format
(i, ip, mac)
)print
("\na total of {} addresses were successful!\n"
.format
(len
(active_ip)))
end = time.time(
)print
("this scan takes a total of {} seconds."
.format
(end - start)
)
c 程式設計例項之河邊搬石頭
問題描述 沙灘按照線型擺放著n個大小不一的球形石頭,已知第i個石頭的半徑為ri,且不存在兩個石頭有相同的半徑。為了使石頭的擺放更加美觀,現要求擺放的石頭的半徑從左往右依次遞增。因此,需要對一些石頭進行移動,每次操作可以選擇乙個石頭,並把它放在剩下n 1個石頭在最左邊或最右邊。問最少需要操作多少次才能...
C 程式設計例項之翻轉01串
問題描述 給你乙個長度為n的01串。現在想讓你找出最長的01交替子串 子串可以不連續 比如 1010,0101是01交替的串,1101則不是。現在你可以把某乙個連續的區間進行翻轉,即0變1,1變0。問修改之後的最大01交替子串的長度是多少 問題分析 看到題目後,不必使用暴力方法解決,可以從數學的角度...
續例項解析SOCKET程式設計模型之非同步通訊篇(下)
非同步客戶端套接字在等待網路操作完成時不掛起應用程式。相反,它使用標準 net framework 非同步程式設計模型在乙個執行緒上處理網路連線,而應用程式繼續在原始執行緒上執行。非同步套接字適用於大量使用網路或不能等待網路操作完成才能繼續的應用程式。socket 類遵循非同步方法的 net fra...