解析Winpcap截获的数据包

32 篇文章 0 订阅
19 篇文章 0 订阅

解析Winpcap截获的数据包

2009-04-28 16:38
现在Winpcap库已经被广泛应用于网络程序,特别是用于网络分析,而多数初学者对于如何分析所截获的数据包还不太清楚。现在就以我的经验来介绍一下,希望能对大家有所帮助。
首先要清楚的是,Winpcap截获的数据包与Windows Raw socket截获的数据包不同的是,raw socket截获的数据包只局限于传输层( 请参考有关OSI模型知识),也就是所只能够截获tcp,udp,icmp等高层协议,而Winpcap截获的数据包是从数据链路层开始的,它的层次更低,从而可以更深入,更详细地分析。
由于Winpcap数据包查找网卡,打开网卡,设置过滤器等代码到处可见,
参考 http://www.coffeecat.net.cn/WinPcap/html/group__wpcap__tut6.html
所以,前面部分的代码我在这里就不介绍了。我将专门介绍如何分析数据包。
当一有通过过滤器的数据包被截获之后,一个回调函数将被调用,这个函数的原型是:
/* 回调函数原型 */
void packet_handler(u_char *param, const struct pcap_pkthdr *header, const u_char *pkt_data);
其中 header为一个结构体指针:

struct pcap_pkthdr {

    struct timeval ts;   /* time stamp */

    bpf_u_int32 caplen; /* length of portion present */

    bpf_u_int32 len; /* length this packet (off wire) */

};

caplen为截获的数据包总长度,pkt_data为截获的数据包的字节指针。
我现在以一个我截获的数据包为例进行分析,数据包如下:


上图为winpcap截获的数据包,现在要知道的是,数据包中到底是什么样的层次呢?
首先是以太网帧,它的格式为:

它的结构可定义为:
// DLC Header
typedef struct tagDLCHeader               /*以太网数据帧头部结构*/
{
    unsigned char      DesMAC[6];      /* destination HW addrress */
    unsigned char      SrcMAC[6];      /* source HW addresss */
    unsigned short     Ethertype;      /* ethernet type */
} DLCHEADER, *PDLCHEADER;
开始6个字节为目标MAC地址(00 06 5B F4 9F 68),接着的6个字节为源MAC地址(00 09 6B 8F D4 57
),接着2个字节是以太网协议类型(08 00),
参考 以太网类型速查表
上例中的Ethertype为0x0008,这个数值是网络顺序,要先转为主机顺序才能用,转换的函数为
u_short ntohs( u_short netshort );
一般类型长度大于1个字节(如unsigned short、unsigned long)的数据在网络中传输都是以网络顺序传播的,都要先转为主机顺序(其实就是顺序反过来)。上述的Ethertype经转换之后成为0x0800,在 以太网类型速查表中可以查找到它对应的协议类型为IP协议。
因为以太网协议类型为IP协议,所以之后接下来的就是IP协议首部,它的结构图为:
可定义为结构体如下:
typedef struct _IPHeaer  
{
    UCHAR    iphVerLen;        //版本号和头长度(各占4位)
    UCHAR    ipTOS;            //服务类型
    USHORT    ipLength;        //封包总长度,即整个IP报的长度
    USHORT    ipID;            //封包标识,惟一标识发送的每一个数据报
    USHORT    ipFlags;        //标志
    UCHAR    ipTTL;            //生存时间,就是TTL
    UCHAR    ipProtocol;        //协议,可能是TCP、UDP、ICMP等
    USHORT    ipChecksum;        //校验和
    ULONG    ipSource;        //源IP地址
    ULONG    ipDestination;    //目标IP地址
}IPHeader,*PIPHeader;
然后计算所需的内容,如:
ip头长度=(iphVerLen*0x0f)*4;
ip报文总长度(ip首部长度+协议(如tcp)首部长度+真实数据(如http数据内容))=ntohs(ipLength);
协议类型=ipProtocol(常用的有 1为ICMP,6为TCP,17为UDP)=6,所以这个数据包为tcp数据包。
源IP地址:ipSource为四个字节的ip地址,通常转为Ip地址字符串(其实也就是把每个字节的十六进制转为十进制),如这里的ipSource为“C0 A8 00 10”,转为字符串即为"192.168.0.16"
转换方法为:
in_addr src,dest;
src.S_un.S_addr = ipSource;
dest.S_un.S_addr = ipDestination;
char* ip = inet_ntoa(src);即获得源ip地址
同样可以获得目的ip地址。
因为ip首部中的协议类型是tcp,所以接下来就是tcp首部,
可以定义为结构如下:
typedef struct _TCPHeader    //20个字节
{   
    USHORT    sourcePort;        //16位源端口号
    USHORT    destinationPort;//16位目的端口号
    ULONG    sequenceNumber;    //32位序列号
    ULONG    acknowledgeNumber;//32位确认号
    UCHAR    dataoffset;        //4位首部长度/6位保留字
    UCHAR    flags;            //6位标志位
    USHORT    windows;        //16位窗口大小
    USHORT    checksum;        //16位校验和
    USHORT    urgentPointer;    //16位紧急数据偏移量
}TCPHeader,*PTCPHeader;
同样可以提取所需的数据,如:
源端口=ntohs(sourcePort);
目的端口=ntohs(destinationPort);
tcp首部长度=((dataoffset*0xf0)>>4)*4;
tcp首部之后,就是携带的真实数据了,它的长度等于IP报文总长度-IP首部长度-TCP首部长度,这几个结构长度都在上面有计算方法了。

   好了,上面已经把一个tcp数据包介绍完了,同样,可以采用相同的方法来分析ARP,UDP,ICMP,IGMP等协议数据包。
   下面给出一些常用的协议首部结构:
