有個需求是收聽網站的流量,檢查是否有包含特定格式資訊的封包。從幾天前開始思考相關實作的問題。
如何檢查有人透過 Http 方式連線到網站?
側錄本機或同網段的封包才能滿足收聽的需求。Http協定送出的封包,到了底層是走tcp/ip,只要能夠抓取tcp/ip封包,並轉換成可處理的格式,就能檢查是否有人送出資訊。
今天的情境是要監聽同網段的網站流量,於是開始搜尋可用工具。其中,在Windows環境最有名的就是 WinPcap ,網路上已經有熱心人士提供包裹在 C# 的元件,只要先安裝好WinPcap,然後下載元件到自己的應用程式,即可收聽封包。該元件就是 SharpPcap ,2004年,美國的 Tamir Gal 為了完成大學的專案,在.NET 應用程式中使用 WinPcap 的功能,因此順便開發了SharpPcap 。他甚至寫了範例,使得開發人員可以更快學習如何利用他的元件,詳細資料請到 他的網站。
如何使用SharpPcap ?
第一,下載 WinPcap,並妥善安裝完畢。(下載連結)
第二,下載 SharpPcap 。(下載連結)
第三,將 PacketDotNet.dll 和 SharpPcap.dll 加入到應用程式的參考中。
using SharpPcap;
using SharpPcap.LibPcap;
using PacketDotNet;
第四,列出電腦中可收聽的網卡設備,並選擇其中一個。
string ver = SharpPcap.Version.VersionString;
/* 顯示你的SharpPcap版本,目前最新是 4.0 */
Console.WriteLine("SharpPcap {0},", ver);
/* 顯示本機電腦可使用的網卡 */
LibPcapLiveDeviceList devices = LibPcapLiveDeviceList.Instance;
/* 選擇其中一個網卡 */
LibPcapLiveDevice device = devices[0];
第五,開啟設備,並設定過濾封包的條件。
device.Open();
/* 使用符合 tcpdump 格式的語法即可過濾封包,基本上 http 的封包可用 tcp and ip 過濾*/
device.Filter = "tcp and ip";
/* 當條件的封包被被截取時,執行 device_OnPacketArrival */
device.OnPacketArrival += new PacketArrivalEventHandler(device_OnPacketArrival);
device.StartCapture();
device.StopCapture();
第六,設定符合特定格式的封包處理流程。
device_OnPacketArrival(object sender, CaptureEventArgs e)
{
Packet dotnetpacket = Packet.ParsePacket(e.Packet.LinkLayerType, e.Packet.Data);
TcpPacket tcpPacket = TcpPacket.GetEncapsulated(dotnetpacket);
string payload = Encoding.ASCII.GetString(tcpPacket.PayloadData);
if (payload.Contains("某條件"))
{
/* 執行處理流程 */
}
}
大致架構完成之後,封包處理流程那一塊,就可以用字串比對、正則表達式來比對特定格式的資訊。
如何檢查有人透過 Http 方式連線到網站?
側錄本機或同網段的封包才能滿足收聽的需求。Http協定送出的封包,到了底層是走tcp/ip,只要能夠抓取tcp/ip封包,並轉換成可處理的格式,就能檢查是否有人送出資訊。
今天的情境是要監聽同網段的網站流量,於是開始搜尋可用工具。其中,在Windows環境最有名的就是 WinPcap ,網路上已經有熱心人士提供包裹在 C# 的元件,只要先安裝好WinPcap,然後下載元件到自己的應用程式,即可收聽封包。該元件就是 SharpPcap ,2004年,美國的 Tamir Gal 為了完成大學的專案,在.NET 應用程式中使用 WinPcap 的功能,因此順便開發了SharpPcap 。他甚至寫了範例,使得開發人員可以更快學習如何利用他的元件,詳細資料請到 他的網站。
如何使用SharpPcap ?
第一,下載 WinPcap,並妥善安裝完畢。(下載連結)
第二,下載 SharpPcap 。(下載連結)
第三,將 PacketDotNet.dll 和 SharpPcap.dll 加入到應用程式的參考中。
using SharpPcap;
using SharpPcap.LibPcap;
using PacketDotNet;
第四,列出電腦中可收聽的網卡設備,並選擇其中一個。
string ver = SharpPcap.Version.VersionString;
/* 顯示你的SharpPcap版本,目前最新是 4.0 */
Console.WriteLine("SharpPcap {0},", ver);
/* 顯示本機電腦可使用的網卡 */
LibPcapLiveDeviceList devices = LibPcapLiveDeviceList.Instance;
/* 選擇其中一個網卡 */
LibPcapLiveDevice device = devices[0];
第五,開啟設備,並設定過濾封包的條件。
device.Open();
/* 使用符合 tcpdump 格式的語法即可過濾封包,基本上 http 的封包可用 tcp and ip 過濾*/
device.Filter = "tcp and ip";
/* 當條件的封包被被截取時,執行 device_OnPacketArrival */
device.OnPacketArrival += new PacketArrivalEventHandler(device_OnPacketArrival);
device.StartCapture();
device.StopCapture();
第六,設定符合特定格式的封包處理流程。
device_OnPacketArrival(object sender, CaptureEventArgs e)
{
Packet dotnetpacket = Packet.ParsePacket(e.Packet.LinkLayerType, e.Packet.Data);
TcpPacket tcpPacket = TcpPacket.GetEncapsulated(dotnetpacket);
string payload = Encoding.ASCII.GetString(tcpPacket.PayloadData);
if (payload.Contains("某條件"))
{
/* 執行處理流程 */
}
}
大致架構完成之後,封包處理流程那一塊,就可以用字串比對、正則表達式來比對特定格式的資訊。
----
參考資料
http://www.codeproject.com/Articles/12458/SharpPcap-A-Packet-Capture-Framework-for-NET#basicCap
http://renren.it/a/bianchengyuyan/_NET/20110829/123529.html
http://www.diybl.com/course/4_webprogram/asp.net/netjs/2008311/104307.html
http://www.winpcap.org/install/default.htm
http://openmaniak.com/tcpdump.php
沒有留言:
張貼留言