说下我遇到的问题,由于我自己用的是通过路由器上网,所以做出来的东西所有功能都可以用,但把程序发到一些朋友那里就遇到问题了,关于SNIFFER的所有功能都不能用,起先还以为是程序功能问题,不停的在做修改,慢慢的才意识到原来是由于PPPOE拨号的原因,通过网上找了相关PPPOE的资料才知道,他将原来的数据包加上了一个PPPOE的协议包头,为了使程序支持PPPOE的协议只能把数据包转换成一般的TCP/IP包,PPPOE的协议有8字节组成,之后就是原有的TCP/IP协议包,一般的ADSL拨号都不会加密,因此可以不考虑加密的因素通过PCAP来做包转换主要有这几个过程,
1.获取PPPOE的原始以太包
2.将原始以太包头写入新以太包做为头部
3.移去原始以太包头部后的8个字节
4.将处理后的以太包数据块写入新包中
具体的PCAP应用实现代码:
1 //数据包接收事件
2 Device.PcapOnPacketArrival += new Pcap.PacketArrivalEvent(PcapOnPacketArrival);
3 //设置过滤条件,"以太协议为0x8864(即PPPOE协议)或TCP协议"
4 Device.PcapSetFilter("ether[12:2]=0x8864 or tcp");
5 //开始截包
6 PcapCapture(-1);
7
8
9
10 //截包事件
11 void PcapOnPacketArrival(object sender, Packet packet){
12
13 TCPPacket tmpTcpPacket = null;
14 //当获取的数据包为TCPPacket时直接转换为TCP数据包
15 if (packet is TCPPacket)
16 {
17 tmpTcpPacket = (packet as TCPPacket);
18 }
19 else
20 //当为以太包时,则尝试转换成TCP数据包
21 if (packet is EthernetPacket)
22 {
23 //协议数据区(TCP/IP协议包数据区,包括IP协议数据及TCP协议数据)
24 byte[] tmpBuf = new byte[packet.Data.Length - 8];
25 //复制实际TCP/IP数据块
26 Array.Copy(packet.Data, 8, tmpBuf, 0, tmpBuf.Length);
27 MemoryStream tmpMs = new MemoryStream();
28 //将原来的以太包头作为目标TCP/IP数据包的以太头
29 tmpMs.Write(packet.Header, 0, packet.Header.Length);
30 //将实际TCP/IP数据包写入目标TCP/IP数据包中,跟在以太包头后面,成为一个新的TCP/IP数据包
31 tmpMs.Write(tmpBuf, 0, tmpBuf.Length);
32 try
33 {
34 //尝试创建新的TCP/IP数据包对象,
35 //第一个参数为以太头长度,第二个为数据包数据块
36 tmpTcpPacket = new TCPPacket(packet.Header.Length, tmpMs.ToArray());
37 }
38 catch { tmpTcpPacket = null; }
39 tmpMs.Dispose();
40 }
41
42 }
下载说明
☉本站所有源码和资源均由站长亲自测试-绝对保证都可以架设,运营!
☉如源码和资源有损坏或所有链接均不能下载,请告知管理员,
☉本站软件和源码大部分为站长独资,资源购买和收集,放心下载!
☉唯一站长QQ:1004003180 [人格担保-本站注重诚信!]
☉购买建议E-mail:1004003180@qq.com 源码收购 E-mail:1004003180@qq.com
☉本站文件解压密码 【文章内都自带解压密码,每个密码不同!】