SharpPcap学习笔记

在做飞信的时候看到nathan2007写的FeitionSniffer(一个用BC++和WinPcap开发的小工具,小巧却很实用),不禁暗暗想自己也能做个类似的东西,以后分析起协议就方便了.上网搜索了一下,发现有人已经用C#把WinPcap的功能进行了封装,开发了SharpPcap.然后看了SharpPcap tutorial,感觉还是挺简单的.顺便做个笔记以后用起来就方便了.

1. 获得网络设备

由于一个系统的网络设备可能不止一个,因而使用了一个列表类来保存所有的设备,这里使用了一个静态方法进行操作

/* Retrieve the device list */

PcapDeviceList devices = SharpPcap.GetAllDevices();

获取列表后,就能对设备进行操作了,其实设备分为2个子类,一类是NetworkDevice,这个是算是真实的网络设备吧,还有一类是PcapOfflineDevice,这个类是通过读取抓包文件生成的虚拟设备.

如果是NetworkDevice,那么还有些其他的网络信息,如ip地址,子网掩码等.

2. 抓包过程

在选定了一个PcapDevice后,就能使用他的方法进行抓包了.首先要打开设备.

 //Open the device for capturing

 //true -- means promiscuous mode

 //1000 -- means a read wait of 1000ms

 device.PcapOpen(true, 1000);

方法提供2个参数,第一个为抓包模式,指明是否抓其他Ip地址的包,类似Hub的功能;第二个是指超时时间,毫秒级.

下面就能正式抓包了,一共提供了3种方法:

 device.PcapStartCapture();

 异步方式,调用之后立即返回,具体抓下来的包,由PcapOnPacketArrival事件处理.需要停止的时候调用device.PcapStopCapture()进行关闭.

 device.PcapCapture(int packetCount);

半同步方式,调用后,直到抓到packetCount数量的包才返回., 具体抓下来的包,由PcapOnPacketArrival事件处理.

注意:如果传入SharpPcap.INFINITE将不退出,永远都在接收,且程序就停在这个语句了.

packet=device.PcapGetNextPacket()

同步方式,调用后直接等待收到的下一个包,并获得该包.

注意:如果超时,就可能还没有获得包体就退出该过程.这时packet=null,所以使用该方法每次都要对包进行检测.

最后一定要记得,关闭设备.

device.Close();

3. 包体分析.

在捕捉到包后,就需要根据实际的包进行转换了. 

 if(packet is TCPPacket)

 {

TCPPacket tcp = (TCPPacket)packet;

}

因为这个需要转换的包类型很多,具体都在Tamir.IPLib.Packets里面.按照说明,一直尝试转换是不对的了,需要与过滤机制配合使用,只对自己有用的包分析

4. 过滤机制

包过滤是抓包程序的必备机制,要想对某次捕捉进行过滤,就必须在设备打开后,开始抓包前设置设备的过滤参数.

 //tcpdump filter to capture only TCP/IP packets            

 string filter = "ip and tcp";

 //Associate the filter with this capture

 device.PcapSetFilter( filter );

注意的是,filter是一个文本,遵循了tcpdump syntax.

5. 其他

A. SharpPcap还能保存捕获的包,而且使用起来也很简单.

保存: 在抓包前设置Dump的文件

//Open or create a capture output file

device.PcapDumpOpen( capFile);

抓到包后,把需要的包保存起来

 //dump the packet to the file

    device.PcapDump( packet );

使用:把包文件当作一个脱机设备

 //Get an offline file pcap device

device = SharpPcap.GetPcapOfflineDevice( capFile );

然后这个设备也可以捕捉包,使用起来和真实的一样(当然,不会有超时了就是)

B.对设备直接发包

相对与捕捉包,也可以发送包.提供了2种方法

 //Send the packet out the network device,直接发送包

     device.PcapSendPacket( bytes );

  //使用设备的发送队列

device.PcapSendQueue(squeue, true );

两种显然上面的容易,下面的高效

C.网络流量统计—没看,我暂时也不想用.

6.总结

主要来说PcapDevice类是整个操作的核心,把它用好了就成.

