首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

在Windows上使用C++检查特定打开的TCP端口

在Windows上使用C++检查特定打开的TCP端口,可以通过以下步骤实现:

  1. 导入必要的头文件和库:包括 <winsock2.h><ws2tcpip.h>,并链接 ws2_32.lib 库。
  2. 初始化 Winsock:调用 WSAStartup() 函数来初始化 Winsock 库。
  3. 创建套接字:使用 socket() 函数创建一个套接字,指定使用 TCP 协议。
  4. 设置套接字参数:通过 setsockopt() 函数设置套接字的相关参数。例如,可以使用 SO_REUSEADDR 参数允许重用地址和端口。
  5. 绑定套接字到特定的IP地址和端口:使用 bind() 函数将套接字绑定到指定的 IP 地址和端口。
  6. 监听连接请求:调用 listen() 函数开始监听连接请求。
  7. 接受连接:使用 accept() 函数接受客户端的连接请求,并返回一个新的套接字。
  8. 检查特定端口是否打开:使用 getpeername() 函数获取连接的对方套接字地址,并通过比较端口号来判断特定端口是否打开。
  9. 关闭套接字:使用 closesocket() 函数关闭套接字。

下面是一个示例代码,用于在 Windows 上使用 C++ 检查特定打开的 TCP 端口:

代码语言:txt
复制
#include <winsock2.h>
#include <ws2tcpip.h>
#include <iostream>

#pragma comment(lib, "ws2_32.lib")

int main() {
    WSADATA wsaData;
    if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {
        std::cerr << "Failed to initialize Winsock" << std::endl;
        return -1;
    }

    // 创建套接字
    SOCKET listenSocket = socket(AF_INET, SOCK_STREAM, 0);
    if (listenSocket == INVALID_SOCKET) {
        std::cerr << "Failed to create socket" << std::endl;
        WSACleanup();
        return -1;
    }

    // 设置套接字参数
    int reuseAddr = 1;
    if (setsockopt(listenSocket, SOL_SOCKET, SO_REUSEADDR, (const char*)&reuseAddr, sizeof(reuseAddr)) == SOCKET_ERROR) {
        std::cerr << "Failed to set socket option" << std::endl;
        closesocket(listenSocket);
        WSACleanup();
        return -1;
    }

    // 绑定套接字到指定的IP地址和端口
    sockaddr_in serverAddr{};
    serverAddr.sin_family = AF_INET;
    serverAddr.sin_addr.s_addr = INADDR_ANY;
    serverAddr.sin_port = htons(8080);
    if (bind(listenSocket, (struct sockaddr*)&serverAddr, sizeof(serverAddr)) == SOCKET_ERROR) {
        std::cerr << "Failed to bind socket" << std::endl;
        closesocket(listenSocket);
        WSACleanup();
        return -1;
    }

    // 监听连接请求
    if (listen(listenSocket, SOMAXCONN) == SOCKET_ERROR) {
        std::cerr << "Failed to listen" << std::endl;
        closesocket(listenSocket);
        WSACleanup();
        return -1;
    }

    // 接受连接
    SOCKET clientSocket = accept(listenSocket, nullptr, nullptr);
    if (clientSocket == INVALID_SOCKET) {
        std::cerr << "Failed to accept client connection" << std::endl;
        closesocket(listenSocket);
        WSACleanup();
        return -1;
    }

    // 检查特定端口是否打开
    sockaddr_in clientAddr{};
    int addrLen = sizeof(clientAddr);
    if (getpeername(clientSocket, (struct sockaddr*)&clientAddr, &addrLen) == SOCKET_ERROR) {
        std::cerr << "Failed to get peer name" << std::endl;
    } else {
        int port = ntohs(clientAddr.sin_port);
        std::cout << "Port " << port << " is open" << std::endl;
    }

    // 关闭套接字
    closesocket(clientSocket);
    closesocket(listenSocket);
    WSACleanup();

    return 0;
}

该示例代码用于检查本地 TCP 端口 8080 是否已打开。通过调用 bind() 函数,将套接字绑定到指定的 IP 地址和端口。然后使用 listen() 函数开始监听连接请求,并使用 accept() 函数接受客户端的连接请求。最后,通过 getpeername() 函数获取对方套接字的地址,并打印出端口号。

腾讯云相关产品和产品介绍链接地址:

请注意,上述示例代码仅用于演示目的,实际应用中可能还需要考虑错误处理、多线程等情况。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

CVE-2020-0796漏洞复现(RCE)

