首页 > 编程语言 >添加TCP SYN扫描的Qt程序

添加TCP SYN扫描的Qt程序

时间:2024-12-08 21:28:44浏览次数:6  
标签:tcpHeader Qt SYN TCP ipHeader include

        在Qt框架中实现TCP SYN扫描需要使用Qt的网络模块(Qt Network)来发送和接收网络数据包。由于Qt本身并不直接支持底层网络操作(如直接发送原始数据包),因此我们需要结合使用Qt和一些底层网络库(如libpcapraw sockets)来实现这一功能。基于Qt的端口扫描程序的设计与实现-CSDN博客

        以下是一个基于Qt和raw sockets的TCP SYN扫描的简单实现示例。请注意,这个示例仅用于教育目的,实际使用时需要确保遵守相关法律法规。

1. 环境准备

确保你的开发环境已经安装了Qt和相关的开发工具。

2. 创建Qt项目

创建一个新的Qt控制台应用程序项目。

3. 添加必要的头文件

在你的项目中添加以下头文件:

#include <QCoreApplication>
#include <QDebug>
#include <QHostAddress>
#include <QNetworkInterface>
#include <QThread>
#include <QTimer>
#include <QDateTime>
#include <QSocketNotifier>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <netinet/tcp.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <cstring>

4. 实现TCP SYN扫描

以下是一个简单的TCP SYN扫描实现:

class TcpSynScanner : public QObject {
    Q_OBJECT

public:
    TcpSynScanner(QObject *parent = nullptr) : QObject(parent) {
        rawSocket = socket(AF_INET, SOCK_RAW, IPPROTO_TCP);
        if (rawSocket < 0) {
            qDebug() << "Failed to create raw socket";
            return;
        }
    }

    ~TcpSynScanner() {
        close(rawSocket);
    }

    void scan(const QString &targetIp, quint16 startPort, quint16 endPort) {
        struct sockaddr_in destAddr;
        memset(&destAddr, 0, sizeof(destAddr));
        destAddr.sin_family = AF_INET;
        destAddr.sin_addr.s_addr = inet_addr(targetIp.toStdString().c_str());

        for (quint16 port = startPort; port <= endPort; ++port) {
            destAddr.sin_port = htons(port);

            // Create TCP SYN packet
            char packet[4096];
            memset(packet, 0, sizeof(packet));
            struct iphdr *ipHeader = (struct iphdr *)packet;
            struct tcphdr *tcpHeader = (struct tcphdr *)(packet + sizeof(struct iphdr));

            // Fill IP header
            ipHeader->ihl = 5;
            ipHeader->version = 4;
            ipHeader->tos = 0;
            ipHeader->tot_len = sizeof(struct iphdr) + sizeof(struct tcphdr);
            ipHeader->id = htons(54321);
            ipHeader->frag_off = 0;
            ipHeader->ttl = 255;
            ipHeader->protocol = IPPROTO_TCP;
            ipHeader->check = 0;
            ipHeader->saddr = inet_addr("192.168.1.2"); // Source IP address
            ipHeader->daddr = destAddr.sin_addr.s_addr;

            // Fill TCP header
            tcpHeader->source = htons(12345); // Source port
            tcpHeader->dest = htons(port);
            tcpHeader->seq = htonl(123456);
            tcpHeader->ack_seq = 0;
            tcpHeader->doff = 5;
            tcpHeader->syn = 1;
            tcpHeader->window = htons(65535);
            tcpHeader->check = 0;
            tcpHeader->urg_ptr = 0;

            // Calculate TCP checksum
            tcpHeader->check = calculateTcpChecksum(ipHeader, tcpHeader);

            // Send packet
            if (sendto(rawSocket, packet, ipHeader->tot_len, 0, (struct sockaddr *)&destAddr, sizeof(destAddr)) < 0) {
                qDebug() << "Failed to send packet to port" << port;
            } else {
                qDebug() << "Sent SYN packet to port" << port;
            }

            // Wait for a short time before sending the next packet
            QThread::msleep(100);
        }
    }

private:
    int rawSocket;

    quint16 calculateTcpChecksum(struct iphdr *ipHeader, struct tcphdr *tcpHeader) {
        // This is a simplified checksum calculation for demonstration purposes
        // In a real implementation, you should calculate the checksum correctly
        return 0;
    }
};

int main(int argc, char *argv[]) {
    QCoreApplication a(argc, argv);

    TcpSynScanner scanner;
    scanner.scan("192.168.1.1", 1, 1024); // Scan ports 1 to 1024 on 192.168.1.1

    return a.exec();
}

#include "main.moc"

5. 编译和运行

编译并运行你的Qt项目。程序将向指定的目标IP地址发送TCP SYN数据包,并尝试探测开放的端口。

注意事项

  1. 权限问题:在Linux系统上,使用原始套接字需要root权限。
  2. 合法性:确保你只在授权的网络上进行此类操作。
  3. 校验和计算:上述代码中的校验和计算是简化的,实际应用中需要正确计算IP和TCP校验和。

通过这种方式,你可以在Qt中实现一个简单的TCP SYN扫描器。实际应用中,可能需要更复杂的逻辑来处理接收到的响应数据包,并正确解析它们以确定端口状态。

标签:tcpHeader,Qt,SYN,TCP,ipHeader,include
From: https://blog.csdn.net/2301_80892630/article/details/144332302

相关文章

  • Qt入门6——Qt窗口
    目录1.QMenuBar 菜单栏2.QToolBar工具栏 3.QStatusBar 状态栏 4.QDockWidget 浮动窗口5.QDialog 对话框 5.1Qt内置对话框1. QMessageBox消息对话框2.QColorDialog颜色对话框3. QFileDialog文件对话框4. QFontDialog字体对话框5. QInputDialo......
  • QT 6.8.0 QML 随笔 调用C++类
    1、开发环境QtCreator、QT6.8.0、CMake。2、添加新文件。3、 在头文件中定义一个intAdd(inta,intb);方法publicslots:intAdd(inta,intb);4、类文件.cpp中实现方法。#include"MyApp.h"#include<QDebug>intMyApp::Add(inta,intb){qDebug()<<a+......
  • 记一次线上高并发环境 TCP 握手丢包的故障处理
    背景业务场景需要有客户端通过tcp连接线上环境emqx集群环境,集群规模有5台node节点承载emqx业务,每台节点在业务端口上都有15w左右的tcp连接保持。近期发现与emqx相关的业务功能会出现间歇性的连接等待状态,索性运维同学在内网环境进行网络层的连接测试,确实复现了连接间......
  • 使用深度学习框架进行街景语义分割-数据准备、模型选择、模型训练、模型评估及如何使
    使用深度学习框架进行街景语义分割-数据准备、模型选择、模型训练、模型评估以及如何使用PyQt5构建一个简单的应用来展示分割结果街景语义分割数据集数据集:jingjingji,长三角,珠三角共49个城市群百度街景(全景)数据,50m采样。包含街景图像、shp、csv等数据处理结果文件。......
  • rsync+tls 远程数据同步加密传输(Rsync+tls Remote Data SynChronization Encrypted Tr
     ......
  • python: pyQt6 table paging
     #encoding:utf-8#版权所有2024涂聚文有限公司#许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎#描述:#Author:geovindu,GeovinDu涂聚文.#IDE:PyCharm2023.1python3.11#os:windows10#database:mysql9.0sqlserve......
  • python: Multi Document Interface (MDI) using PyQt6
     #encoding:utf-8#版权所有2024涂聚文有限公司#许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎#描述:pipinstallpyqt6#Author:geovindu,GeovinDu涂聚文.#IDE:PyCharm2023.1python3.11#os:windows10#database:my......
  • TCP的“可靠性”(上)
    目录TCP的“可靠性”(上)确认应答(可靠性传输的基础)超时重传连接管理(三次握手,四次挥手)TCP的“可靠性”(上)想必大家都或多或少的听说过TCP的特性:有连接,可靠传输,面向字节流,全双工本文重点讲讲TCP的“可靠性”网络通信过程是复杂的,无法确保发送方发送出去的数据,100%能够......
  • EMQ分布式MQTT消息服务器部署指南
    1.EMQ简介EMQ(ErlangMQTTBroker)是基于Erlang/OTP平台开发的开源MQTT消息服务器,支持百万级连接和分布式集群。主要特点:完整支持MQTTv3.1/v3.1.1/v5.0协议支持WebSocket协议支持分布式集群支持SSL/TLS加密传输提供Web管理控制台2.EMQ默认端口说明EMQ默认开......
  • QTTabBar | 实现“此电脑”在命令栏直接点击 以及点击 新标签页加号(+)的时候默认导航到
     1、如何实现点击上面命令栏目“此电脑”,并且在当前视图打开。  按照下面设置关键命令是:shell:::{20D04FE0-3AEA-1069-A2D8-08002B30309D}代表导航到【此电脑】  2、点击新标签页加号(+)的时候默认导航到“此电脑”视图,并且是当前视图(当前窗口不是新窗口)  ......