zoukankan      html  css  js  c++  java
  • PPPOE数据包转换及SharpPcap应用

    在最近写的一个程序中需要用到Sniffer功能,但由于通过.net自身的Socket做出来的Sniffer不能达到实际应用的要求(如不能监听WIFI数据包)所以找到了WinPCAP的.NET库SharpPcap(http://www.tamirgal.com/home/dev.aspx?Item=SharpPcap)

    说下我遇到的问题,由于我自己用的是通过路由器上网,所以做出来的东西所有功能都可以用,但把程序发到一些朋友那里就遇到问题了,关于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 }

  • 相关阅读:
    Java 蓝桥杯 算法训练 貌似化学
    Java 蓝桥杯 算法训练 貌似化学
    Java 蓝桥杯 算法训练 字符串的展开 (JAVA语言实现)
    Java 蓝桥杯 算法训练 字符串的展开 (JAVA语言实现)
    Java 蓝桥杯 算法训练 字符串的展开 (JAVA语言实现)
    Java 蓝桥杯 算法训练 字符串的展开 (JAVA语言实现)
    Java 蓝桥杯 算法训练 字符串的展开 (JAVA语言实现)
    JAVA-蓝桥杯-算法训练-字符串变换
    Ceph:一个开源的 Linux PB 级分布式文件系统
    shell 脚本监控程序是否正在执行, 如果没有执行, 则自动启动该进程
  • 原文地址:https://www.cnblogs.com/pvistely/p/1396902.html
Copyright © 2011-2022 走看看