2020年3月10日,微软在其官方SRC发布了CVE-2020-0796的安全公告(ADV200005,MicrosoftGuidance for Disabling SMBv3 Compression),公告表示在Windows SMBv3版本的客户端和服务端存在远程代码执行漏洞。同时指出该漏洞存在于MicroSoft Server Message Block 3.1.1协议处理特定请求包的功能中,攻击者利用该漏洞可在目标SMB Server或者Client中执行任意代码。 该漏洞的后果十分接近永恒之蓝系列,都利用Windows SMB漏洞远程攻击获取系统最高权限,WannaCry勒索蠕虫就是利用永恒之蓝系列漏洞攻击工具制造的大灾难。除了直接攻击SMB服务端造成RCE外,该漏洞得亮点在于对SMB客户端的攻击,攻击者可以构造特定的网页,压缩包,共享目录,OFFICE文档等多种方式触发漏洞进行攻击。

02

Windows Redis DLL劫持在实战中的利用

举例: 例如,假设有一个应用程序叫做"example.exe",它依赖于名为"example.dll"的动态链接库。而"example.exe"在加载"example.dll"时没有使用绝对路径,而是仅仅指定了DLL的名称。攻击者可以将恶意的"example.dll"文件放置在与"example.exe"相同的目录下,当"example.exe"启动时,系统会先在当前目录中查找"example.dll"文件,如果找到,就会加载该文件并执行其中的恶意代码。 DLL劫持可以函数转发劫持也可以往完整DLL插入恶意代码,这里用的函数转发劫持,大致流程如下图所示: https://kiwings.github.io/2019/04/04/th-DLL%E5%8A%AB%E6%8C%81/ 2.2 劫持dbghelp.dll redis-server.exe在执行bgsave时,会先在应用‍目录查找dbghelp.dll,找不到再去system32目录下找: 而不管redis的权限是Administrator还是普通用户或者Network Service,它对自己的应用目录一定有写文件的权限,我们可以通过Redis的主从复制在应用目录里写入恶意DLL。 2.3 函数转发劫持 对DLL进行函数转发劫持需要导出原本DLL的函数和地址,以保证程序通过恶意DLL调用这些函数时不影响正常功能,DLL的导出函数一般比较多,用Aheadlib之类的工具可以自动化处理。 我这里用的是DLLHijacker,它会自动处理导出表并生成一个VS2019的项目,但这个python脚本有几个bug: https://github.com/kiwings/DLLHijacker (1) VS项目中文乱码: 修复:几个写文件的地方添加 encoding="utf-8"。 (2) 函数导出表有匿名函数的时候,会导致以下报错 [-]Error occur: 'NoneType' object has no attribute 'decode 修复:在几个for循环里添加函数名是否为空的判断可以解决这个问题。 (3) 生成C/C++代码时,没有使用目标DLL的绝对路径,只是用了DLL的名字填充LoadLibrary(),这是一个很严重的bug,会导致函数转发失败、Redis的功能受到影响从而只能劫持一次: 修复:我改成了根据输入的目标DLL路径自动填充。 如果没有使用原DLL的绝对路径,在Process Monitor可以看到,只会调用应用程序目录里的恶意DLL,并没有调用原本的system32下的dbghelp.dll: 从而redis的功能受到影响,导致redis的bgsave只能触发一次DLL调用,第二次bgsave的进程会被阻塞从而无法调用DLL,并且Redis关闭后将无法启动: 这也是网上部分师傅的文章写”不会影响redis运行 但会无法重启“的原因,因为他们也是用的DLLHijacker,并且没有发现有这个坑,这不仅会影响业务,而且只能劫持一次: 正常的DLL劫持不会影响程序的功能,可以劫持很多次,假如我第一次劫持想上线CS但是没有成功,那对面可能不出网,那我可能会再劫持打一个MSF的反向shell,都没成功我也可以继续尝试MSF盲打命令: 正常的DLL转发劫持如下,调用完应用程序目录里的恶意DLL后会调用原DLL: 0x03 漏洞利用 3.1 工具使用 工具下载地址: https://github.com/P4r4d1se/dll_hijack 如是是Windows 64位的Redis DLL劫持的话,可以直接用里面的VS2022版的dbghelp项目。 其他要用我修改后的DllHijacker.py和目标DLL路径生成VS项目: python3 DLLHijacker.py C:\Windows\System32\dbghelp.dll 下载安装VS2022,只用勾C++桌面开发: https://visualstudio.microsoft.com/zh-hans/downloads 打开生成目录里的sln文件,因为原本是VS2019的项目所以会提醒你升级,选确定,不然得另外安装v142的编译组件才能编译VS2019的项目: 打开后在源文件的dllmain.app,修改里面的shellocde就行,其他不用改: 3.2 出网——Cobalt Strike 如果Redis主机直接出网,或者能通其他已经上线CS的出网主机,那直接上CS是最好的选择,CS生成C语言的payload: 源文件的dllmain.app里把payload替换进去,然后选Release x64,生成——生成解决方案: 然后主从复制将dbghelp.dll写过去并bg

01
领券