基本的抓包代码

#include <stdio.h>
#include <stdlib.h>
#include <pcap.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <errno.h>
#include <netinet/if_ether.h>
#include <string.h>

void call_back(u_char *args, const struct pcap_pkthdr *header, const u_char *packet)
{
 /* 捕获数据包计数器 */
static int count = 1;
 
 printf("*****************************************************%d: /n",count);
 int i = 0;

    /* 打印捕获数据包的信息 */
 printf("The grab time is: %s", ctime((const time_t*)&(*header).ts.tv_sec));
    printf("The grab length of packet is: %d/n", (*header).caplen);
    printf("The length of packet is: %d/n", (*header).len);

    /* 自定义指针指将捕获的数据包的内容拷贝到指向的内存中 */
 u_char *pac;
 pac = (u_char *)malloc((*header).len+1); 
 memcpy(pac, packet, (*header).len);

    /* 分字节打印数据包的内容 */
 for(i=0; i<(*header).len; i++)
 {
  printf("packet doc%d is: %d/n", i, pac[i]);
 }
 
 /* 分割线 */
 printf("********************************************************/n");
 
count++;
}


int main(int argc, char *argv[])
{
 char *dev;   /* 获得设备名称*/
    pcap_t *handle;  /* 捕获句柄 */
 struct pcap_pkthdr header;  /* 捕获数据包的时间长度信息结构体 */
 const u_char *packet;  /* 指向捕获的数据包内存的指针 */
 struct pcap_stat stat;  /* 捕获状态信息 */
 
char *net;    /* 保存转换后网络号*/
 char *mask;  /* 保存转换后子网掩码*/
    bpf_u_int32 netp;    /* 保存32bit的网络号 */
 bpf_u_int32 maskp;  /* 保存32bit的子网掩码 */
    struct in_addr addr;  /* 用于转换网络地址的结构体*/

 char errbuf[PCAP_ERRBUF_SIZE];  /* 保存出错信息 */
int ret; /* 返回值return */
 
 /* 获得第一个可用网络设备名称 */
 dev = pcap_lookupdev(errbuf);
 if(NULL == dev)
 {
  printf("can't find dev!/n");
  exit(1);
 }
 printf("DEV: %s/n", dev);

 /* 获得网络号和子网掩码 */
 ret = pcap_lookupnet(dev, &netp, &maskp, errbuf);
 if(-1 == ret)
 {
  printf("Error in look up net!/n");
  exit(1);
 }

 /* 打印网络号 */
 addr.s_addr = netp;
 net = inet_ntoa(addr);
 if( NULL == net)
 {
  printf("net error!/n");
  exit(1);
 }
 printf("NET: %s/n",net);

 /* 打印子网掩码 */
 addr.s_addr = maskp;
 mask = inet_ntoa(addr);
 if(NULL ==  mask)
 {
  printf("mask error!/n");
  exit(1);
 }
 printf("MASK: %s/n", mask);

 /* 获得捕获句柄 */
 handle = pcap_open_live(dev, BUFSIZ, 1, 0, errbuf);
 if(NULL == handle)
    {
        printf("pcap_open_live(): %s/n",errbuf);
       exit(1);
     }

 /* 获得网络类型(此处仅以10M以太网为例,其他类型参照libpcap说明文档)*/
 if(pcap_datalink(handle) == DLT_EN10MB)
 {
  printf("10 MB internet!/n");
 }

 /* 使用pcap_loop()循环捕获数据包 */
 pcap_loop(handle, 10, call_back, NULL);

 /* 另一种循环捕获数据包的方法:使用pcap_next()函数和循环相结合的用法 */
/* 
 int i;
for(i=0;i<10;i++)
 {
  packet = pcap_next(handle, &header);//偶:注意这句,使用pcap_next来作,要用packet 来接返回值。这个与pcap_loop不同
  //用pcap_loop来作的话,是用回调函数callback的第一个参数来存放抓到的数据包

  printf("The grab time is: %s", ctime((const time_t*)&header.ts.tv_sec));
  printf("The grab length of packet is: %d/n", header.caplen);
  printf("The length of packet is: %d/n", header.len);
 } 
*/
 /* 获得捕获状态信息 */
 pcap_stats(handle, &stat);
 printf("reces: %d, drops: %d/n", stat.ps_recv, stat.ps_drop);

 /* 关闭捕获句柄 */
 pcap_close(handle);
 
 return 0;
}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
设置IPTOOL捕包选项 1、选捕包网卡,如下图: 如上图 1、选择好捕包网卡,左连还有一些其它捕包条件供选择,如果当所选网卡不支持“杂项接收”功能,系统会提 示相应信息,出现该情况时您将无法获取与本网卡无关的数据包,换言之,您无法获取其他电脑之间的通讯包,所以, 建议您更换网卡。 不支持“杂项接收”的网卡,多数为一部分无线网卡及少数专用服务器/笔记本网卡。 2、协议过滤 通常情况下,可不选,除非您对协议类型较为熟悉。 3、设置捕包缓冲 确省的捕包缓冲区大小为 1M,如果您的要追踪的网络规模较大,可适当调大该值;另外,如果追踪主机 CPU 处理能力不够,也需加大缓冲;否则,可能出现丢包的情况。 4、IP过滤 IP过滤里可以设置想要捕包的IP地址或是设置要排除的IP地址等信息。 5、端口过滤 端口过滤过滤里可以设置想要捕包的端口或是设置要排除过滤的端口等信息。 体验“捕包分析” 1、设置捕包过滤项 这里的过滤和“追踪任务”过滤设置是独立分开的,请不要混淆,其可选内容项更多。按钮,如下图: 上述选项中,最为复杂的是“数据块匹配”部分,详细的介绍将在下面的章节部分出现,这里只需要配置好正确的网卡即可,其他选项可以不做任何设置。 2、开始捕获,按钮。 通过上述步骤,基本上可以体验到该产品的最基础的功能。 IP包回放 IP包回放的目的是: 1、有助于了解原始包通讯的地理分布情况。 2、通过将IP包回放到网卡上,模拟原始IP包在网络上传输情况,也可供同类捕包软件捕获分析。 通讯协议分析 捕包准备 捕包分析工具条: 开始捕包前,用户需先进行过滤设置,选项内容包括: 选网卡 如果您有多块网卡,需要选中能捕包到预想中的数据的网卡。 协议过滤 针对Internet通讯部分,常见的IP包类型为:TCP/UDP/ICMP。绝大部分是TCP连接的,比如HTTP(s)/SMTP/POP3 /FTP/TELNET等等;一部分聊天软件中除了采用TCP通讯方式外,也采用了UDP的传输方式,如QQ/SKYPE等;而常见的ICMP包是由客户 的Ping产生的。设置界面如下: IP过滤 “IP过滤”在捕包过滤使用最为常见,IP匹配主要分两类:一是不带通讯方向,单纯的是范围的匹配,如上图中的“From:to”类型;另外一类是带通讯 方向的一对一匹配,如上图“< -- >”类型,不仅匹配IP地址,也匹配通讯的源IP和目标IP的方向。 端口过滤 “端口过滤”只针对两种类型的DoD-IP包:TCP/UDP。 数据区大小 “数据区大小” 的匹配针对所有DoD-IP类型包,不过需要说明的是,TCP/UDP的IP数据区是以实际数据区位置开始计算的,而其他类型的则把紧随IP包头后面的部分当作数据区。 数据块匹配 “数据块匹配”较为复杂,但却非常有用,设置界面如下: 在这里,用户可以输入文本,也可以输入二进制,可以选择特定位置的匹配,也可以选择任意位置的匹配,总之,该设置非常灵活好用。 结束条件 如下图,缺省条件下,当捕获的包占用空间多余10M时,自动停止。 结束于某个时间,是指捕包的截止时间。 分析捕获包 用户按下“开始”按钮启动捕包功能后,列表框中会自动显示出符合条件的数据包,并附带简单的解析。用鼠标右键击内容,弹出下图中的菜单: 选中“分析”,出现下面的画面: 上图中,左边和右下部分是分析结果,右上部是原始二进制代码,选中左边某一条目时,在右边二进制区域的色块和其一一对应。 如果用户以前少有接触协议分析部分,IPTOOL可以很好地协助您深入了解TCP/IP协议。我们将在网站定期提供一些捕获样例包,协助用户学习分析各种类型的IP包。 下载使用免费的绿色IP抓包工具--击下载iptool 欢迎用户访问《网路岗》官方产品网站http://www.softbar.com免费下载试用网路岗7局域网管理软件来监控管理您公司的网络,《网路岗》上网行为管理软件具有邮件监控、网络流量监控、聊天监控、上网监控等功能,使用网路岗上网行为管理软件可以让您更安全更快速的管理控制论公司员工的上网行为。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值