Qt实现Windows下底层套接字抓包

一、分析

     根据需求我们可以得到,这个功能的实现需要这么几部分:UI、使用套接字抓包、将获取的数据与UI交互。我默认大家都熟悉Qt,对报文格式了解。

二、UI

     创建头文件和源文件,命名为CapturePacketWindow,并且公有继承QDialog,话不多说,直接上代码。

     Qt实现Windows下底层套接字抓包_第1张图片

 

Qt实现Windows下底层套接字抓包_第2张图片

Qt实现Windows下底层套接字抓包_第3张图片

Qt实现Windows下底层套接字抓包_第4张图片

效果如下:

Qt实现Windows下底层套接字抓包_第5张图片

三、使用套接字抓包(这个部分我会详细说明)

1、在.pro文件中添加如下代码

LIBS += libwsock32 libWs2_32
LIBS += libiphlpapi

这个是windows自带的库,我们需要添加一下

2、定义各种报文类型

Qt实现Windows下底层套接字抓包_第6张图片

Qt实现Windows下底层套接字抓包_第7张图片

Qt实现Windows下底层套接字抓包_第8张图片

3、抓包步骤描述

one:

这个地方的MAKEWORD(2,2)指的是第二个版本的套接字,详情参考微软开发人员手册https://docs.microsoft.com/zh-cn/windows/desktop/api/winsock2/nf-winsock2-wsaenumprotocolsa,我下面提到的各种函数在里面都有详细说明。

srand(0),不必理会,我做测试的时候用了一下。

Qt实现Windows下底层套接字抓包_第9张图片

tow:

  注意:打开Qt的时候要用管理员身份打开!!!不然会报错。socket函数的第一个参数是IPV4类型的意思,第二个是设置抓取包的格式,第三个是包的类型。这三个参数详情参考我上面提到的微软官方手册,可以看一下,很受用的。

Qt实现Windows下底层套接字抓包_第10张图片

three:

   HostName为char *类型的变量,memset()是一个拷贝复制函数,local保存获取到的本机的所有ip。然后利用while循环给addr中的s_addr赋值。如果不太明白原理的话,参考微软开发人员手册。

Qt实现Windows下底层套接字抓包_第11张图片

four:

   这个地方最重要的就是第二行的local->h_addr_list[1]。这个时候往上翻一下,也就是我在three中写的那个while循环。它会根据你主机上的ip给它赋值,比如说:我的主机上分别是以太网ip,宽带ip,无线网络ip,那么我这里的1就代表的是宽带的ip,意味着我后面要抓这个ip的包。你自己也可以根据自己主机的情况进行修改。然后设置抓取包的类型为ipv4族的包,端口号可以任意设置,因为我后面会设置为混杂模式。

five:

   这一步就是将我的套接字和本地ip绑定起来了,没啥好说的。

Qt实现Windows下底层套接字抓包_第12张图片

six:

 SIO_RCVALL这个参数是设置接受所有端口经过的包。如果对WSAIoctl有疑问可以参照微软开发人员手册,网址我在上面给出。到这里,所有初始化工作全部做完了,开始抓包,开心。

Qt实现Windows下底层套接字抓包_第13张图片

seven:

   定义各种指针来获取数据,然后写一个while循环,让它不停的抓包。这个地方的一些代码是我直接从网上搬的,我觉得最下面的计算各种包的长度有问题。应该让lenip减去ip头的长度才对,自己有点懒,没有测试。

Qt实现Windows下底层套接字抓包_第14张图片

  

Qt实现Windows下底层套接字抓包_第15张图片

eight:

   判断包的类型并分析,我再Qt中只分析了TCP包,其他的包在vs中分析,懒得没往Qt中写了。packetSize和analysisContent不用管,这些是我用来和ui进行交互的东西,我再后面会说到。

   Qt实现Windows下底层套接字抓包_第16张图片Qt实现Windows下底层套接字抓包_第17张图片

Qt实现Windows下底层套接字抓包_第18张图片

Qt实现Windows下底层套接字抓包_第19张图片

到此为止,抓包功能已经写完了,出现的问题总结一下:seven中的lenip问题;eight

中剩下的两个类型没往Qt中写;宽带的包可能会抓不到,原因没找到,提倡大家抓无线的包;建议先在vs中将该部分功能写完后再搬了过去,vs中要加上两行代码,附上头文件和vs中添加的部分代码

有点晚了,这次先写到这个地方。最后的交互其实蛮简单的,只需要注意开两个线程,一个抓包,另一个ui。

你可能感兴趣的:(Qt实现Windows下底层套接字抓包)