功能

@网络数据包的截取
扫描主机上的网络接口,使用Libcap 库截取数据报文
@主机端口扫描
指定要扫描的主机,以及要扫描的端口范围,构造TCP 数据报文,扫描目标主机端
@返回端口状态,端口服务类型
网络层数据报文分析
@分析数据报文,处理IP,ARP,RARP 数据报文
将IP 数据报文交给下一层再做进一步分析
@传输层数据报文分析
分析TCP,UDP,ICMP,IGMP 数据报文,将分析结果记录在日志文件中。
@查找网关
查找本地地址的网关,返回路由表,网关

模块分解:
程序入口main.c
嗅探程序sniffer.c
处理以太网层数据包ethernet.c
处理tcp 数据包tcp.c
处理udp 数据包udp.c
处理icmp 数据包icmp.c
处理arp 数据包arp.c
处理端口扫描port.c
处理查找网关gateway.c
工具common.c

准备工作:
1>了解libpcap库:

***libpcap的抓包框架:***
pcap_lookupdev():函数用来查找网络设备,返回可被pcap_open_live()函数调用的网络设备名指针。
pcap_lookupnet():函数获得指定网络设备的网络号和掩码。
pcap_open_live():函数用于打开设备,并且返回用于捕获网络数据包的数据包捕获描述字。对于此网络设备的操作都要基于此网络设备描述字。
pcap_compile():函数用于将用户制定的过滤策略编译到过滤程序中
pcap_setfilter():函数用于设置过滤器
pcap_loop():与pcap_next()和pcap_next_ex()两个函数一样用来捕获数据包
pcap_close():函数用于关闭网络设备,释放资源///////////////////////////////////////
***libpcap使用步骤***打开网络设备==>设置过滤规则==>捕获数据==>关闭网络设备

2>libpcap细节

