本文使用libpcap库在linux下面开发自定义抓包工具,同学们也可以在win下编写同样的代码。

抓包的目的:

1、分析协议

2、伪造数据包

3、获取重要信息,例如用户名和密码

4、做某些攻击使用

抓包的工具

(1)Wireshark 可视化的工具

(2)Tcpdump

是命令行的工具。

(3)自定义抓包工具

原因1: 只抓取感兴趣的部分,去掉无关紧要的东西,为其他目的服务。

原因2:如果有别的目的,例如偷偷安装在别的机器上,有必要保持隐身,保持短小。

抓包工具的构造原理

(1)用原始套接字抓取所有的数据包,然后解析。

(2)使用现成的库来抓包。

Libpcap库,是在linux下面的一个库。如果是windows开发的话,可以使用wincap这个库。两个的函数等都是一样。

欢迎加入学习群【892643663】,获取全套免费C/C++企业实战级课程资源(素材+源码+视频)和编译大礼包

自定义抓包工具的编程过程

(1)想要抓到链路层的包,要打开网卡设备。(在linux下面会把所有的设备当成文件,linux的哲学之一)相当于从这个网卡文件里抓取文件内容。

(2)设置好过滤规则,只保留特定的包

(3)开始抓包,然后输出感兴趣的部分

代码#include

#include   //libpcap库的头文件

#include

#include   //ip协议定义

#include   //tcp协议定义

#include

#include

//用C语言手工写一个抓包工具

int main(void)

{

//1-1 找出可用的网卡

pcap_if_t *pcap_if;

char ErrorBuf[PCAP_ERRBUF_SIZE]={0};

int r=pcap_findalldevs(&pcap_if,ErrorBuf);//寻找所有网卡设备

if(r==-1) //异常

{

printf("finddev error\n");

return -1;//直接返回,不要再往下走

}

printf("第一个网卡的名字是%s\n",pcap_if[0].name);

printf("第二个网卡的名字是%s\n",pcap_if[1].name);

//1-2 打开那个网卡设备

pcap_t *handler;  //用来描述一个打开的网卡设备对象

handler=pcap_open_live(pcap_if[0].name,PCAP_BUF_SIZE,1,100,ErrorBuf);

if(handler==NULL)

{

printf("打开失败\n");

return -1;

}

//2 设置好过滤规则,只抓取tcp的包

unsigned int ip,mask;

r=pcap_lookupnet(pcap_if[0].name,&ip,&mask,ErrorBuf);

if(r==-1)

{

printf("ip获取失败");

return -1;

}

struct bpf_program prog;

r=pcap_compile(handler,&prog,"tcp",0,mask);//规则有n种写法,例如port 80表示抓取80端口的包

if(r==-1)

{

printf("编译失败\n");

return -1;

}

pcap_setfilter(handler,&prog);

//3 抓包

struct pcap_pkthdr pkhdr;//包的信息

while(1)

{

const unsigned char *packet=pcap_next(handler,&pkhdr);//一行就可以拿到一个包

if(packet==NULL)

{

pcap_close(handler);

break;

}

//将包的信息打出来

printf("包的长度是%d\n",pkhdr.len);

// int i;

// for(i=0;i

// {

//     printf("%02x ",packet[i]);

// }

// printf("\n");

//4 输出感兴趣的部分

//例如,只输出包的源头,目标的ip和端口

//包由链路层14个字节+ip层20字节+后面的tcp数据组成

struct ip *ip=(struct ip *)(packet+14);

struct tcphdr *tcp=(struct tcp *)(packet+14+20);

char ipsrc[30],ipdst[30];

//strcpy(ipsrc,inet_ntoa(ip->ip_src));

inet_ntop(AF_INET,&ip->ip_dst,ipsrc,30);

strcpy(ipdst,inet_ntoa(ip->ip_dst));

printf("%s(%d)=====>%s(%d)\n",ipsrc,ntohs(tcp->th_sport),ipdst,ntohs(tcp->th_dport));

}

}

欢迎加入学习群【892643663】,获取全套免费C/C++企业实战级课程资源(素材+源码+视频)和编译大礼包

