python編寫網絡抓包分析腳本


寫網絡抓包分析腳本,一個稱手的sniffer工具是必不可少的,我習慣用Ethereal,簡單,易用,基於winpcap的一個開源的軟件

  • Ethereal自帶許多協議的 decoder,但是它的架構並不靈活,如果你要加入一個自己定義的的解碼器,得去修改Ethereal的代碼,再重新編譯,相當的煩瑣

  • 對於一般的明文協議,沒有什么問題,但是對於加密協議,比如網絡游戲,客戶端程序一般會在剛連接上的時候,發送一個隨機密鑰,而后的報文都會用這個密鑰進 行加密,諸如此類.要想破解,得要有一個可編程的抓包器.libpcap是一個不錯的選擇,但是對於抓包這樣需要反復進行”試驗->修改”這個過程 的操作,c 語言顯然不是明智的選擇.

Python提供了幾個libpcap bind,http://monkey.org/~dugsong/pypcap/這里有一個最簡單的。在windows平台上,你需要先安裝winpcap,如果你已經安裝了Ethereal,可以跳過這個步驟.非常好用

  1. import pcap ,struct
  2. pack=pcap.pcap()
  3. pack.setfilter('udp port 8000')
  4. print 'start capture....'
  5. for recv_time,recv_data in pack:
  6. data=recv_data[42:]
  7. if isqq(data):
  8. packhead,ver,id,sequence = struct.unpack('>BHHH', data[0:7])

簡單說明一下

pcap還支持一些回調函數的用法,效率比較高,不過抓包不是為了效率,把事情做正確就行

    • 調用pack.setfilter填寫filter字符串,libpcap/WinPcap的filter language采用的tcpdump相同的格式,可以去看它的 man page,Ethereal的幫助里面有一個簡單的說明
    • data=recv_data[42:]這樣做的原因是,recv_data 抓到的都是raw packet, tcp/ip是分了5層,一個udp包,會帶有 14Bytes的 Ethenet_II Frame的頭,然后是20個字節的ip包頭,而udp包頭有8個字節,所以偏移量42之后的才是udp的實際內容

      tcp包的包頭大小為20Bytes,所以其實際內容在偏移量54之后

    • 報文的解析,可以用python自帶的struct,很容易使用,當然可以安裝 http://monkey.org/~dugsong/dpkt/ 這個包,已經幫你解析基本的報文信息


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM