抓包分析主機上網浏覽了那些網頁,并把浏覽網頁的網址寫入一個檔案。
首先我列舉下我在寫抓包程式所犯下的錯誤。供大家學習參考。
建立原始套接字失敗:
分析原因:剛開始的時候運作程式正常,但是同僚覃書芹幫我虛拟機添加了一個虛拟網卡的時候就出現錯誤了。原因說出來很簡單,就是裝置名稱錯誤,但是當時我怎麼調都調不出來。最後請他們看了下,一下就看出來了。起碼讓我明白建立套接字的時候要與監聽的網卡名稱相對應,不然要監聽eth1,結果在綁定裝置名稱的時候綁成了eth0,那就可能出現錯誤,獲得不到效果。
1. 寫檔案總是亂碼:
分析原因:這個問題在我進公司前以前就犯過,那時候是用C++寫,改正過來比較快。現在在全字元環境下,改了半天,最後發現,在寫的時候直接傳了位址,而沒有加上所傳字元串的長度。導緻亂碼,加上一個sizeof()以後問題解決。
2. 浏覽部分網頁時程式出現段錯誤:
在C環境下,出現段錯誤是很常見的,但對于我來說見的很少,是以出現這類問題的時候顯得還不到哪錯了。原因是我在定位域名字段的時候是以“com\r\n”結束為标記的。因為很多域名都是以.com結尾的,是以就忽略了還有以“.cn”或者以“.net”結尾的域名。我當時就奇怪了,為什麼有的網頁可以,但是通路有些域名的時候,一點選就出錯。當找不到.com的時候就會定位到下一個包,定義到一個不存在的記憶體區域。是以導緻段錯誤。
3. 分析的出是tcp包但是分析不出是http包:
錯誤原因:這個錯誤本來應該是不會出現的,就是我把usleep(1000),改為了sleep(1),都是停止一秒鐘。在while循環裡用sleep(1)可以讓程式暫停執行一秒鐘效果很明顯,但是usleep(1000)就不是很明顯了。在while循環裡用sleep(1)就明顯減慢了抓包的速度,是以就出現抓漏了包的情況。把while循環裡的sleep(1)改成usleep(1000);就行了。
程式過程:
首先抓住經過網卡的資料包,首先檢測他是不是ip包,如果是剝去標頭,然後看是不是tcp包,如果是則檢測它的端口是不是80端口。如果是則證明傳輸的是http協定。然後就可以分析是不是存在“get”字段,是不是存在“host”字段。然後取“host”後面的一個字元串,即我們要得到的主機通路的域名,即上網記錄。
具體代碼如下: