用C++抓取网络数据包--嗅探器的设计原理

C++抓取网络数据 用C++实现网络编程---抓取网络数据包的实现方法   一般都熟悉sniffer这个工具,它可以捕捉流经本地网卡的所有数据包。抓取网络数据包进行分析有很多用处,如分析网络是否有网络病毒等异常数据,通信协议的分析(数据链路层协议、IP、UDP、TCP、甚至各种应用层协议),敏感数据的捕捉等。下面我们就来看看在windows下如何实现数据包的捕获。 下面先对网络嗅探器的原理做简单介绍。 嗅... 阅读详情
嗅探器作为一种网络通讯程序,也是通过对网卡的编程来实现网络通讯的,对网卡的编程也是使用通常的套接字(socket)方式来进行。但是,通常的套接字程序只能响应与自己硬件地址相匹配的或是以广播形式发出的数据帧,对于其他形式的数据帧比如已到达网络接口但却不是发给此地址的数据帧,网络接口在验证投递地址并非自身地址之后将不引起响应,也就是说应用程序无法收取到达的数据包。而网络嗅探器的目的恰恰在于从网卡接收所有经过它的数据包,这些数据包即可以是发给它的也可以是发往别处的。显然,要达到此目的就不能再让网卡按通常的正常模式工作,而必须将其设置为混杂模式。
具体到编程实现上,这种对网卡混杂模式的设置是通过原始套接字(raw socket)来实现的,这也有别于通常经常使用的数据流套接字和数据报套接字。在创建了原始套接字后,需要通过setsockopt()函数来设置IP头操作选项,然后再通过bind()函数将原始套接字绑定到本地网卡。为了让原始套接字能接受所有的数据,还需要通过ioctlsocket()来进行设置,而且还可以指定是否亲自处理IP头。至此,实际就可以开始对网络数据包进行嗅探了,对数据包的获取仍象流式套接字或数据报套接字那样通过recv()函数来完成。但是与其他两种套接字不同的是,原始套接字此时捕获到的数据包并不仅仅是单纯的数据信息,而是包含有 IP头、 TCP头等信息头的最原始的数据信息,这些信息保留了它在网络传输时的原貌。通过对这些在低层传输的原始信息的分析可以得到有关网络的一些信息。由于这些数据经过了网络层和传输层的打包,因此需要根据其附加的帧头对数据包进行分析。下面先给出结构.数据包的总体结构:
数据包
IP头 TCP头(或其他信息头) 数据

数据在从应用层到达传输层时,将添加TCP数据段头,或是UDP数据段头。其中UDP数据段头比较简单,由一个8字节的头和数据部分组成,具体格式如下:
16位 16位
源端口 目的端口
UDP长度 UDP校验和

而TCP数据头则比较复杂,以20个固定字节开始,在固定头后面还可以有一些长度不固定的可选项,下面给出TCP数据段头的格式组成:
16位 16位
源端口 目的端口
顺序号
确认号
TCP头长 (保留)7位 URG ACK PSH RST SYN FIN 窗口大小
校验和 紧急指针
可选项(0或更多的32位字)
数据(可选项)

对于此TCP数据段头的分析在编程实现中可通过数据结构_TCP来定义:
[cpp]  view plain  copy
  1. typedef struct _TCP{ WORD SrcPort; // 源端口  
  2. WORD DstPort; // 目的端口  
  3. DWORD SeqNum; // 顺序号  
  4. DWORD AckNum; // 确认号  
  5. BYTE DataOff; // TCP头长  
  6. BYTE Flags; // 标志(URG、ACK等)  
  7. WORD Window; // 窗口大小  
  8. WORD Chksum; // 校验和  
  9. WORD UrgPtr; // 紧急指针  
  10. } TCP;  
  11. typedef TCP *LPTCP;  
  12. typedef TCP UNALIGNED * ULPTCP;  



在网络层,还要给TCP数据包添加一个IP数据段头以组成IP数据报。IP数据头以大端点机次序传送,从左到右,版本字段的高位字节先传输(SPARC是大端点机;Pentium是小端点机)。如果是小端点机,就要在发送和接收时先行转换然后才能进行传输。IP数据段头格式如下:
16位 16位
版本 IHL 服务类型 总长
标识 标志 分段偏移
生命期 协议 头校验和
源地址
目的地址
选项(0或更多)

同样,在实际编程中也需要通过一个数据结构来表示此IP数据段头,下面给出此数据结构的定义:
[cpp]  view plain  copy
  1. typedef struct _IP{  
  2. union{ BYTE Version; // 版本  
  3. BYTE HdrLen; // IHL  
  4. };  
  5. BYTE ServiceType; // 服务类型  
  6. WORD TotalLen; // 总长  
  7. WORD ID; // 标识  
  8. union{ WORD Flags; // 标志  
  9. WORD FragOff; // 分段偏移  
  10. };  
  11. BYTE TimeToLive; // 生命期  
  12. BYTE Protocol; // 协议  
  13. WORD HdrChksum; // 头校验和  
  14. DWORD SrcAddr; // 源地址  
  15. DWORD DstAddr; // 目的地址  
  16. BYTE Options; // 选项  
  17. } IP;   
  18. typedef IP * LPIP;  
  19. typedef IP UNALIGNED * ULPIP;  



在明确了以上几个数据段头的组成结构后,就可以对捕获到的数据包进行分析了。
理解什么是DSR,嗅探器视角下的IP和MAC地址识别(C/C++代码实现) 网络嗅探器工作原理基于网卡的工作模式。正常情况下,网卡只处理发送给它的数据包,忽略其他数据。但是,如果将网卡设置为“混杂模式”,那么它可以接收到网络上所有的数据包,而不仅仅是发给它的数据包。网络嗅探器就是利用了这一特性来捕获网络上的数据交换。 阅读详情

相关推荐

VC++网络嗅探器的设计与实现(源代码及全套资料)

VC++网络嗅探器的设计与实现(源代码及全套资料)

嗅探原理与反嗅探技术详解

一.嗅探器的基础知识 1.1 什么是嗅探器? 嗅探器的英文写法是Sniff,可以理解为一个安装在计算机上的窃听设备它可以用来窃听计算机在网络上所产生的众多的信息。简单一点解释:一部电话的窃听装置, 可以用来窃听双方通话的内容,而计算机网络嗅探器则可以窃听计算机程序在网络上发送和接收到的数据。 可是,计算机直接所传送的数据,事实上是大量的二进制数据。因此, 一个网络窃听程序必须也使用特定的网络协议来

anonfan的专栏 1583

用C++实现的对网络上的ARP数据包进行解析

本课程设计的目的是设计一个系统,它能够实现对网络上的ARP数据包的解析,从而熟悉ARP数据包的结构,对ARP协议有更好的理解和认识。了解并熟悉Microsoft Visual C++ 6.0开发环境的使用,在该软件平台上进行工程的建立和程序开发,理解和掌握C++语言的程序设计和针对一些常用的网络协议的编程。

Linux下C/C++数据包嗅探(Sniffer)

一旦处于混杂模式,数据包嗅探器的功能就变成了分离、重组和记录所有通过接口的软件数据包的问题,而不管它们的目的地址如何。先在另一个终端执行写好的my_ping命令,然后在另一个终端运行一个嗅探-伪造程序,当监听到此局域网上有ICMP请求报文,便立即使用伪造技术来进行一个响应,并且伪造的ICMP回复数据包与正确的ICMP回复数据包不应该有过大的区别,使得不易被察觉。嗅探器的正当用处在于分析网络的流量,以便找出所关心的网络中潜在的问题。ICMP协议有一个名为type的字段,表示ICMP数据包的类型。

chen1415886044的博客 2513

c++ TCP/IP服务器程序

c++代码,自测通过,测试网络连接是否正常,仅供参考。

基于MFC的TCP调试助手源码

自己用VS2010做的一个小工具,可以方便调试网络应用程序,同时支持TCP和UDP通信,能够发送16进制和显示16进制,该资源包含源码,可以方便大家学习与修改其中的不足。

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

第1章 网络嗅探器的测试与分析1.1 嗅探器分析1:基于数据库的用户登录界面 在注册的时候,就将用户所注册的信息加载到数据库中(用户的密码为了保正数据的CIA特性,在加入数据库的时候我使用了MD5加密算法,在用户组成的时候,江永输入的密码进行MD5的加密,在数据库中进行遍历遍历操作,找到就能够进入下一个界面,不能进入时系统将根据匹配的结果进行系统提示)2:进入用户的选择界面,此时只有一个选项(用于...

qq_42211587的博客 3755

从零开始掌握OBD-II:汽车诊断开发的核心技术与实战解析

本文深入解析OBD-II汽车诊断系统的核心技术,包括ECU通信协议、故障码解析及诊断工具开发实战。通过详细的协议分析和代码示例,帮助开发者快速掌握汽车诊断开发技能,实现从零到精通的进阶。特别适合从事汽车电子开发和OBD检测的技术人员参考学习。

weixin_42528780的博客 438

数据包嗅探原理介绍

首先介绍了网卡的工作原理,嗅探需要网卡的工作模式(杂乱模式/监控模式)。 为了提早过滤过滤不需要的数据包,介绍了BPF。 接着用三种方式:普通套接字,原生套接字,pcap API,递进的讲述了包的嗅探过程。

大草的博客 4220

Spring Authorization Server自定义密码模式:突破标准OAuth2限制,实现MFA与复杂业务集成

OAuth 2.0授权框架是构建现代应用安全体系的基石,其密码模式(Resource Owner Password Credentials Grant)提供了一种直接的资源所有者凭证交换令牌的机制。该模式的核心原理是客户端收集用户密码并直接向授权服务器请求访问令牌,适用于受信任的客户端场景。在技术价值上,它简化了某些传统应用的OAuth集成流程。然而,标准实现往往难以满足复杂的现实业务需求,例如需要集成多因素认证(MFA)、对接外部LDAP目录服务或执行自定义密码加密校验等场景。Spring Authori

weixin_34302561的博客 437

Ollama模型路径迁移实战:Windows/Mac/Linux三系统保姆级教程(附常见问题排查)

本文提供了一份详细的Ollama模型路径迁移教程,涵盖Windows、macOS和Linux三大操作系统。针对默认安装路径占用系统盘空间的问题,文章指导用户如何安全移动模型文件、配置环境变量、重启服务,并附有迁移后的验证步骤与常见问题排查方法,帮助用户高效管理本地AI模型存储。

gray5的博客 538

网络嗅探器设计实验

一、实验环境: (1)Windows 10 系统平台; (2)在VS环境下进行C++编程。 二、课程目的: (1)参照有关书籍,掌握有关网络通信基本原理; (2)学习网络嗅探器的概念及其工作原理; (3)掌握嗅探器的程序设计。 三、基本原理: 网络嗅探器又称为网络监听器,简称为Sniffer子系统,放置于网络节点处,对网络中的数据帧进行捕获的一种被动监听手段,是一种常用的收集有用数据的方法,这些数据可以是用户的账号和密码,可以是一些商用机密数据等等。Sniffer是利用计算机的网络接口截获目的地为其他计算

山山の十三先生 5828

MuJoCo 仿真中的碰撞检测与参数优化实战

本文深入解析MuJoCo仿真中的碰撞检测机制与参数优化策略,涵盖位掩码配置、凸包分解实战及穿模问题解决方案。通过具体案例和参数设置建议,帮助开发者高效解决机械臂抖动、轴孔装配等常见问题,提升仿真精度与稳定性。特别针对步进电机仿真提供了高增益位置执行器的优化方案。

weixin_29081101的博客 332

用C++实现网络编程---抓取网络数据包的实现方法

  一般都熟悉sniffer这个工具,它可以捕捉流经本地网卡的所有数据包。抓取网络数据包进行分析有很多用处,如分析网络是否有网络病毒等异常数据,通信协议的分析(数据链路层协议、IP、UDP、TCP、甚至各种应用层协议),敏感数据的捕捉等。下面我们就来看看在windows下如何实现数据包的捕获。 下面先对网络嗅探器的原理做简单介绍。 嗅探器设计原理   嗅探器作为一种网络通讯程序,也...

dinaoju5134的博客 1010

告别瞎猜!用通达信/同花顺这些资金流向函数,一眼看穿主力动向(附实战公式)

本文详细解析了通达信/同花顺资金流向函数的实战应用,帮助投资者精准识别主力动向。通过12个核心资金函数的组合逻辑,构建主力行为监控体系,避免未来函数陷阱,识别主力对倒行为,并提前捕捉异动。适合股票投资者提升自选股分析能力。

weixin_42522964的博客 1182

Python之achatbot包语法、参数和实际应用案例

本书是一本PyTorch深度学习实战指南,分为基础(前6章)和进阶(后5章)两大部分。基础部分涵盖张量运算、神经网络、数据预处理及CNN等核心内容;进阶部分则深入图像、文本、音频建模技术,重点解析Transformer架构及大语言模型开发。全书采用"理论+实践"模式,适合从零基础到进阶的PyTorch学习者。

王国平的博客 631

网络嗅探器的设计与实现

本节将对本设计中用到的一些主要技术进行简单的介绍。2.2.1 C#语言简介C#是微软于2000年提出的一种源于C++、类似于Java的面向对象编程语言,适合于分布式环境中的组件开发。C# 是专门为.NET设计的,也是.NET编程的首选语言。C#的产生是因为微软在.NET上需要一种类Java的语言,而Java本身却不能胜任这一需求。C#太像C++了,以至于它很难给人带来体验新事物时的那种兴奋。不过,绝大部分的C++开发者将会因为C#保留了C++中大部分其喜欢的、强大的、令人激动的功能而选择使用它。

qq_61141142的博客 1181

如何正确的计算两个角度的角度差?

这一步是必要的,因为它确保了无论a相对于b是在逆时针方向还是顺时针方向,d2总是正确地反映出绕圆相反方向的角度差。这样,当函数进行最后的比较时,它能够准确地比较两个方向的旋转路径并选择最短的一个。

小秋 AI SLAM 入门实战教程 4135

基于C#的网络嗅探器的设计与实现

数据在网络上是以很小的称为帧(Frame)的单位传输的,帧由几部分组成,不同的部分执行不同的功能。帧通过特定的称为网络驱动程序的软件进行成型,然后通过网卡发送到网线上,通过网线到达它们的目的机器,在目的机器的一端执行相反的过程。接收端机器的以太网卡捕获到这些帧,并告诉操作系统帧已到达,然后对其进行存储。就是在这个传输和接收的过程中,存在着安全方面的问题。每一个在局域网(LAN)上的工作站都有其硬件地址,这些地址唯一地表示了网络上的机器(这一点与Internet地址系统比较相似)。

qq_61141142的博客 607

orin+96712接GMSL2相机调试经验

orin gmsl camera调试

乐于分享 4455

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Linux C++网络嗅探器实战:从原始套接字到协议解析

网络数据包捕获是网络编程、安全分析和性能调优的基石。其核心原理在于绕过操作系统协议栈,直接从网卡获取原始数据帧。这项技术为深度网络监控、入侵检测和协议分析提供了底层支持,广泛应用于网络安全、运维和开发调试场景。通过原始套接字(Raw Socket)实现数据包捕获,能让开发者透彻理解以太网帧、IP报文及TCP/UDP协议头的结构与解析过程。本文以C++实战为例,详细阐述了在Linux环境下构建轻量级网络嗅探器的完整流程,涵盖从创建AF_PACKET套接字、设置混杂模式,到逐层解析数据包并处理网络字节序等关键技

weixin_42531494的博客 323

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

上一篇: MAC、IP头、TCP头、UDP头帧格式、详解
下一篇: 网卡的几种工作模式
mincheat
博客等级 码龄17年 46粉丝 43原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值