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 }

  • 相关阅读:
    iptables防火墙(RHEL6)
    漏洞扫描与网络抓包
    服务安全与监控
    Typecho反序列化漏洞
    python类,魔术方法等学习&&部分ssti常见操作知识点复习加深
    PHAR伪协议&&[CISCN2019 华北赛区 Day1 Web1]Dropbox
    [GXYCTF2019]禁止套娃 1 &无参数RCE
    PHP代码审计学习(1)
    Yii2安装完kartik组件后,使用时报错
    收藏博客
  • 原文地址:https://www.cnblogs.com/rainbowzc/p/3600252.html
Copyright © 2011-2022 走看看