Qt开发网络嗅探器03

简介: Qt开发网络嗅探器03

数据包分析

想要知道如何解析IP数据包,就要知道不同的IP数据包的包头结构,于是我们上⽹查查资料:

以太网数据包

ARP数据包

IPv4

IPv6

TCP

UDP

ICMP

ICMPv6

根据以上数据包头结构,我们就有了我们的protocol.h文件,声明各种数据包:

#ifndef PROTOCOL_H
#define PROTOCOL_H
#define HAVE_REMOTE
#define PROTO_ICMP 1
#define PROTO_TCP 6
#define PROTO_UDP 17
#include <iostream>
#include <QObject>
#include "_bsd_types.h"
#include "pcap.h"
using namespace std;
//IPV4
typedef struct ip_address{
    u_char byte1;
    u_char byte2;
    u_char byte3;
    u_char byte4;
}ip_address;
typedef struct ipv6_address
{
    u_char byte1;
    u_char byte2;
    u_char byte3;
    u_char byte4;
    u_char byte5;
    u_char byte6;
    u_char byte7;
    u_char byte8;
}ipv6_address;
typedef struct ipv4_header{
    u_char ver_ihl;
    u_char tos;
    u_short tlen;
    u_short Identification;
    u_short flags_fo;
    u_char ttl;
    u_char proto;
    u_short crc;
    ip_address srcaddr;
    ip_address dstaddr;
    u_int op_pad;
}ipv4_header;
typedef struct ipv6_header{
    u_int ver:4,
        flowtype:8,
        flowtip:20;
    u_short len;
    u_char pnext;
    u_char lim;
    ipv6_address srcaddr;
    ipv6_address dstaddr;
}ipv6_header;
typedef struct tcp_header{
    u_short srcport;
    u_short dstport;
    u_int seq;
    u_int ack_seq;
    u_short resl:4,
        doff:4,
        fin:1,
        syn:1,
        pst:1,
        psh:1,
        ack:1,
        urg:1,
        ece:1,
        cwr:1;
    u_short window;
    u_short check;
    u_short urg_ptr;
    u_int opt;
}tcp_header;
typedef struct udp_header{
    u_short srcport;
    u_short dstport;
    u_short tlen;
    u_short crc;
}udp_header;
typedef struct icmp_header{
    u_char type;
    u_char code;
    u_char seq;
    u_char crc;
}icmp_header;
typedef struct icmp6_header{
    u_char type;
    u_char code;
    u_char seq;
    u_char crc;
    u_char op_type;
    u_char op_len;
    u_char op_ethaddr[6];
}icmp6_header;
typedef struct pkg_count{
    int n_tcp;
    int n_udp;
    int n_icmp;
    int n_icmp6;
    int n_http;
    int n_arp;
    int n_ipv4;
    int n_ipv6;
    int n_other;
    int n_ttl;
}pkg_count;
typedef struct arp_header{
    u_short hardware;
    u_short proto;
    u_char ml;
    u_char ipl;
    u_short opt;
    u_char sm[6];
    ip_address sip;
    u_char dm[6];
    ip_address dip;
}arp_hearder;
typedef struct eth_header{
    u_char smac[6];
    u_char dmac[6];
    u_short type;
}eth_header;
typedef struct pkg_data
{
    QString pkgtype;
    int time[6];
    int len;
    
    eth_header *ethh;
    
    ipv4_header *ipv4h;
    ipv6_header *ipv6h;
    arp_header *arph;
    
    udp_header *udph;
    tcp_header *tcph;
    icmp_header *icmph;
    icmp6_header *icmp6;
    void *apph;
    
}pkg_data;
#endif // PROTOCOL_H

再对数据包的结构进行了解后,我们就需要对这些包进行解析,所以我们需要一个packettools类,里面用静态函数写出包的解析,供我们在别的地方调用:

#ifndef PACKETTOOLS_H
#define PACKETTOOLS_H
#include <QObject>
#include <QTextEdit>
#include "protocol.h"
#include "iostream"
using namespace std;
class PacketTools
{
public:
    static int unpcak_Frame(const u_char *pkg,
                             pkg_data *data,
                             pkg_count *pkgCnts);
    static int unpcak_Arp(const u_char *pkg,
                           pkg_data *data,
                           pkg_count *pkgCnts);
    static int unpack_Ip(const u_char *pkg,
                          pkg_data *data,
                          pkg_count *pkgCnts);
    static int unpack_Ipv6(const u_char *pkg,
                           pkg_data *data,
                           pkg_count *pkgCnts);
    static int unpack_Icmp(const u_char *pkg,
                            pkg_data *data,
                            pkg_count *pkgCnts);
    static int unpack_Icmp6(const u_char *pkg,
                            pkg_data *data,
                            pkg_count *pkgCnts);
    static int unpack_Tcp(const u_char *pkg,
                           pkg_data *data,
                           pkg_count *pkgCnts);
    static int unpack_Udp(const u_char *pkg,
                           pkg_data *data,
                           pkg_count *pkgCnts);
    static int pack_Print(u_char *pkg,
                           int size,
                          QTextEdit *edit);
};
#endif // PACKETTOOLS_H

主要一点就是要知道父类数据包的type字段对子类数据包的分类,然后将数据包拷贝储存到全局容器里面。

相关文章
|
25天前
|
Linux 开发工具 Android开发
FFmpeg开发笔记(六十)使用国产的ijkplayer播放器观看网络视频
ijkplayer是由Bilibili基于FFmpeg3.4研发并开源的播放器,适用于Android和iOS,支持本地视频及网络流媒体播放。本文详细介绍如何在新版Android Studio中导入并使用ijkplayer库,包括Gradle版本及配置更新、导入编译好的so文件以及添加直播链接播放代码等步骤,帮助开发者顺利进行App调试与开发。更多FFmpeg开发知识可参考《FFmpeg开发实战:从零基础到短视频上线》。
100 2
FFmpeg开发笔记(六十)使用国产的ijkplayer播放器观看网络视频
|
2天前
|
API
鸿蒙开发:切换至基于rcp的网络请求
本文的内容主要是把之前基于http封装的库,修改为当前的Remote Communication Kit(远场通信服务),无非就是通信的方式变了,其他都大差不差。
鸿蒙开发:切换至基于rcp的网络请求
|
1月前
|
XML 开发工具 Android开发
FFmpeg开发笔记(五十六)使用Media3的Exoplayer播放网络视频
ExoPlayer最初是为了解决Android早期MediaPlayer控件对网络视频兼容性差的问题而推出的。现在,Android官方已将其升级并纳入Jetpack的Media3库,使其成为音视频操作的统一引擎。新版ExoPlayer支持多种协议,解决了设备和系统碎片化问题,可在整个Android生态中一致运行。通过修改`build.gradle`文件、布局文件及Activity代码,并添加必要的权限,即可集成并使用ExoPlayer进行网络视频播放。具体步骤包括引入依赖库、配置播放界面、编写播放逻辑以及添加互联网访问权限。
126 1
FFmpeg开发笔记(五十六)使用Media3的Exoplayer播放网络视频
|
2月前
|
开发工具 C++
qt开发技巧与三个问题点
本文介绍了三个Qt开发中的常见问题及其解决方法,并提供了一些实用的开发技巧。
|
2月前
|
3月前
|
小程序 数据安全/隐私保护
Taro@3.x+Vue@3.x+TS开发微信小程序,网络请求封装
在 `src/http` 目录下创建 `request.ts` 文件,并配置 Taro 的网络请求方法 `Taro.request`,支持多种 HTTP 方法并处理数据加密。
120 0
Taro@3.x+Vue@3.x+TS开发微信小程序,网络请求封装
|
3月前
|
安全 网络安全 数据安全/隐私保护
网络安全与信息安全:关于网络安全漏洞、加密技术、安全意识等方面的知识分享安卓与iOS开发中的线程管理比较
【8月更文挑战第30天】本文将探讨网络安全与信息安全的重要性,并分享关于网络安全漏洞、加密技术和安全意识的知识。我们将了解常见的网络攻击类型和防御策略,以及如何通过加密技术和提高安全意识来保护个人和组织的信息安全。
|
3月前
|
安全 网络安全 Android开发
探索安卓开发之旅:从新手到专家网络安全与信息安全:防范网络威胁,保护数据安全
【8月更文挑战第29天】在这篇技术性文章中,我们将踏上一段激动人心的旅程,探索安卓开发的世界。无论你是刚开始接触编程的新手,还是希望提升技能的资深开发者,这篇文章都将为你提供宝贵的知识和指导。我们将从基础概念入手,逐步深入到安卓开发的高级主题,包括UI设计、数据存储、网络通信等方面。通过阅读本文,你将获得一个全面的安卓开发知识体系,并学会如何将这些知识应用到实际项目中。让我们一起开启这段探索之旅吧!
|
3天前
|
存储 SQL 安全
网络安全与信息安全:关于网络安全漏洞、加密技术、安全意识等方面的知识分享
【10月更文挑战第39天】在数字化时代,网络安全和信息安全成为了我们生活中不可或缺的一部分。本文将介绍网络安全漏洞、加密技术和安全意识等方面的内容,帮助读者更好地了解网络安全的重要性,并提供一些实用的技巧和方法来保护自己的信息安全。
14 2
|
4天前
|
安全 网络安全 数据安全/隐私保护
网络安全与信息安全:关于网络安全漏洞、加密技术、安全意识等方面的知识分享
【10月更文挑战第38天】本文将探讨网络安全与信息安全的重要性,包括网络安全漏洞、加密技术和安全意识等方面。我们将通过代码示例和实际操作来展示如何保护网络和信息安全。无论你是个人用户还是企业,都需要了解这些知识以保护自己的网络安全和信息安全。