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有什麼關係?

TAG:Python | 數據 | Apache |