基于SharpPcap的抓包实例,不会被游戏屏蔽,自行调节,可代替wpe的抓包工具 240 180 41 90 211 239 136 99 223 137 167 43 8 0 69 0 0 46 32 98 64 0 64 6 147 24 5 192 168 31 169 118 89 47 200 92 23 39 26 187 161 135 66 137 136 217 57 80 24 6 5 86 74 34 0 0 99 3 17 0 1 0 240 180 41 90 211 239 136 99 223 137 167 43 8 0 69 0 0 46 32 122 64 0 64 6 147 2 21 192 168 31 169 118 89 47 200 92 23 39 26 187 161 135 72 137 136 217 138 80 24 65 65 73 224 0 0 99 3 17 0 1 0 240 180 41 90 211 239 136 99 223 137 167 43 8 0 69 0 0 46 32 124 64 0 64 6 147 2 19 192 168 31 169 118 89 47 200 92 23 39 26 187 161 135 78 137 136 217 155 80 24 65 61 73 205 0 0 99 3 17 0 1 0 240 180 41 90 211 239 136 99 223 137 167 43 8 0 69 0 0 46 32 125 64 0 64 6 147 2 18 192 168 31 169 118 89 47 200 92 23 39 26 187 161 135 84 137 136 217 219 80 24 65 45 73 151 0 0 99 3 17 0 1 0 240 180 41 90 211 239 136 99 223 137 167 43 8 0 69 0 0 46 32 127 64 0 64 6 147 2 16 192 168 31 169 118 89 47 200 92 23 39 26 187 161 135 90 137 136 218 30 80 24 65 28 73 95 0 0 99 3 17 0 1 0 240 180 41 90 211 239 136 99 223 137 167 43 8 0 69 0 0 46 32 129 64 0 64 6 147 2 14 192 168 31 169 118 89 47 200 92 23 39 26 187 161 135 96 137 136 218 125 80 24 65 5 73 17 0 0 99 3 17 0 1 0 240 180 41 90 211 239 136 99 223 137 167 43 8 0 69 0 0 46 32 133 64 0 64 6 147 2 10 192 168 31 169 118 89 47 200 92 23 39 26 187 161 135 102 137 136 218 206 80 2 4 64 240 72 207 0 0 99 3 17 0 1 0 240 180 41 90 211 239 136 99 223 137 167 43 8 0 69 0 0 46 32 134 64 0 64 6 147 2 09 192 168 31 169 118 89 47 200 92 23 39 26 187 161 135 108 137 136 219 31 80 24 64 220 72 140 0 0 99 3 17 0 1 0 240 180 41 90 211 239 136 99 223 137 167 43 8 0 69 0 0 46 32 136 64 0 64 6 147 2 07 192 168 31 169 118 89 47 200 92 23 39 26 187 161 135 114 137 136 219 112 80 2 4 64 200 72 73 0 0 99 3 17 0 1 0 240 180 41 90 211 239 136 99 223 137 167 43 8 0 69 0 0 46 32 142 64 0 64 6 147 2 01 192 168 31 169 118 89 47 200 92 23 39 26 187 161 135 120 137 136 219 179 80 2 4 64 183 72 17 0 0 99 3 17 0 1 0 240 180 41 90 211 239 136 99 223 137 167 43 8 0 69 0 0 46 32 143 64 0 64 6 147 2 00 192 168 31 169 118 89 47 200 92 23 39 26 187 161 135 126 137 136 219 246 80 2 4 64 166 71 217 0 0 99 3 17 0 1 0 240 180 41 90 211 239 136 99 223 137 167 43 8 0 69 0 0 46 39 198 64 0 64 6 140 1 45 192 168 31 169 118 89 47 200 92 23 39 26 187 161 136 247 137 136 248 240 80 2 4 64 126 41 142 0 0 99 3 17 0 1 0 240 180 41 90 211 239 136 99 223 137 167 43 8 0 69 0 0 46 39 209 64 0 64 6 140 1 34 192 168 31 169 118 89 47 200 92 23 39 26 187 161 136 253 137 136 249 65 80 24 64 106 41 75 0 0 99 3 17 0 1 0
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值