@获取网络设备接口:char *pcap_lookupdev(char * errbuf);
功能:自动获取可用的网络设备名指针
参数:errbuf,存放出错信息字符串
成功返回设备名指针(第一个合适的网络接口的字符串指针),失败则返回NULL,同时,errbuf存放出错信息字符串////////////////////////////////////////////@获取网络号(ip地址)和掩码:int pcap_lookupnet(char* device,bpf_u_int32 *netp,bpf_u_int32 *maskp,char *errbuf);
功能:获取指定网卡的ip地址,子网掩码
device:网络设备名,为第一步获取的网络接口字符串,也可以人为指定,如“eth0”
netp  :存放ip地址的指针,buf_u_int32为32位无符号整型
maskp :存放子网掩码的指针
errbuf:存放出错信息
返回值 :成功返回0,失败返回1///////////////////////////////////////////@打开网络接口:pcap_t *pcap_open_live(const char * device,int snaplen,int promisc,int to_ms,char *errbuf);
功能:打开一个用于捕获数据的网络端口
device:网络接口的名字,为第一步获取的网络接口字符串,也可以人为指定
snaplen:捕获数据包的长度,不能大于65535个字节
promise:”1“代表混杂模式,其他值代表非混杂模式
to_ms  :等待毫秒数,超时间,获得数据包的函数会立即返回,0表示一直等待
errbuf :存储错误信息
返回值:返回pcap_t类型指针,后面的所有操作都要使用这个指针。///////////////////////////////////////////////@获取数据包:**方法一**:
const u_char *pcap_next(pcap_t *p,struct pcap_pkthdr *h);
功能:捕获一个网络数据包,收到一个数据包立即返回
p:pcap_open_live()返回的pcap_t类型的指针        h:数据包头struct pcap_pkthdr  {  struct timeval ts; // 抓到包的时间  bpf_u_int32 caplen; // 表示抓到的数据长度  bpf_u_int32 len; // 表示数据包的实际长度  }
len和caplen的区别:因为在某些情况下不能保证捕获的包是完整的,例如一个包长1480,但是你捕获到1000的时候,可能因为某些原因就终止捕获了,所以caplen是记录实际捕获的包长,也就是1000,而len就是1480
返回值:成功则返回捕获数据包的地址,失败返回NULL**方法二**
int pcap_loop(pcap_t *p,int cnt,pcap_handler callback,u_char *user);
功能:循环捕获网络数据包,直到遇到错误或者满足退出条件,每次捕获一个数据包就会调用callback指定的回调函数,所以,可以在回调函数中进行数据包的处理操作。p:pcap_open_live()返回的pcap_t类型的指针
cnt:指定捕获数据包的个数,一旦抓到cnt个数据包,pcap_loop立即返回,如果是-1,就会一直捕获直到出错
callback:回调函数,名字任意,根据需要自行取名
user:向回调函数中传递的参数callback回调函数的定义:
void callback(u_char *userarg,const struct pcap_pkthdr *pkthdr,const u_char *packet)
userarg:pcap_loop()的最后一个参数,当收到足够数量的包后pcap_loop会调用callback回调函数,同时将pcap_loop()的user参数传递给它
pkthdr:是收到数据包的pcap_pkthdr类型的指针,和pcap_next()第二个参数是一样的
packet:收到的数据包数据
返回值:成功返回0,失败返回负数**方法三**int pcap_dispatch(pcap_t *p,int cnt,pcap_handler callback,u_char *user);
这个函数和pcap_loop()非常类似,只是在超过to_ms毫秒后就会返回(to_ms是pcap_open_live()的第四个参数)////////////////////////////////////////////***释放网络接口***
void pcap_close(pcap_t *p);
功能:关闭pcap_open_live()打开的网络接口,并释放相关资源
参数:p:需要关闭的网络接口,pcap_open_live()的返回值/////////////////////////////////////////////@过滤数据包:int pcap_setfilter(pcap_t *p,struct bpf_program *fp);
功能:应用BPF过滤规则
p :pcap_open_live()返回的pcap_t类型的指针
fp:pcap_compile()的第二个参数
返回值:成功返回0,失败返回-1

网络嗅探器设计(一)相关推荐

  1. 基于winpcap的网络嗅探器设计与实现

    第一章 摘要 随着网络的普及和网络技术的发展,网络已经成为了人们日常生活和工作中不可获缺的一部分,越来越多的信息和资源放到了互联网上,网络的安全性和可靠性变得越来越重要,因此,对于能够分析.诊断网络, ...

  2. 基于C语言实现的网络嗅探器设计课程设计

    资源下载地址:https://download.csdn.net/download/sheziqiong/86805873 资源下载地址:https://download.csdn.net/downl ...

  3. 网络嗅探器设计(二)

    //系统和本机信息===>#include<sys/utsname.h>struct utsname { char sysname[_UTSNAME_SYSNAME_LENGTH]; ...

  4. 计算机网络课程设计之网络嗅探器的设计与实现

    前言 本实验难点是在于Windows下的raw socket有太多的限制,因此用winpcap编程功能更加强大,但是根据指导书要求要用原始套接字,原始套接字在Linux系统下也十分强大,结尾附上Lin ...

  5. 基于QT的网络嗅探器实现(网络安全课程设计)

    在这学期的网络安全课程设计中,我们需要自己实现一个基于WinPcap编程接口的网络嗅探器,历时两周完成,主要参考资料: 1.WinPcap 中文技术文档(http://www.ferrisxu.com ...

  6. 网络嗅探器的设计与实现 python实现 计算机网络课程设计

    实验内容 设计一个可以监视网络的状态.数据流动情况以及网络上传输 的信息的网络嗅探器 代码 import socket import threading import time import logg ...

  7. (网络实验)基于Jnetpcap的网络嗅探器(抓包程序)设计与实现

    基于Jnetpcap的网络嗅探器(抓包程序)设计与实现 作者:程哥哥 学号:xxxx 引言: 此程序是由自己编写的个人网络嗅探器,相当于著名的包捕获软件Wireshark的简化版,界面参考至别人的博客 ...

  8. 网络嗅探器的设计开发------C++

    第1章 网络嗅探器的测试与分析 1.1 嗅探器分析 1:基于数据库的用户登录界面 在注册的时候,就将用户所注册的信息加载到数据库中(用户的密码为了保正数据的CIA特性,在加入数据库的时候我使用了MD5 ...

  9. 计网实验c/c++、网络嗅探器的设计与实现

    参照附录 4 raw socket 编程例子,设计一个可以监视网络的状态.数据流动情况以及网络上传输 的信息的网络嗅探器. 显示了流量信息,若要查看报文信息请修改注释. 自动获取ip #include ...

最新文章

  1. 面试:5 亿整数的大文件,来排个序?
  2. 为什么Jedis操作后要主动归还?
  3. 在什么的控制下 计算机系统能及时处理,操作系统练习题(1)
  4. 剑指Offer - 面试题13. 机器人的运动范围(BFS/DFS)
  5. java重定向cookie_response请求转发和重定向,cookie
  6. 火星人(洛谷-P1088)
  7. C语言丨定积分的近似计算
  8. maven 排除某个类_java-如何从Maven依赖项中排除某些程序包(在JAR中)?
  9. 【教育知识与能力】人物总结
  10. SNN、RNN、CNN
  11. SX1278 FSK 调试记录
  12. 百度地图查看导航记录,导航路线,记录驾驶路线
  13. 【AMD和CMD的区别】
  14. java-IO流-输入输出流-复制文件问题
  15. python经典代码
  16. woj 1537 Stones I
  17. echarts 省级地图下钻到市demo
  18. 【信息系统项目管理师】第十四章 信息文档管理和配置管理(考点汇总篇)
  19. 2019中国互联网300强
  20. 亲历NSDI 2013

热门文章

  1. GPRS的工作原理、主要特点(转自aerkate)
  2. 程序员创业必读的几本书
  3. 青云志 java_青云志手游纯手工架设含本地注册教程
  4. Android BroadcastReceiver详解
  5. FPGA数字系统设计(9)——信号产生
  6. 极限交付:软件项目外包成功的保障
  7. ks:能定阈值的评价指标
  8. C#画K线实现画K线和截图保存
  9. 通过HFS低成本搭建NAS,并内网穿透实现公网访问 2/2
  10. 北航2018计算机学院录取名单,【北航2018年拟录取硕士研究生名单公示】- 环球网校...