linux下c语言抓包,C语言实现抓包工具相关推荐

  1. linux 监控微信通知,一个 Linux 下基于 Bash 的文件和数据库监控及备份工具,可发送微信报警通知...

    shellMonitor 一个 Linux 下基于 bash 的文件和数据库监控及备份工具. 写这个工具的原因,在于一个朋友的一个小电商网站,因为未明原因被黑了,总是会被增加超级管理员,并将收款账号改 ...

  2. linux mcrypt扩展,Linux下php安装mcrypt扩展-Go语言中文社区

    说明: 操作系统:CentOS 5.x 64位 已安装php版本:php-5.4.4 已安装php路径:/usr/local/php 实现目的: 在不影响网站访问的情况下,重新编译php,增加对mcr ...

  3. linux获取网卡协议地址,读取linux下的网络设备的mac地址与发送原始数据包 (2011-11-23 20:11)...

    一:linux下的网络设备 linux的网络设备信息都在/proc/net/dev,从这里我们可以得到所有网卡的名字,如eth0, eth1等等 root@dlrc-desktop:/home/dlr ...

  4. Linux下Netfilter创建自己的Hook,让数据包可以发送到用户层,然后统计节点负载信息

    Linux下Netfilter创建自己的Hook函数,让数据包可以发送到用户层,然后统计节点的负载信息 写在最前面,我的linux内核版本是4.4.0-31-generic,版本是Ubuntu 16. ...

  5. linux默认编译多核,[转载]【原创】Linux下安装单机多核并行lammps(附meam包)

    总结:Linux下安装单机并行lammps ○.机器配置: 1.处理器:Intel XEON × 2 2.主板:Intel S5500BC 3.内存:金士顿4G × 6 4.操作系统:Redhat E ...

  6. linux如何解压deb文件,Linux下常用文件解压(包括rpm、deb包的解压方法!)

    Linux下常用文件解压 inux下怎么解后缀名是gzip的文件? 1.以.a为扩展名的文件: #tar xv file.a 2.以.z为扩展名的文件: #uncompress file.Z 3.以. ...

  7. Linux下几款C++程序中的内存泄露检查工具

    Linux下编写C或者C++程序,有很多工具,但是主要编译器仍然是gcc和g++.最近用到STL中的List编程,为了检测写的代码是否会发现内存泄露,了解了一下相关的知识. 所有使用动态内存分配(dy ...

  8. noi linux下如何安装视频播放器 和 播放swf文件的工具

    因为考试需要,孩子们必须要在赛前掌握使用noilinux了,可是使用起来诸多不方便,这不,在linux里用什么看视频和swf教程呢. 下面提供我搜集到的方法: 1.用noilinux自带的smplay ...

  9. Linux下生产者消费者问题的C语言实现

    注:查看全文请关注作者,或点击前往:生产者-消费者问题的C语言实现 实验六 生产者-消费者问题实现 实验题目 要求 在Linux操作系统下用C实现经典同步问题:生产者-消费者,具体要求如下: (1) ...

  10. linux进程退出没有log,Linux下应用进程消失原因分析-Go语言中文社区

    应用部署在Linux环境下,如果出现未知原因导致应用进程被杀(应用日志中没有任何异常现象,日志出现中断现象),如果对于进程消失原因没有特别明确的方向,可以考虑从系统日志(/var/log/messag ...

最新文章

  1. 管理本地多个SSH Key
  2. IOS设备唯一标示符的方案比较
  3. java 按钮设置图片_Java中如何设置带图片按钮的大小
  4. 【无标题】VUE 强行加载demo元素
  5. 使用Android自带DownloadManager下载文件
  6. Flex3与BlazeDS HelloWorld 详解
  7. rrpp协议如何修改_RRPP协议做为高级网络工程师不能不懂的技术带你快速学习
  8. POJ 2635 The Embarrassed Cryptographer(JAVA)
  9. ppocr 源码阅读:ppocr.modeling.architecures 之build_model模块
  10. 【NLP】揭秘马尔可夫模型神秘面纱系列文章(四)
  11. java自学能学会吗_Java自学能学会吗?Java新手学习路线
  12. android之LitePal 3.0 的基本使用
  13. 多多客API SDK【拼多多开放平台】
  14. Android读出Excel报表数据然后导出写入到SQLite数据库
  15. GDOC CEO Musk Shing出席“链接未来”区块链全球人才交流会
  16. Business English-Unit 4 Memos -B
  17. 《计算机视觉工程师养成计划 》·数字图像处理·数字图像特征·链码
  18. 笔记本电脑维修90个精选实例
  19. 【Python学习笔记】36:抓取去哪儿网的旅游产品数据
  20. Ubutun20.0.4搭建Opengrok1.3.16查看Android源码

热门文章

  1. python实现链表的删除_Python 实现简易版成绩管理系统
  2. 分治法(03几何问题)凸包问题
  3. 什么是ChaGpt?
  4. 广义表的长度和广义表的深度
  5. 一文彻底搞懂ssh的端口转发
  6. LevelDb日知录
  7. windows找不到文件cmd怎么办?
  8. 纵使三度被拒,21岁溘然长逝,他依然成为数学史上最璀璨的天才
  9. centos8恢复出厂设置_CentOS 8 安装后的系统初始化
  10. 区间估计——置信区间