2017年6月22日 星期四

以 SharpPcap 實作可收聽封包的 C# 程式


有個需求是收聽網站的流量,檢查是否有包含特定格式資訊的封包。從幾天前開始思考相關實作的問題。

如何檢查有人透過 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("
某條件"))
        {
            /*
執行處理流程 */
        }
}


大致架構完成之後,封包處理流程那一塊,就可以用字串比對、正則表達式來比對特定格式的資訊。


沒有留言:

張貼留言