// ARP 数据帧
typedef struct tagARPFrame
{
    unsigned short     HW_Type;            /* hardware type */
    unsigned short     Prot_Type;        /* protocol type */
    unsigned char      HW_Addr_Len;     /* length of hardware address */
    unsigned char      Prot_Addr_Len;   /* length of protocol address */
    unsigned short     Opcode;            /* ARP/RARP */
    unsigned char      Send_HW_Addr[6]; /* sender hardware address */
    unsigned long      Send_Prot_Addr; /* sender protocol address */
    unsigned char      Targ_HW_Addr[6]; /* target hardware address */
    unsigned long      Targ_Prot_Addr; /* target protocol address */
    unsigned char      padding[18];
} ARPFRAME, *PARPFRAME;

typedef struct _UDPHeader
{
    USHORT    sourcePort;        //源端口号
    USHORT    destinationPort;//目的端口号
    USHORT    len;            //封包长度
    USHORT    checksum;        //校验和
}UDPHeader,*PUDPHeader;

typedef struct _ICMPHeader
{
    UCHAR    icmp_type;        //消息类型
    UCHAR    icmp_code;        //代码
    USHORT    icmp_checksum;    //校验和
    //下面是回显头
    USHORT    icmp_id;        //用来惟一标识此请求的ID号,通常设置为进程ID
    USHORT    icmp_sequence;    //序列号
    ULONG    icmp_timestamp;    //时间戳
}ICMPHeader,*PICMPHeader;

typedef struct _IGMPHeader //8字节
{
    UCHAR   hVerType;      //版本号和类型(各4位)
    UCHAR   uReserved;     //未用
    USHORT uCheckSum;     //校验和
    ULONG    dwGroupAddress;//32为组地址(D类IP地址)
}IGMPHeader,*PIGMPHeader;

   好了,就写到这了,希望此文对大家会有所帮助。


http://hi.baidu.com/cwcblog/blog/item/02310a830c5f42b76d811965.html

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
标 题: 【原创】基于WinPCap网络协议开发 - 炮王(超级打炮机)发送数据包(03) 作 者: 加百力 时 间: 2009-05-18,16:55:36 链 接: http://bbs.pediy.com/showthread.php?t=89175 【文章标题】: 基于WinPCap网络协议开发 - 炮王(超级打炮机)发送数据包(03) 【文章作者】: 加百力 【软件名称】: WinPCap 【下载地址】: http://www.winpcap.org/ 【内部编号】: MASSADA 0029 【编写语言】: C++ 【使用工具】: VS2005 【操作平台】: Windows 2003 -------------------------------------------------------------------------------- 【详细过程】 在第一篇文章中我们提到WinPCap的基本功能之一就是:  1> 在网络上发送原始的数据包。 发送原始数据包难度不大,只需要应用几个简单的函数就可以了。 我编写炮王程序的主要目的是为了测试WinPCap/libpcap的抓包能力,在不同网速和数据包大小的条件下libpcap的抓包率有多少。 炮王特点: 01、可以发送任意协议的数据包TCP/IP等等。 02、针对每次发包,会返回状态,可以检测是否成功。在程序中如果失败会自动退出。 03、可以随机修改数据包的:源、目的MAC地址,IP地址,端口、数据内容等属性信息。 04、使用多线程发包,在XP下最多可以同时开2000个线程发包,发包速度快,流量大。在千兆网卡上可以超过15M/s的速度。 05、自动统计发包时间,计算每秒发包数量,流量。 06、可以设置发包的时间间隔,最少到1毫秒。 炮王使用方法: 首先直接运行pw.exe可以看到程序提示的参数信息和显示的当前可用网卡信息。可用网卡信息会保存在CardsInfo.txt文件中。 打开BAT脚本,修改网卡信息,即可。 运行脚本,脚本将数据包文件发送出去。 注意:总的发包数量等于每个线程的发包数量乘以线程总数。 实验的数据包文件都是MSN消息。 具体代码请看附件。 -------------------------------------------------------------------------------- 【版权声明】: 本文原创于看雪技术论坛, 转载请注明作者并保持文章的完整, 谢谢!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值