Qt实现Windows下底层套接字抓包
一、分析
根据需求我们可以得到,这个功能的实现需要这么几部分:UI、使用套接字抓包、将获取的数据与UI交互。我默认大家都熟悉Qt,对报文格式了解。
二、UI
创建头文件和源文件,命名为CapturePacketWindow,并且公有继承QDialog,话不多说,直接上代码。
效果如下:
三、使用套接字抓包(这个部分我会详细说明)
1、在.pro文件中添加如下代码
LIBS += libwsock32 libWs2_32
LIBS += libiphlpapi
这个是windows自带的库,我们需要添加一下
2、定义各种报文类型
3、抓包步骤描述
one:
这个地方的MAKEWORD(2,2)指的是第二个版本的套接字,详情参考微软开发人员手册https://docs.microsoft.com/zh-cn/windows/desktop/api/winsock2/nf-winsock2-wsaenumprotocolsa,我下面提到的各种函数在里面都有详细说明。
srand(0),不必理会,我做测试的时候用了一下。
tow:
注意:打开Qt的时候要用管理员身份打开!!!不然会报错。socket函数的第一个参数是IPV4类型的意思,第二个是设置抓取包的格式,第三个是包的类型。这三个参数详情参考我上面提到的微软官方手册,可以看一下,很受用的。
three:
HostName为char *类型的变量,memset()是一个拷贝复制函数,local保存获取到的本机的所有ip。然后利用while循环给addr中的s_addr赋值。如果不太明白原理的话,参考微软开发人员手册。
four:
这个地方最重要的就是第二行的local->h_addr_list[1]。这个时候往上翻一下,也就是我在three中写的那个while循环。它会根据你主机上的ip给它赋值,比如说:我的主机上分别是以太网ip,宽带ip,无线网络ip,那么我这里的1就代表的是宽带的ip,意味着我后面要抓这个ip的包。你自己也可以根据自己主机的情况进行修改。然后设置抓取包的类型为ipv4族的包,端口号可以任意设置,因为我后面会设置为混杂模式。
five:
这一步就是将我的套接字和本地ip绑定起来了,没啥好说的。
six:
SIO_RCVALL这个参数是设置接受所有端口经过的包。如果对WSAIoctl有疑问可以参照微软开发人员手册,网址我在上面给出。到这里,所有初始化工作全部做完了,开始抓包,开心。
seven:
定义各种指针来获取数据,然后写一个while循环,让它不停的抓包。这个地方的一些代码是我直接从网上搬的,我觉得最下面的计算各种包的长度有问题。应该让lenip减去ip头的长度才对,自己有点懒,没有测试。
eight:
判断包的类型并分析,我再Qt中只分析了TCP包,其他的包在vs中分析,懒得没往Qt中写了。packetSize和analysisContent不用管,这些是我用来和ui进行交互的东西,我再后面会说到。
、