python如何抓取本地數據包?
在windows上搭建一個apache伺服器(用phpstudy搭建的),然後:網上有如下代碼1.py:
pc=pcap.pcap() #注,參數可為網卡名,如eth0
pc.setfilter("tcp port 8080") #設置監聽過濾器
for ptime,pdata in pc: #ptime為收到時間,pdata為收到數據
p=dpkt.ethernet.Ethernet(pdata)
if p.data.__class__.__name__=="IP":
ip="%d.%d.%d.%d"%tuple(map(ord,list(p.data.dst)))
# print ip
if p.data.data.__class__.__name__=="TCP":
if p.data.data.dport==8080:
sStr1 = p.data.data.data
print "sStr1:",sStr1
sStr2 = "Host: "
sStr3 = "Connection"
sStr4 = "GET /"
sStr5 = " HTTP/1.1"
nPos = sStr1.find(sStr3)
nPosa = sStr1.find(sStr5)
for n in range(sStr1.find(sStr2)+6,nPos-1):
aaa=sStr1[sStr1.find(sStr2)+6:n]
for n in range(sStr1.find(sStr4)+4,nPosa+1):
bbb=sStr1[sStr1.find(sStr4)+4:n]
ccc=aaa+bbb
print ccc
運行1.py 但是監聽不到我訪問127.0.0.1:8080的數據,為什麼?
如果把1.py文件里的8080改成80 訪問百度或者其他網站就可以 獲取到數據,這是為啥?
因為Windows沒有把本地迴環當作一個虛擬網卡暴露給別家使用。如果你的訪問是自己機器,local loop其實是軟迴環。Linux下沒關係,管它真網卡還是loop都是個文件,而windows里則不同。
換句話說,這麼個寫出來的代碼,在windows下跑,如果數據包不走物理網卡,你就抓不著。反之,即使你抓8080,然後用另一台設備來訪問,照樣能抓著。
解決的辦法是,找個能映射local loop的虛擬網卡驅動。
這鍋Python或者pcap都不背。
這個問題只會在Windows上出現,與Python無關。參考資源:Wireshark - Wiki
簡要方案介紹
1. 安裝虛擬迴環網卡
KM-TEST Loopback Adapter
2. 安裝NDIS LWF (NDIS Lightweight Filter)
npcap
3. Winsock LSP
proxocket
4. Raw socket(僅限舊版Windows)
http://msdn.microsoft.com/en-us/library/ms740548.aspx
http://www.netresec.com/?page=RawCap
http://www.binarytides.com/raw-sockets-packets-with-winpcap/
利益相關:Npcap作者
Windows下二層抓包通常都需要通過WinPcap,然而由於Windows Loopback機制,導致迴環包不走NDIS,所以作為NDIS驅動的WinPcap自然無法抓到127.0.0.1的報文。Npcap是WinPcap的改進版,在NDIS之外還結合了WFP技術來抓取三層的Loopback報文,實現類似Linux下lo網卡抓包的效果。這個應該是目前最好的解決方案。
下載請到Nmap官網。
推薦閱讀:
※PHP寫的API如何防止拒絕服務攻擊?
※怎樣通俗的講解 PHP 和 Apache 的關係?
※Web 應用、服務是如何工作的?
※hadoop學習路線,希望各位幫幫忙?
※php-cgi和php-fpm有什麼關係?